我目前正在研究一个试图计算矩阵乘法的C程序。我已经通过循环遍历第二个矩阵的每一列来完成这个任务,如下所示。
我将大小设置为1000。
for(i=0;i<size;i++) { for(j=0;j<size;j++) { for(k=0;k<size;k++) { matC[i][j]+=matA[i][k]*matB[k][j]; } } }
我想知道在这个实现中有什么问题的访问模式..什么使行/列访问比另一个更有效? 我试图从使用Caches的逻辑方面理解这一点。请帮助我理解这一点。 非常感谢您的帮助 :)
如果您正在谈论使用Caches,那么您可能想要做一些称为循环平铺的事情。 你将循环分解为tile,这样循环的内部部分就会存储在缓存中(这些天很大)。 所以你的循环将变成类似的东西(如果你使用指针将矩阵传递给函数)
for(j=0;j
t的值取决于您获得的加速。 它可以t = 64,128,256等等。 您可以在此处使用许多其他技术。 循环平铺只是一种有效利用缓存的技术。此外,您可以在发送到乘法函数之前转置B矩阵。 这样你就可以获得矩阵B元素的线性访问。为了解释你更多考虑
A -------- and B | | | | -------- | | | | -------- | | | | -------- | | | |
在这里,您将始终考虑将A的第一行与B.的第一列相乘。因为您使用C
我相信,CPU需要额外的努力来在内存中逐个读取矩阵B的所有列。 为了简化这些工作,您可以转置矩阵并获取矩阵B'
的行(基本上只是B
列),并使用循环切片来缓存乘法的最大元素数量。希望这会有所帮助。
以上就是c/c++开发分享行主要与列主要矩阵乘法相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/562662.html