行主要VS列主要矩阵乘法(Row major vs Column Major Matrix Mult

2019-08-01 08:50发布

我目前工作的一个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];
    }
  }
}

我想知道有问题的访问模式是在此实现。什么让行/列的访问比其他更有效? 我想明白这一点从使用缓存的逻辑上。请帮助我理解这一点。 非常感谢您的帮助 :)

Answer 1:

如果你在谈论使用缓存,那么你可能需要做一些所谓的循环平铺。 你打破循环成瓦片使得环的内侧部分被存储在内部缓存(这是相当大的,这些天)。 所以,你的循环会变成类似(如果你传递矩阵转换成使用指针的函数)

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元素这帮助的最高金额。



文章来源: Row major vs Column Major Matrix Multiplication