【发布时间】:2012-05-30 22:17:44
【问题描述】:
我正在尝试创建一种有效的算法,该算法可以将具有双精度的大值矩阵相乘。我已经创建了算法并首先在小矩阵上对其进行了测试;尝试后即 A{4096x4096}, B{4096x4096} 循环需要永远结束;例如,这两个矩阵生成 AB 花了我的电脑 30 多分钟才能完成。
我的电脑不是老旧的……它是六核 i7,我想对于桌面工作站来说还不错。在尺寸高达 1024x1024 的小矩阵上,它的完成速度相对较快,不到 30-40 秒,对于 2048x2048 大约需要 5 分钟……对于 16384x16384,它没有在 15 分钟内完成,我停止了执行……
我做错了什么还是可以预料到的? :)
提前致谢!
代码如下:
/* calculate */
for(travx = 0; travx < m; travx++) {
for(travy = 0; travy < n; travy++) {
/* we only need to calculate it ourside of Z loop */
tIndex = (travy)+(travx*n);
for(travz = 0; travz < p; travz++)
{
if(n==1)
{bIndex = ((n-1)*travy)+travz;
aIndex = ((p)*travx)+travz;}
else
{bIndex = ((n)*travz)+travy;
aIndex = ((p)*travx)+travz;}
temp = atab_ptr[aIndex]*btab_ptr[bIndex];
outtab_ptr[tIndex] = outtab_ptr[tIndex] + temp;
}
}
}
这真的很简单......并且在小矩阵上给出了很好的结果......不知道如何在 10 秒内将双打相乘,尤其是在 p4 上......听起来有点可疑......特别是如果你考虑到 O (3) 问题的复杂性。
更新...根据反馈我调整了代码并且...嗯,主要是我对其进行了简化,小矩阵完成得更快,即 1024x1024 在 3 秒内完成,但 4096x4096 在 6 秒内完成分钟...修改后的代码是这样的:
for(travx = 0; travx < m; travx++) {
for(travy = 0; travy < n; travy++) {
for(travz = 0; travz < p; travz++)
{outtab_ptr[travy+travx*n] = outtab_ptr[travy+travx*n] + atab_ptr[travy+p*travz] * btab_ptr[travz+travx*p];}
}
}
【问题讨论】:
-
我可以在不到 10 秒的时间内在 Pentium @3.2GHz 的一个内核上将两个 4096² 矩阵相乘,所以是的,你可能做错了什么。
-
你的问题陈述真的很模糊......哪个算法?多少时间(“快速”、“永远”不是数字)?单线程?
-
你应该发布一些代码,或者解释你正在使用哪个库(如果有的话)。
-
我不明白为什么你在内部循环中有一个条件。那只会更糟(特别是如果它没有明确的目的)。仅供参考,为了好奇,我用简单的实现做了一个快速测试,乘以 1024x1024 矩阵需要 7 秒。所以,你的代码肯定不能很好地工作......
-
我刚刚在 python 中使用 numpy 编写了一个测试,对于 Core i7 的单核上的 4096x4096 案例需要 10.3 秒。所以是的,你有很大的代码效率问题,@betabandido 指出的可能是原因。该代码中有大量冗余 IOP。
标签: c performance matrix matrix-multiplication