Intel Xeon Phi的动态内存变慢

时间:2014-10-23 15:38:37

标签: c++ performance matrix xeon-phi

我正在创建一个简单的矩阵乘法程序,在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秒)。

任何帮助都是赞成的!

2 个答案:

答案 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)),当您触摸内存时,您将导致操作系统出现故障。故障处理总是很昂贵。在协处理器上相对更昂贵,因为从单线程性能角度来看,你只需在一个小小的核心上运行。