【发布时间】:2014-10-23 15:38:36
【问题描述】:
我正在创建一个简单的矩阵乘法程序,在英特尔至强融核架构上运行。程序如下所示(参数为 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.55 秒,而在其他情况下大约需要 0.25 秒。在不同的架构(英特尔至强 E5)上,也会出现减速,但几乎不明显(大约 0.002 秒)。
感谢任何帮助!
【问题讨论】:
-
所有这些数组的大小是多少?也许它不适合所有缓存或跨越缓存行或其他什么?您是否尝试过切换两个外部循环?
-
另外,
registerstorage specifier 已被弃用。 -
如果你想进行快速矩阵乘法,你真的想得到 BLAS 库而不是自己编写代码(提示:朴素算法并不是最快的方法!)。我确信英特尔有一款针对 Xeon Phi 进行了高度调整。
-
@JoachimPileborg,每行 2048 个字节(每个浮点数 4 个字节,512 个元素)。谢谢,我不知道
register已被弃用。一般来说,它不适合缓存(即 32K l1、512k L2),但是看起来很奇怪的是两种不同矩阵存储之间的巨大行为差异。 @IraBaxter,谢谢,但我需要自己按顺序编写代码,因为它只是评估待实现并行解决方案性能的“草图”。 -
您的“待实现”并行解决方案应与现有的最佳实现进行比较。将它们与相对于现代架构组织得很差的算法进行比较可能表明您可以比简单的解决方案更快地编写代码,但您不会因此而获得布朗尼积分。
标签: c++ performance matrix xeon-phi