Из любопытства я решил измерить свою собственную функцию умножения матрицы по сравнению с реализацией BLAS... Я должен был сказать наименее удивленный результат:
Пользовательская реализация, 10 испытаний 1000x1000 умножение матрицы:
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 операций. Как можно на моем 2.6Ghz процессоре для BLAS выполнять 10 * 1e9 операций за 1,32 секунды? Даже если множественность была единственной операцией, и ничего больше не было сделано, она должна занять около 4 секунд.
- Почему моя реализация намного медленнее?