L2数据和指令缓存突然减少

mjr*_*mjr 9 c++ optimization performance

我正在研究多核机器上的并行算法的性能.我使用循环重新排序(ikj)技术进行了矩阵乘法的实验.

串行执行结果如下图所示.L1数据高速缓存命中循环次序ikj和kij所有大小的nXn矩阵接近100%(图1盒号1和2),你可以看到循环次序ikj的大小为2048和4096突然L2数据缓存命中减少%50(图2盒号1和2)也在L2指令缓存中命中同样如此.对于这2个大小的L1数据高速缓存命中的情况与其他大小(256,512,1024)大约是%100.在指令和数据缓存命中中,我找不到任何合理的斜率原因.任何人都可以告诉我如何找到原因?

你认为L2统一缓存对加剧问题有什么影响吗?但是仍然是什么导致这种减少算法和性能的特征应该我找到原因.

实验机是Intel e4500,带2Mb L2缓存,缓存行64,os是fedora 17 x64,带gcc 4.7 -o无编译器优化

简明扼要的完整问题? my problem is that why sudden decrease of about 50% in both L2 data and instruction cache happens in only ikj & kij algorithm as it's boxed and numbered 1 & 2 in images, but not in other loop variation

                                   *Image 1*
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

                                    *Image 2*
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

                                    *Image 3*
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

                                   *Image 4*
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

                                   *Image 5*
Run Code Online (Sandbox Code Playgroud)

尽管存在上述问题,但ikj&kij算法的时序没有增加.但也比其他人快. 在此输入图像描述

ikj和kij算法是循环重排序技术的两种变体/

kij算法

   For (k=0;k<n;k++)
    For(i=0;i<n;i++){
        r=A[i][k];
      For (j=0;j<n;j++)
          C[i][j]+=r*B[k][j] 
    }
Run Code Online (Sandbox Code Playgroud)

ikj算法

For (i=0;i<n;i++)
     For(k=0;k<n;k++){
      r=A[i][k];
      For (j=0;j<n;j++)
           C[i][j]+=r*B[k][j] 
    }   
Run Code Online (Sandbox Code Playgroud)

谢谢

vil*_*lla 4

我打赌发生这种情况是因为在回答以下问题时讨论了超级对齐问题:

我希望可以理解我不喜欢复制和粘贴这些答案。