gpt4 book ai didi

c - 用 C 和 OpenMP 进行矩阵乘法

转载 作者:太空宇宙 更新时间:2023-11-04 06:05:52 24 4
gpt4 key购买 nike

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

最佳答案

如果可以的话,BLAS 是最好的方法。

话虽如此,从根本上说,矩阵乘法受到复杂性的限制,因此您必须更聪明才能大幅缩短时间。矩阵是否以任何方式构造?他们是tridiagonalbanded ?他们是triangularsymmetric

关于c - 用 C 和 OpenMP 进行矩阵乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10735658/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com