私はA * x = Bを計算しています。ここでAは行列、Bはベクトルです。Matlab + CUDA行列ベクトル方程式の解きが遅いA * x = B
ハードウェアスペック: インテル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上の)ランド(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倍遅くなっています。ところで、最初の2回の試行でGPUがさらに遅くなるのはなぜですか?それは最初に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の後の計算GPUは罪の計算には非常に高速です。
なぜ、GPUは行列の乗算や三角法で非常に高速ですが、行列の分割やfftなどの計算が遅いのはなぜですか?問題は実際にはそうであってはいけません... MatlabはGPUのオーバーラップ関数(mldivide、fft)をリリースしているので、これらの計算ではGPUの方が速いはずです。
誰かが私にこれらの問題を解決するのに手伝ってもらえますか? :)
これは、krylov部分空間法ではなくダイレクトソルバーを使用している場合とは異なりますが、ベンチマークの対象となるvienaclサイトには興味深い情報があります。これを見てみると:http://viennacl.sourceforge.net/viennacl-benchmarks.htmlあなたは、ほとんどすべての状況で、CPUがより小さな行列のGPUよりも速いことに気付くでしょうが、これは部分的には反復ソルバーですが、同様の影響を及ぼす可能性が高い「PCI-Expressレイテンシに起因する避けがたいGPUカーネルの起動オーバーヘッド」の結果と同じです。 – johnish
@ johnishこのケースでは、PCI-Expressのレイテンシにより、GPUのカーネル起動のオーバーヘッドに起因する時間が長いことがわかりません。同じサイズの行列の場合、GPUでの行列乗算は0.000505sであるため、このオーバーヘッドは<0.000505sであり、mldivideは4.775395sであると結論づけます。私は、あなたが観察したように、この場合、レイテンシは処理時間によって完全にマスクされ、「小さな」マトリックスのCPUよりも長くなる可能性があると結論づけます。最近まで、Accelereyes Jacketはこのような仕事にはいい仕事をしましたが、今はMatlabに組み込まれているようです。 – JackOLantern