6

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 機能を何らかの方法で有効にする必要がありますか? または、このような小さな行列でより良いパフォーマンスを期待するべきではありませんか?

非常に高く評価、

バスティアン

4

2 に答える 2

5

Apple WWDC2010 のプレゼンテーションでは、Accelerate は 3x3 マトリックス操作でもスピードアップするはずであると述べているため、4x4 ではわずかな改善が見られるはずだと思いました。しかし、考慮する必要があるのは、Accelerate と NEON は整数演算を大幅に高速化するように設計されていますが、必ずしも浮動小数点演算を高速化するわけではないということです。CPU プロセッサについて言及していませんでした。Accelerate は、CPU に応じて、浮動小数点演算に NEON または VFP を使用するようです。32 ビット float 演算に NEON 命令を使用すると高速に実行されますが、32 ビット float または 64 ビット double 演算に VFP を使用すると、非常に遅くなります (VFP は実際には SIMD ではないため)。そのため、Accelerate で 32 ビット float 操作を使用していることを確認し、VFP の代わりに NEON を使用していることを確認する必要があります。

もう 1 つの問題は、たとえ NEON を使用したとしても、C コンパイラが単純な C 関数が NEON 命令を使用しない場合よりも高速な NEON コードを生成するという保証がないことです。GCC などの C コンパイラはしばしばひどい SIMD コードを生成し、実行速度が遅くなる可能性があるためです。標準コードより。そのため、生成されたコードの速度をテストし、場合によっては生成されたアセンブリ コードを手動で調べて、コンパイラが悪いコードを生成したかどうかを確認することが常に重要です。

于 2010-11-01T15:23:16.847 に答える
4

BLAS および LAPACK ライブラリは、私が考える「中規模から大規模な行列」(1 辺に数万から数万) で使用するように設計されています。小さい行列に対しては正しい結果が得られますが、パフォーマンスはそれほど良くありません。

これにはいくつかの理由があります。

  • 最高のパフォーマンスを実現するには、3x3 および 4x4 行列演算をライブラリではなくインライン化する必要があります。実行する作業がほとんどない場合、関数呼び出しのオーバーヘッドが大きすぎて克服できません。
  • 最高のパフォーマンスを実現するには、まったく異なる一連のインターフェイスが必要です。行列乗算の BLAS インターフェースは、変数を使用して、計算に関係する行列のサイズと主次元を指定します。行列とストレージ レイアウトを転置するかどうかは言うまでもありません。これらのパラメーターはすべて、ライブラリを強力にし、大きな行列のパフォーマンスを損なうことはありません。ただし、4x4 の計算を行っていると判断し終わる頃には、4x4 の行列演算専用の関数だけが終了しています。

これが意味すること: 専用の小さな行列演算を提供したい場合は、bugreport.apple.com にアクセスして、この機能を要求するバグを報告してください。

于 2011-03-04T18:16:34.380 に答える