2013-10-12 19 views
9

我正在研究多核机器上并行算法的性能。我用循环重排序(ikj)技术做了矩阵乘法的实验。L2数据和指令缓存突然下降

串行执行结果如下图所示。对于nXn矩阵的所有大小,L1数据高速缓存命中循环顺序ikj和kij接近100%(图1框编号为1 & 2),正如您可以看到的循环顺序ikj的大小为2048和4096,突然L2数据的cach命中减少了50%(图2中的box number 1 & 2)也在L2指令缓存中命中也是如此。对于这两种尺寸的L1数据缓存命中的Incase类似于其他尺寸(256,512,1024)约为%100。我无法在指令和数据缓存命中中找到这种斜率的合理原因。任何人都可以告诉我如何找到原因?

你认为L2统一缓存对加剧问题有什么影响吗?但是,究竟是什么导致这种减少算法和性能的特点,我应该找到理由来描述。

实验机器是Intel E4500拥有2MB二级缓存,缓存行64,操作系统是Fedora的17 64用gcc -o 4.7没有编译器优化

摘编&完整的问题? 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* 

enter image description here

        *Image 2* 

enter image description here

        *Image 3* 

enter image description here

        *Image 4* 

enter image description here

        *Image 5* 

尽管存在上述问题,但kij算法的时序没有增加。但也比其他人快。 enter image description here

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] 
    } 

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] 
    } 

感谢

+0

这是不可能的,循环很容易放在L1指令缓存中,所以你永远不会看到L2指令命中百分比的下降。您的配置文件必须是borken,或者您正在测量线程的副作用太频繁。 –

+0

@hans How do you say循环将适合指令缓存?我也跑了并行版本它也有L1指令的变化也在L2指令中打到只有在ikj和kij算法中出现的盒子1和2发生了! – mjr

+0

我确实执行了一个阻塞级别的分析,但是这种变化还没有看到,因此我现在感到困惑! – mjr

回答

4

我敢打赌,这是因为的sup ER-对齐问题在以下几个问题的答案讨论:

我希望这是可以理解的,我不喜欢&粘贴从这些复制答案。

+0

谢谢@villekulla这是一个不错的尝试,也是不错的文章,但是我的问题是为什么突然减少大约50%发生在ikj&kij算法中,因为它在L2数据和指令高速缓存中都被装箱并编号为1和2,但在其他循环变体中没有,我应该提到前面提到的(ikj&kij)缓存在串行和并行版本中都没有时序问题,但由于他们访问数据的方式也很快,因为这些文章说的载入,存储和丢失较少。我添加了时序线图,如图5所示。 – mjr

+0

我应该补充一点,当我用ikj命令使用阻塞技术时,在任何阻塞因子(BF)或大小中都没有看到这种模式。尽管BF之间有明显的差异。 – mjr