C++ 针对缓存未命中openmp的循环平铺优化
我想知道是否有人可以帮助我以下循环平铺优化,以尽量减少缓存失误。我正在研究四个4000x4000浮点矩阵乘法 机器有三级缓存,其值为:L1 128kb、L2 1Mb和L3 8Mb 有四个嵌套循环,但不是完全嵌套的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<
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进行查找呢?