我正在创建一个简单的矩阵乘法程序,在Intel Xeon Phi架构上运行。程序看起来像这样(参数是A,B,C),时间不包括初始化:
//start timing
for(int i = 0; i < size; i++){
for(int k = 0; k < size; k++) {
register TYPE aik = A[i][k];
for(int j = 0; j < size; j++) {
C[i][j] += aik * B[k][j];
}
}
}
//end timing
我正在使用限制,对齐数据等。然而,如果使用动态存储器(posix_memalign)分配矩阵,则计算导致严重减速,即对于TYPE = float和512x512矩阵在动态情况下需要~0.55s而在另一种情况下需要~0.25。在不同的架构(英特尔至强E5)上,也有一个减速,但几乎没有注意到(约0.002秒)。
任何帮助都是赞成的!
答案 0 :(得分:1)
如果使矩阵的大小不同,时序差异会发生什么变化? (例如513x513)
我问的原因是我认为你可能会看到这种影响,因为超过缓存方式的关联性,并且当你在循环中通过k循环时,从L2中驱逐C [i] []的元素。如果B和C对齐且大小为2的幂,则可能会导致缓存超级对齐导致此问题。
如果B和C在堆栈上或没有对齐,则不会看到此效果,因为较少的地址是2对齐的幂。
答案 1 :(得分:0)
在&#34;非动态&#34; case,数组只是全局变量吗?如果是这样,它们最终会进入BSS,当加载ELF时,操作系统会默认将它们初始化为零 - 这就是BSS的工作原理。如果动态分配它们,与您使用的方法无关(即malloc,new,posix_memalign,异常是mmap(MAP_POPULATE)),当您触摸内存时,您将导致操作系统出现故障。故障处理总是很昂贵。在协处理器上相对更昂贵,因为从单线程性能角度来看,你只需在一个小小的核心上运行。