1. ホーム
  2. performance

[解決済み】なぜ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 を搭載したマシンで実行し、新しい timeitgputimeit 関数を使用します。

>> 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 の操作)