如何使用缓存阻塞来乘矩阵

时间:2019-06-18 17:34:02

标签: c caching matrix blocking

我有一个作业需要编写一个函数,该函数使用缓存块(每个维度n,m,l的块大小不同)和循环展开(矩阵A:nxl,矩阵B:lxm)乘以矩阵。乘法至少比普通矩阵乘法函数快三倍。

我尝试了一些我在网上找到的算法,但是没有一种算法可以减少时间,而且没有一种算法可以针对每个维度使用不同的块大小。

void matrixMultFast(float * const C,            /* output matrix [n x m] */
                    float const * const A,      /* first matrix  [n x l] */
                    float const * const B,      /* second matrix [l x m] */
                    int const n,
                    int const l,
                    int const m,
                    int const nb,               /* block on n*/
                    int const lb,               /* block on l*/
                    int const mb) {             /* block on m*/


  }

以及我为nxn和一维阻塞的较简单情况所尝试的方法

void matrixMultFast(float * const C,            /* output matrix [n x m] */
                    float const * const A,      /* first matrix  [n x l] */
                    float const * const B,      /* second matrix [l x m] */
                    int const n,
                    int const nb               /* block on n*/
                    )
{             /* block on m*/
    int i,ii,j,jj,k,kk;


    for (ii = 0; ii < n; ii+=nb)
    {
      for (jj = 0; jj < n; jj+=nb)
      {

        for (kk = 0; kk < n; kk+=nb)
        {

          for (i = ii; i < ii+nb; i++)
        {

            for (j = jj; j < jj+nb; j++)
            {
              for (k = kk; k < kk+nb; k++)
              {
                C[sub2ind(i,j,n)] += A[sub2ind(i,k,n)]*B[sub2ind(k,j,n)];
              }
            }
          }
        }
      }
    }
}

0 个答案:

没有答案