随着块大小的增加,我分析了阻塞矩阵乘法,分支指令的数量减少了。如在 Image1 盒装组中,有 450 万条分支指令,但在其他组中,大约有 1700 万条分支指令,这是在只有循环顺序发生变化的情况下。据我所知,分支指令取决于代码或其机器代码中使用的任何分支指令(条件或无条件),但我无法弄清楚循环重新排序如何改变分支量。尽管循环重排阻塞技术也会影响分支指令的数量。
操作系统是 linux x86_64 Ram 4G l1 cache 32k 64Byte line size L2 cache 2048k 64Byte line size 4-way associative。papi_library 的个人资料
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]
}
我的阻塞代码不在手边,但使用 1 级阻塞。
图 1(图表是对数比例的,可能所有组看起来都一样,但值是真的)
问题 :
1-为什么循环重新排序或阻塞会减少或增加分支指令的数量?
谢谢