我的矩阵乘法(缓存效率低下)怎么了?

时间:2019-02-03 01:39:29

标签: caching matrix multiplication

我的任务是在单个处理器上优化矩阵乘法。我试图编写代码以有效地处理块(平铺),但是仍然看到较差的结果。有什么建议吗?

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

顺便说一下,矩阵是按列为主的顺序。

0 个答案:

没有答案