You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
VORTEXM4: SYRK/SYR2K diagonal blocks are expensive with GEMM_UNROLL_MN 64 #6148
On VORTEXM4 (GEMM_UNROLL_M 64 since #6074), the generic SYRK/SYR2K driver spends much time on the diagonal blocks. driver/level3/syrk_kernel.c computes each GEMM_UNROLL_MN x GEMM_UNROLL_MN diagonal block (64 x 64 here) into a temporary buffer zeroed with GEMM_BETA and then adds one triangle into C. A sampling profile of SSYRK at n = 256, one thread, on an M4 Pro shows ssyrk_kernel_L plus sgemm_beta zero-fill at about 20% of the time, against under 10% for the SME2 compute (the rest is packing, see #6146).
Measured against Accelerate on the same machine (one thread): SSYRK 0.18x / 0.36x / 0.73x at n = 64 / 256 / 1024, 0.75-0.93x at 4096. trans = T is slower than trans = N (1074 vs 1370 GFLOPS at n = 1024).
Options:
compute the diagonal block directly into C with a masked store (the SME2 kernels can predicate rows and columns), which needs a per-target hook in the driver;
a smaller diagonal block for targets with a large GEMM_UNROLL_MN;
check why the trans = T path is slower (packing of A^T with sgemm_otcopy).
Activity