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;
}
놀랍게도 (적어도 나를 위해) 위의 코드는 매트릭스를 곱하는 데 두 배의 시간이 걸렸습니다! 나는 double 대신 단일 정밀도를 사용하여 시도했다. 왜냐하면 CPU의 워드 크기 (32 비트 부동 소수점 대 32 비트 ARM의 64 비트 double)와 관련된 것이었지만 성능이 향상되지는 않았다.
내가 뭘 잘못하고 있니? 순진한 구현보다 눈에 띄는 성능 향상을 위해 253x7 매트릭스가 너무 작습니까?
[MGMatrix] (https://github.com/ghenania/MGMatrix)를 보면, 정확히 필요한 것입니다. 이것은 vDSP를 기반으로하며 매우 간단한 인터페이스를 제안합니다. –