我正在尝试创建一种有效的算法,可以将具有双精度的大值矩阵相乘。我已经创建了算法并首先在小矩阵上对其进行了测试;在尝试 ie 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];}
}
}