Skip to content

Multithread the memory-bound level-1/2 operations (OpenMP)#943

Draft
jeffhammond wants to merge 1 commit into
flame:masterfrom
jeffhammond:feature/l1l2-threading
Draft

Multithread the memory-bound level-1/2 operations (OpenMP)#943
jeffhammond wants to merge 1 commit into
flame:masterfrom
jeffhammond:feature/l1l2-threading

Conversation

@jeffhammond

Copy link
Copy Markdown
Member

BLIS runs level-1 and level-2 single-threaded, so large vector/matrix-vector ops are capped at one core's memory bandwidth. Add optional OpenMP threading (opt-in via BLIS_ENABLE_L1_OPENMP) for the memory-bound ops:

  • level-1v: axpyv, dotv, scal2v, scalv/invscalv/setv, copyv/addv/subv (disjoint chunks; dotv uses a partial-sum-then-combine reduction);
  • util: asumv, and nrm2 (normfv) threaded while preserving its overflow-safe scaling via a LAPACK-style pairwise (scale,sumsq) combine;
  • level-2: gemv (both transposes -- row-parallel axpyf / output-parallel dotxf) and ger (both variants -- column/row parallel).

Only fires for large operands, when not already nested in a parallel region. Reduction combines are correct for real and complex types. Default builds (macro undefined) keep the original single-threaded behavior, so no regression. On a 10-core cluster this is a ~2-9x speedup for these ops (e.g. axpy 4->11, gemv 8->22 GFLOP/s, asum 15->90, nrm2 7->69 GB/s).

BLIS runs level-1 and level-2 single-threaded, so large vector/matrix-vector
ops are capped at one core's memory bandwidth. Add optional OpenMP threading
(opt-in via BLIS_ENABLE_L1_OPENMP) for the memory-bound ops:

  - level-1v: axpyv, dotv, scal2v, scalv/invscalv/setv, copyv/addv/subv
    (disjoint chunks; dotv uses a partial-sum-then-combine reduction);
  - util: asumv, and nrm2 (normfv) threaded while preserving its
    overflow-safe scaling via a LAPACK-style pairwise (scale,sumsq) combine;
  - level-2: gemv (both transposes -- row-parallel axpyf / output-parallel
    dotxf) and ger (both variants -- column/row parallel).

Only fires for large operands, when not already nested in a parallel region.
Reduction combines are correct for real and complex types. Default builds
(macro undefined) keep the original single-threaded behavior, so no
regression. On a 10-core cluster this is a ~2-9x speedup for these ops
(e.g. axpy 4->11, gemv 8->22 GFLOP/s, asum 15->90, nrm2 7->69 GB/s).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@jeffhammond
jeffhammond marked this pull request as draft July 16, 2026 15:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant