我有一个作业需要编写一个函数,该函数使用缓存块(每个维度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)];
}
}
}
}
}
}
}