[解決済み】なぜMATLABは行列の乗算が速いのか?
2022-04-21 19:51:53
質問
CUDA、C++、C#、Javaでいくつかのベンチマークを作り、検証や行列生成にMATLABを使用しています。 MATLABで行列の乗算を行うと。
2048x2048
や、もっと大きな行列もほとんど瞬時に掛け合わせることができます。
1024x1024 2048x2048 4096x4096
--------- --------- ---------
CUDA C (ms) 43.11 391.05 3407.99
C++ (ms) 6137.10 64369.29 551390.93
C# (ms) 10509.00 300684.00 2527250.00
Java (ms) 9149.90 92562.28 838357.94
MATLAB (ms) 75.01 423.10 3133.90
CUDAだけは競争力がありますが、少なくともC++は60倍も遅くはなく、ある程度近い数字になるのではないかと思いました。また、C#の結果については、どう考えていいのかわかりません。アルゴリズムはC++やJavaと同じなのに、大きく跳ね上がっている
2048
から
1024
.
MATLABはどのようにして行列の乗算を高速に実行しているのですか?
C++のコードです。
float temp = 0;
timer.start();
for(int j = 0; j < rozmer; j++)
{
for (int k = 0; k < rozmer; k++)
{
temp = 0;
for (int m = 0; m < rozmer; m++)
{
temp = temp + matice1[j][m] * matice2[m][k];
}
matice3[j][k] = temp;
}
}
timer.stop();
解決方法は?
以下は、MATLAB R2011a +を使用した結果です。 並列計算ツールボックス をTesla C2070搭載のマシンで実行しました。
>> A = rand(1024); gA = gpuArray(A);
% warm up by executing the operations a couple of times, and then:
>> tic, C = A * A; toc
Elapsed time is 0.075396 seconds.
>> tic, gC = gA * gA; toc
Elapsed time is 0.008621 seconds.
MATLABは行列の乗算に高度に最適化されたライブラリを使用しており、これがMATLABのプレーンな行列の乗算が非常に高速である理由です。そのため
gpuArray
バージョンでは
マグマ
.
R2014a を用いたアップデート
を Tesla K20c を搭載したマシンで実行し、新しい
timeit
と
gputimeit
関数を使用します。
>> A = rand(1024); gA = gpuArray(A);
>> timeit(@()A*A)
ans =
0.0324
>> gputimeit(@()gA*gA)
ans =
0.0022
R2018b を使用したアップデート 物理コア16個、Tesla V100を搭載したWIN64マシンにて。
>> timeit(@()A*A)
ans =
0.0229
>> gputimeit(@()gA*gA)
ans =
4.8019e-04
(注:ある時点(正確にはいつかは忘れました)で
gpuArray
MAGMA から cuBLAS に切り替えた - MAGMA は今でも一部で使われている
gpuArray
の操作)
関連
-
[解決済み] B "の印刷が "#"の印刷より劇的に遅いのはなぜですか?
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] 0.1fを0にすると、なぜ10倍もパフォーマンスが落ちるのですか?
-
[解決済み】再帰と反復のどちらを選ぶ?
-
[解決済み】インターネット接続が遅い場合のシミュレーション【終了しました
-
[解決済み] Scalaのlazy valの(隠れた)代償は何なのか?
-
[解決済み] x86アセンブリでレジスタをゼロに設定するには、xor、mov、andのどれが一番良い方法ですか?
-
[解決済み】2次元の点がポリゴン内にあるかどうかを判断するにはどうしたらいいですか?
-
[解決済み] あなたが見た中で最も馬鹿げたペシミゼーションは何ですか?[閉店]
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] HadoopのMapreduceジョブでJVMを再利用する。
-
[解決済み] nの漸近成長でfloor(n/2)を選択する。
-
[解決済み】ウェブサイトのストレステストに最適な方法【重複あり
-
[解決済み】インターネット接続が遅い場合のシミュレーション【終了しました
-
[解決済み】GHCコアの読み込み
-
[解決済み】なぜMATLABは行列の乗算が速いのか?
-
[解決済み] t-sqlのクエリ実行にかかる時間の測定
-
[解決済み] SSLはどれくらいのオーバーヘッドを発生させるのですか?
-
[解決済み] x86アセンブリでレジスタをゼロに設定するには、xor、mov、andのどれが一番良い方法ですか?
-
[解決済み] あなたが見た中で最も馬鹿げたペシミゼーションは何ですか?[閉店]