【发布时间】:2017-11-06 14:08:15
【问题描述】:
这是我的加速矩阵乘法的代码,但它只比简单的快 5%。 我能做些什么来尽可能地提高它?
*这些表被访问例如:C[sub2ind(i,j,n)] 用于 C[i, j] 位置。 p>
void matrixMultFast(float * const C, /* output matrix */
float const * const A, /* first matrix */
float const * const B, /* second matrix */
int const n, /* number of rows/cols */
int const ib, /* size of i block */
int const jb, /* size of j block */
int const kb) /* size of k block */
{
int i=0, j=0, jj=0, k=0, kk=0;
float sum;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
C[sub2ind(i,j,n)]=0;
for(kk=0;kk<n;kk+=kb)
{
for(jj=0;jj<n;jj+=jb)
{
for(i=0;i<n;i++)
{
for(j=jj;j<jj+jb;j++)
{
sum=C[sub2ind(i,j,n)];
for(k=kk;k<kk+kb;k++)
sum += A[sub2ind(i,k,n)]*B[sub2ind(k,j,n)];
C[sub2ind(i,j,n)]=sum;
}
}
}
}
} // end function 'matrixMultFast4'
*C语言编写,需要支持C99
【问题讨论】:
-
您可以使用 SIMD 扩展来加快速度。
-
有一些很好的软件可以为您执行此操作,称为 BLAS(基本线性代数子程序),您正在寻找的例程称为 DGEMM(但还有很多其他针对特定的优化类型的矩阵乘法)。 GotoBLAS、OpenBLAS、英特尔的 MKL、AMD 的 ACML 等等。如果你真的想加速你自己的版本,你需要使用矢量化和并行化。
-
转置您的输入之一,以便您可以访问一个矩阵的行和另一个矩阵的列作为连续内存。您的
B[sub2ind(k,j,n)]是问题所在,因为它在内部循环的每次迭代中都跨越n,给您带来糟糕的缓存访问局部性。如果你解决了这个问题,那么你尝试缓存阻塞可能会有很大帮助。另外,只需使用memset将C[]归零即可。
标签: c matrix matrix-multiplication c99