方程式 A*x=B を計算しています。ここで、A は行列、B はベクトル、x は答え (未知の) ベクトルです。
ハードウェア仕様: Intel i7 3630QM (4 コア)、nVidia GeForce GT 640M (384 CUDA コア)
次に例を示します。
>> A=rand(5000);
>> B=rand(5000,1);
>> Agpu=gpuArray(A);
>> Bgpu=gpuArray(B);
>> tic;A\B;toc;
Elapsed time is 1.382281 seconds.
>> tic;Agpu\Bgpu;toc;
Elapsed time is 4.775395 seconds.
どういうわけか GPU はずっと遅いです...なぜですか? また、FFT、INV、LU の計算も遅くなります。これは、行列の除算に関連している必要があります。
ただし、GPU は行列乗算 (同じデータ) ではるかに高速です。
>> tic;A*B;toc;
Elapsed time is 0.014700 seconds.
>> tic;Agpu*Bgpu;toc;
Elapsed time is 0.000505 seconds.
主な問題は、GPU A\B (mldivide) が CPU に比べてなぜ遅いのかということです。
更新しました
A、B (CPU の場合)、AA、BB (GPU の場合) が rand(5000) の場合の結果を次に示します。
>> tic;fft(A);toc;
Elapsed time is *0.117189 *seconds.
>> tic;fft(AA);toc;
Elapsed time is 1.062969 seconds.
>> tic;fft(AA);toc;
Elapsed time is 0.542242 seconds.
>> tic;fft(AA);toc;
Elapsed time is *0.229773* seconds.
>> tic;fft(AA);toc;
太字の時間は安定した時間です。ただし、GPU はほぼ 2 倍遅くなります。ところで、GPU が最初の 2 回の試行でさらに遅いのはなぜですか? 最初に2回コンパイルされますか?
加えて:
>> tic;sin(A);toc;
Elapsed time is *0.121008* seconds.
>> tic;sin(AA);toc;
Elapsed time is 0.020448 seconds.
>> tic;sin(AA);toc;
Elapsed time is 0.157209 seconds.
>> tic;sin(AA);toc;
Elapsed time is *0.000419 *seconds
2 つの計算の後、sin 計算では GPU の方が信じられないほど高速です。
では、なぜ GPU は行列の乗算や三角法では速いのに、行列の除算や fft などの計算では遅いのでしょうか? 質問は実際にはそのようなものであってはなりません... Matlab が GPU 用のオーバーラップ関数 (mldivide、fft) をリリースしたため、GPU はこれらすべての計算で高速になるはずです。
誰かがこれらの問題を解決するのを手伝ってくれませんか? :)