我的任务是在单个处理器上优化矩阵乘法。我试图编写代码以有效地处理块(平铺),但是仍然看到较差的结果。有什么建议吗?
int min(int a, int b) {
return a < b ? a : b;
}
void square_gemm(int n, double* A, double *B, double *C) {
const int blockSize = 32;
for (int a = 0; a < n; a += blockSize) {
for (int b = 0; b < n; b += blockSize) {
double* loc = C + a + b*n;
for (int c = b; c < min(b + blockSize, n); c++) {
loc = C + c * n+a;
for (int d = a; d < min(a + blockSize, n); d++) {
double v = *loc;
double* x = A + d;
double* y = B + c*n;
for (int z = 0; z < n; z++) {
v += *x * *y;
x +=n;
y++;
}
*loc = v;
loc++;
}
}
}
}
}
大小:31 Mflop / s:2538.2百分比:5.92 大小:32 Mflop / s:2552.5百分比:5.95 大小:96 Mflop / s:2423.72百分比:5.65 大小:97 Mflop / s:2403.63百分比:5.60 大小:127 Mflop / s:2369.64百分比:5.52 大小:128 Mflop / s:2306.98百分比:5.38 大小:129 Mflop / s:2354.48百分比:5.49 大小:191 Mflop / s:2256.07百分比:5.26 大小:192 Mflop / s:2164.02百分比:5.04 大小:229 Mflop / s:2218.75百分比:5.17 大小:255 Mflop / s:2200.95百分比:5.13 大小:256 Mflop / s:1004.8百分比:2.34 大小:257 Mflop / s:2204.24百分比:5.14 大小:319 Mflop / s:2194.66百分比:5.12 大小:320 Mflop / s:1941.34百分比:4.53 大小:321 Mflop / s:2182.21百分比:5.09 大小:417 Mflop / s:2126.13百分比:4.96 大小:479 Mflop / s:2043.11百分比:4.76 大小:480 Mflop / s:1885.02百分比:4.39 大小:511 Mflop / s:2060.33百分比:4.80 大小:512 Mflop / s:978.162百分比:2.28 大小:639 Mflop / s:1883.58百分比:4.39 大小:640 Mflop / s:990.688百分比:2.31 大小:767 Mflop / s:1834.17百分比:4.28 大小:768 Mflop / s:991.239百分比:2.31 大小:769 Mflop / s:1827.9百分比:4.26 峰值的平均百分比= 4.65631 成绩= 6.98447
顺便说一下,矩阵是按列为主的顺序。