ベクトル x と多数のベクトル y_i の内積を計算するための私の最善の策は何ですか。x と y_i の長さは 10k 程度です。
- y をマトリックスに押し込み、最適化された
s/dgemv
ルーチンを使用しますか? - または、SSE2 ソリューションをハンドコーディングしてみてください (cpuinfo によると、私は SSE3 を持っていません)。
ここでは一般的なガイダンスを探しているだけなので、どんな提案も役に立ちます。
はい、私にはパフォーマンスが必要です。光をありがとう。
ベクトル x と多数のベクトル y_i の内積を計算するための私の最善の策は何ですか。x と y_i の長さは 10k 程度です。
s/dgemv
ルーチンを使用しますか? ここでは一般的なガイダンスを探しているだけなので、どんな提案も役に立ちます。
はい、私にはパフォーマンスが必要です。光をありがとう。
最適化されたBLASルーチンの代替:
以下は、SSE を使用した BLAS レベル 1 (ベクトル操作) ルーチンを提供します。
http://www.applied-mathematics.net/miniSSEL1BLAS/miniSSEL1BLAS.html
nVidia グラフィック カードをお持ちの場合は、グラフィック カードで操作を実行する cuBLAS を入手できます。
http://developer.nvidia.com/cublas
ATI (AMD) グラフィックカードの場合
http://developer.amd.com/libraries/appmathlibs/pages/default.aspx
SSE2 ソリューションのハンドコーディングはそれほど難しくなく、純粋な C ルーチンよりも大幅に高速化されます。これが BLAS ルーチンにどの程度影響するかは、ユーザーが決定する必要があります。
最大のスピードアップは、データを構造化してフォーマットにすることで得られるため、データの並列処理と配置を活用できます。
GotoBLASを使用しています。これは、高パフォーマンスのカーネル ルーチンです。MKL や BLAS より何倍も優れています。