Skip to content

VORTEXM4: SYRK/SYR2K diagonal blocks are expensive with GEMM_UNROLL_MN 64 #6148

Open

Description

@tesch1

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions