出于好奇,我决定将自己的矩阵乘法函数与BLAS实现进行基准测试……我对结果并不感到惊讶:
自定义实施,1000 x1000矩阵乘法的10个试验:
Took: 15.76542 seconds.
BLAS实施,10次1000x1000矩阵乘法试验:
Took: 1.32432 seconds.
这是使用单精度浮点数。
我的实现:
template<class ValT>
void mmult(const ValT* A, int ADim1, int ADim2, const ValT* B, int BDim1, int BDim2, ValT* C)
{
if ( ADim2!=BDim1 )
throw std::runtime_error("Error sizes off");
memset((void*)C,0,sizeof(ValT)*ADim1*BDim2);
int cc2,cc1,cr1;
for ( cc2=0 ; cc2<BDim2 ; ++cc2 )
for ( cc1=0 ; cc1<ADim2 ; ++cc1 )
for ( cr1=0 ; cr1<ADim1 ; ++cr1 )
C[cc2*ADim2+cr1] += A[cc1*ADim1+cr1]*B[cc2*BDim1+cc1];
}
我有两个问题:
- 假设矩阵矩阵乘法说:nxm * mxn需要n * n * m乘法,所以在1000 ^ 3或1e9以上的运算中。BLAS 2.6Ghz处理器如何在1.32秒内执行10 * 1e9操作?即使乘法是单个操作,并且没有其他任何事情要做,它也需要大约4秒钟。
- 为什么我的执行速度这么慢?