iOS 4 で利用可能になった Accelerate フレームワークを調べています。具体的には、C の線形代数ライブラリで Cblas ルーチンを使用しようと試みましたが、これらの関数を使用して私に与えることができません。非常に基本的なルーチンよりもパフォーマンスが向上します。具体的には、4x4 行列乗算の場合です。行列のアフィンまたは同次のプロパティを使用できなかった場合は常に、次のルーチンを使用してきました (要約):
float *mat4SetMat4Mult(const float *m0, const float *m1, float *target) {
target[0] = m0[0] * m1[0] + m0[4] * m1[1] + m0[8] * m1[2] + m0[12] * m1[3];
target[1] = ...etc...
...
target[15] = m0[3] * m1[12] + m0[7] * m1[13] + m0[11] * m1[14] + m0[15] * m1[15];
return target;
}
Cblas の同等の関数呼び出しは次のとおりです。
cblas_sgemm(CblasColMajor, CblasNoTrans, CblasNoTrans,
4, 4, 4, 1.f, m0, 4, m1, 4, 0.f, target, 4);
2 つを比較すると、乱数で満たされた多数の事前計算された行列を実行することにより (各関数は毎回まったく同じ入力を取得します)、C の clock() 関数でタイミングを合わせると、Cblas ルーチンの実行速度は約 4 倍遅くなります。 .
これは私には正しくないように思われ、どこかで何か間違ったことをしているような気がします。デバイスの NEON ユニットと SIMD 機能を何らかの方法で有効にする必要がありますか? または、このような小さな行列でより良いパフォーマンスを期待するべきではありませんか?
非常に高く評価、
バスティアン