MATLABが行列の乗算に使用するアルゴリズムとその時間の複雑さは誰にも分かりますか?MATLABの行列乗算時間の複雑さ
答えて
this threadに記載されているように、Matlabは(Basic Linear Algebra Subprograms)のDGEMM
(Double GEneral Matrix Multiplication)ルーチンを使用しています。
BLASの実装は1つではありません。特定のプロセッサアーキテクチャ用に調整されています。したがって、どのバージョンのBLASが使用中であるかを見出すことなく、あなたのマシンでどのアルゴリズムが使用されているかを絶対に確認することはできません。
BLASの仕様は、各サブルーチンの入力と出力を指定し、各サブルーチンの出力に許容可能なエラー境界を提供します。実装は、仕様に準拠している限り、好きなアルゴリズムを自由に使用できます。
BLASのリファレンス実装は、二つN X N行列を乗算する時間複雑性O(N^3)を有するDGEMM
でblock matrix multiplication algorithmを使用します。私は、BLASのほとんどの実装がリファレンス実装に多かれ少なかれ続くと仮定することは合理的だと思います。それは一般的に、全体の行列はlocal memoryに収まらない、これは単純な行列の乗算アルゴリズム
for i = 1:N
for j = 1:N
for k = 1:N
c(i,j) = c(i,j) + a(i,k) * b(k,j);
end
end
end
を使用していません
注意。データが常にローカルメモリに出入りする場合、アルゴリズムは遅くなります。ブロック行列アルゴリズムは、演算を小さなブロックに分割し、各ブロックはローカルメモリに収まるほど小さく、メモリへのシフトの回数を減らします。
O(N^3)よりもわずかに速い速度を有するStrassen algorithmまたはCoppersmith-Winograd algorithmは、例えば、漸近的に高速行列乗算アルゴリズムが存在します。しかし、一般的にはキャッシュを認識せず、局所性を無視します。つまり、データがメモリ内で絶えずシャントされる必要があるため、現代のアーキテクチャでは、アルゴリズム全体が最適化ブロック行列乗算アルゴリズムよりも実際には遅くなります。
ウィキペディアは、Strassenアルゴリズムは、数千を超える行列サイズに対して単一コアCPUのスピードアップを提供する可能性があると指摘していますが、スピードアップは約10%程度になる可能性があり、BLASの開発者はおそらく考慮しませんこの希少なケースでは価値があると言います(1996年のthis paperは、DGEMM
のnの約10%のスピード増加を約束しています。一方、Coppersmith-Winogradアルゴリズムは、「現代のハードウェアでは処理できないほど大きな行列に対してのみ利点があります」と述べています。
これは、Matlabが高速で高速な行列乗算を得るために、ナイーブで効率的なキャッシュ認識アルゴリズムを使用していることです。
この回答は、ナイーブなアルゴリズムと比較して、ブロック行列乗算アルゴリズムのローカリティを示すビデオを作成することで更新されました。次の動画のそれぞれにおいて
は、我々は製品C = X Bを作成するために、2つの8×8行列とBの乗算を視覚化しています。黄色の強調表示は、アルゴリズムの各ステップでどの行列のどの要素が処理されているかを示す。A,BおよびCブロック行列の乗算は、行列の小さなブロックで一度にどのように機能するかを確認し、それらのブロックを複数回再利用することで、データをローカルメモリに出し入れする回数を最小限に抑えることができます。
ニースの答え+1。厳密に言えば、2つのルーチンはO(n^3)になることができますが、一方は他のルーチンよりも少ない操作しか行うことができないため、「O(n^3)よりも少ない操作」という表現を変更しました。 –
ありがとう@ColinTBowers –
- 1. 行列の鎖の乗算の時間の複雑さ
- 2. MATLAB行列乗算は
- 3. 計算時間の複雑さ
- 4. モジュラー算術の時間複雑度
- 5. CUDAによる行列乗算、長い実行時間
- 6. 行列の乗算
- 7. 時間複雑度を計算する
- 8. コード中の計算時間の複雑さ
- 9. このコードの実行時間と空間の複雑さ
- 10. ソートを計算する時間の複雑さ
- 11. MATLAB:行列の要素ごとの乗算
- 12. MATLAB行列要素の賢明な乗算の最適化
- 13. OpenGLの行列の乗算
- 14. Matlab効率的な疎行列の乗算
- 15. 行列乗算プロローグ
- 16. 行列乗算フロート
- 17. 3by3行列乗算
- 18. MySQLの行列乗算
- 19. Cuda行列の乗算
- 20. 行列の乗算r
- 21. 行列の乗算CUDA
- 22. ハープープの行列乗算
- 23. Strassen行列の乗算ソースコード
- 24. 幾何行列の乗算
- 25. fun()の時間の複雑さ?
- 26. 入力のエンコーディング(時間の複雑さ)
- 27. Java並列行列乗算
- 28. 並列行列乗算
- 29. 時間の複雑さは、Python
- 30. 未分類配列のバイナリ検索の時間の複雑さ
この質問は[こちら](http://www.mathworks.com.au/matlabcentral/newsreader/view_thread 2009年にMatlabの中央に答えました。/242624)(具体的には、Tim Davisの2回目の回答を参照してください)。それ以来何か変わったかどうかは分かりません... –