我正在为iPhone实施基于切线距离的OCR解决方案,该解决方案严重依赖于大小为253x7的浮点矩阵的快速乘法。对于概念验证,我已经实现了我自己的幼稚矩阵程序是这样的:iOS BLAS - 加速框架差矩阵乘法性能
Matrix operator*(const Matrix& matrix) const {
if(cols != matrix.rows) throw "cant multiply!";
Matrix result(rows, matrix.cols);
for(int i = 0; i < result.rows; i++){
for(int j = 0; j < result.cols; j++){
T tmp = 0;
for(int k = 0; k < cols; k++){
tmp += at(i,k) * matrix.at(k,j);
}
result.at(i,j) = tmp;
}
}
return result;
}
正如你所看到的,这是很基本的。 在PoC表现良好之后,我决定通过结合Accelerate Framework的矩阵乘法(推测使用SIMD和其他花哨的东西来完成繁重的工作......)来进一步提高性能极限:
Matrix operator*(const Matrix& m) const {
if(cols != m.rows) throw "cant multiply!";
Matrix result(rows,m.cols);
cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, rows, m.cols, cols, 1, matrix, cols, m.matrix, m.cols, 1, result.matrix, result.cols);
return result;
}
令人震惊的是(至少对我而言),上面的代码花了两倍的时间来乘以矩阵!我试过使用单精度而不是双精度,因为我怀疑它与CPU的字大小有关(32位浮点数与32位ARM上的64位双精度浮点数),但没有性能增益......
我在做什么错?我的253x7矩阵是否太小,以致于在天真实施方面显着提升性能?
看看[MGMatrix](https://github.com/ghenania/MGMatrix),它正是你需要的。它基于vDSP并提出了非常简单的界面。 –