標準の行列乗算アルゴリズムの効率をどのように改善できますか?標準行列乗算アルゴリズムの効率を改善しますか?
このアプローチに関わる主な操作は次のとおりです。C[i][j]+=A[i][p]*B[p][j]
アルゴリズムの効率を改善するために何ができますか?
標準の行列乗算アルゴリズムの効率をどのように改善できますか?標準行列乗算アルゴリズムの効率を改善しますか?
このアプローチに関わる主な操作は次のとおりです。C[i][j]+=A[i][p]*B[p][j]
アルゴリズムの効率を改善するために何ができますか?
あなたは、特にインテルが自分MKL hereを提供し、BLAS(基本線形代数サブルーチン)ライブラリを使用して見ているしたい場合があり、AMDは自分のACML hereを持っているし、(オープンソース)後藤BLAS hereもあります。
(稠密な)マトリックス - マトリックス乗算カーネルは、?GEMM
コールであり、?
は浮動小数点タイプを示します。たとえば、DGEMM
はdouble
ルーチンを呼び出します。
低レベルの最適化を行っていることがわかっていない限り、これらのライブラリはおそらく手作業でコード化できるものよりも優れたパフォーマンスを発揮します。これを自分自身のコーディングに行くにしたいならば
、あなたは以下の点を考慮することもできます。
SSE, SSE2..4
命令が広くサポートされていますが、より新しいバージョンのCPU
はAVX
命令もサポートします。高性能実装:
このリファレンスは、あなたに物事の現在の状態のアイデアを与えるかもしれません。
これが役に立ちます。
+1マトリックスが小さい場合、DGEMMは文字引数をチェックする時間を大幅に短縮することができます。これは汎用性を持たせるためです。したがって、小さな行列の場合は、手でコード化された単純な方法で実行時間を節約します。時々完全に展開されます。 –
この正確な質問に対処するGolub and Van Loanの第1章を読むことをお勧めします。
これらの方法を使用しても、パフォーマンスは向上しません。大幅な高速化が必要なチューニングがたくさんあります。マトリックスに素早く乗じる方法を考え出すためには、たくさんのお金があります。そのため、雑誌の記事が不足することはありません。
複数の行列乗算 - M1 x M2 x ... x Mn - については、別のボールゲームのような動的プログラミングに基づく別の最適化手法があります。これは、2つの行列の乗算効率を向上させるためには適用されないことに注意してください。ただし、3つ以上の行列をペアごとに掛け合わせると、さらに高いレベルで最適化することができます。ちょうど私は情報を丸めるためにヒープにこの答えを投げると思った。
まあ、そこにはStrassen's Algorithmがあります。これは、あなたのマトリックスのサイズにもよりますが、あなたがリストアップした標準アルゴリズムよりもわずかに速いです。もちろんeven faster algorithmsがありますが、実装が簡単ではありません。
標準アルゴリズムはO(N^3)である、 StrassenののアルゴはO(N^2.8)、 で、銅細工-ウィノグラードはO(N^2.3)
@xtremerです:行列のどのような?平方?ほぼ正方形ですか?両陣営の力?背が高くて痩せますか?スパース? – Mehrdad