【发布时间】:2019-01-20 17:34:40
【问题描述】:
我有一个如下所示的矩阵乘法:
void gemm_nn(int N, int K, float *A, float *B, float *C) {
int j, k;
for (k = 0; k < K; k++)
for (j = 0; j < N; j++)
C[j] += A[k] * B[k * N + j];
}
浮点数是单个的,4 字节,32 位。
我想用 armv8-a 64 位优化循环。
我可以在一个 128 位寄存器中加载 4 个连续的浮点数并执行一次乘加运算吗?
您能否指出我应该尝试实现这一目标的说明?
【问题讨论】:
-
B[k * N + j]位于最内层循环中,这使得缓存阻塞对于良好的性能是必要的。如果您的矩阵不是很小,并且您不想将另一个计算折叠到 matmul 中,请参阅How does BLAS get such extreme performance?,并考虑简单地使用优化的 BLAS 库函数或 Eigen。相关(以及更多指向 matmul 优化内容的链接):Matrix Multiplication of size 100*100 using SSE Intrinsics。连续浮点数的 SIMD 负载并不是困难的部分。