Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 针对缓存未命中openmp的循环平铺优化_C++_Loops_Caching_Optimization_Tiling - Fatal编程技术网

C++ 针对缓存未命中openmp的循环平铺优化

C++ 针对缓存未命中openmp的循环平铺优化,c++,loops,caching,optimization,tiling,C++,Loops,Caching,Optimization,Tiling,我想知道是否有人可以帮助我以下循环平铺优化,以尽量减少缓存失误。我正在研究四个4000x4000浮点矩阵乘法 机器有三级缓存,其值为:L1 128kb、L2 1Mb和L3 8Mb 有四个嵌套循环,但不是完全嵌套的 for(int i=0; i<NN; i++) { for (int j=0; j<NN; j++) { if (i != j){ thirdlayer = 0; for (int k=0; k<

我想知道是否有人可以帮助我以下循环平铺优化,以尽量减少缓存失误。我正在研究四个4000x4000浮点矩阵乘法

机器有三级缓存,其值为:L1 128kb、L2 1Mb和L3 8Mb

有四个嵌套循环,但不是完全嵌套的

for(int i=0; i<NN; i++) {
    for (int j=0; j<NN; j++) {
        if (i != j){
            thirdlayer = 0;
            for (int k=0; k<NN; k++) {
                fourthlayer = 0;
                for (int l=0; l<NN; l++) {
                    fourthlayer =  fourthlayer + V[j*NN+l]*V[NN+l]*J[k*NN+l];
                }
                thirdlayer = thirdlayer + V[k]*V[i*NN+k]*fourthlayer;
            }
            if(pi_cod[j] != 0)
                Transitions[i*NN +j] =  sqrt(pi_cod[i]*pi_cod[1]/(pi_cod[0]*pi_cod[j]))*Q[i*NN +j]*thirdlayer/Padt;
        }
    }
}

for(inti=0;它可能更适合codereview.stackexchange.com您正在做大量的冗余工作。
V[j*NN+l]*V[NN+l]
可以在外循环中进行计算,等等。我会首先考虑减少不必要的计算开销。@Anycorn可能不会,因为
V[j*NN+l]*V[NN+l]
似乎包含字母el,而不是第一个。@RiazRizvi它不依赖于i或k-可以按这种方式分解out@Anycorn哦,我明白了,
V[NN+l]
是从常量地址
&V+NN
进行的查找,那么为什么不将此地址存储在本地,然后使用偏移量l=0..NN-1进行查找呢?