我正在研究多核机器上并行算法的性能。我用循环重新排序(ikj)技术做了一个关于矩阵乘法的实验。
串行执行结果如下图所示。所有大小的 nXn 矩阵的循环顺序 ikj 和 kij 的 L1 数据缓存命中率接近 100%(图像 1 框编号 1 和 2),并且您可以看到大小为 2048 的循环顺序 ikj并且 4096 突然 L2 数据缓存命中减少了 %50(图 2 框编号 1 和 2),在 L2 指令缓存命中也是如此。如果这 2 个大小的 L1 数据缓存命中率与其他大小(256,512,1024)一样,则约为 %100。在指令和数据缓存命中中,我找不到任何合理的理由来解释这个斜率。任何人都可以告诉我如何找到原因吗?
你认为L2统一缓存对加剧问题有什么影响吗?但是仍然是什么导致了这种减少,我应该分析算法和性能的哪些特征来找到原因。
实验机器是 Intel e4500,带有 2Mb L2 缓存,缓存行 64,操作系统是 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*
*Image 2*
*Image 3*
*Image 4*
*Image 5*
尽管存在上述问题,但 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]
}
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]
}
谢谢