我目前工作的一个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];
}
}
}
我想知道有问题的访问模式是在此实现。什么让行/列的访问比其他更有效? 我想明白这一点从使用缓存的逻辑上。请帮助我理解这一点。 非常感谢您的帮助 :)
如果你在谈论使用缓存,那么你可能需要做一些所谓的循环平铺。 你打破循环成瓦片使得环的内侧部分被存储在内部缓存(这是相当大的,这些天)。 所以,你的循环会变成类似(如果你传递矩阵转换成使用指针的函数)
for(j=0;j<size;j+=t)
for(k=0;k<size;k+=t)
for(i=0;i<size;i+=t)
for(ii=i;ii<MIN(i+t,size);ii++)
for(jj=j;jj<MIN(j+t,size);jj++)
{
var=*(c+ii * size+jj); //Var is a scalar variable
for(kk=k;kk<MIN(k+t,size);kk++)
{
var = var + *(a+ii *size +kk) * *(bt +jj * size+ kk);
}
*(c+ii *size +jj) = var;
}
T的值取决于你得到的加速变化。 它可以T = 64128256等。 有迹象表明,你可以使用这里的许多其他技术。 环平铺的只是一次技术利用高速缓存efficiently.Further,您可以转置矩阵B发送到乘法功能之前。 这样,你会得到矩阵B的元素的线性访问解释你更多的考虑
A -------- and B | | | |
-------- | | | |
-------- | | | |
-------- | | | |
在这里,你会经常考虑,因为您使用的是乘以第一排与B.And的第一列C
我相信,CPU需要额外的努力,通过一个内部的存储器中的矩阵B中的一个的所有列阅读。 为了缓和这些努力,可以转置矩阵和获得矩阵的行B'
(这是什么,但列B
本质),并使用循环平铺缓存为multiplication.Hope元素这帮助的最高金额。