2013-02-16 11 views
6

私は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の方が速いはずです。

誰かが私にこれらの問題を解決するのに手伝ってもらえますか? :)

+0

これは、krylov部分空間法ではなくダイレクトソルバーを使用している場合とは異なりますが、ベンチマークの対象となるvienaclサイトには興味深い情報があります。これを見てみると:http://viennacl.sourceforge.net/viennacl-benchmarks.htmlあなたは、ほとんどすべての状況で、CPUがより小さな行列のGPUよりも速いことに気付くでしょうが、これは部分的には反復ソルバーですが、同様の影響を及ぼす可能性が高い「PCI-Expressレイテンシに起因する避けがたいGPUカーネルの起動オーバーヘッド」の結果と同じです。 – johnish

+0

@ johnishこのケースでは、PCI-Expressのレイテンシにより、GPUのカーネル起動のオーバーヘッドに起因する時間が長いことがわかりません。同じサイズの行列の場合、GPUでの行列乗算は0.000505sであるため、このオーバーヘッドは<0.000505sであり、mldivideは4.775395sであると結論づけます。私は、あなたが観察したように、この場合、レイテンシは処理時間によって完全にマスクされ、「小さな」マトリックスのCPUよりも長くなる可能性があると結論づけます。最近まで、Accelereyes Jacketはこのような仕事にはいい仕事をしましたが、今はMatlabに組み込まれているようです。 – JackOLantern

答えて

4

Matlabがソリューションをどのように計算するのかをお読みください。なぜGPUが遅いのかを理解するのに役立ちます。

私は少しの言葉でそれを語ります。

Aが* X = BはL *(U * X = Y)= Bとなる、L * Uは

  1. だからMATLABがLになる= * Uは、(このプロセスは、完全に並列に行うことができない 私が知っている限り、いくつかのステップは の性質のために並行して実行できます)
  2. MatlabはL * y = Bを解き、yを求めます。 (各ステップは前のデータを必要とするため、 は並列処理できません)
  3. MatlabはU * x = yを解いてxを求めます。

(各ステップは、前のデータを必要とするこのプロセスは 並列に行うことができない)だから、GPUクロックがCPUよりも遅い、そしてプロセスは並列に行うことができないので、CPUが高速です。そして、いい方法を考えてみないと(幸運です!)、非常に特殊な場合を除いてGPUは常に遅くなります。

+0

「mldivide」(少なくともCPUバージョンでは)は、入力マトリックスのプロパティに応じて異なる実行パスを持つことに注意してください。しかし、一般的な非対称非三角形の正方行列の場合、LU分解は実際に使用されます。http://www.mathworks.com/support/solutions/en/data/1-172BD/index.html?product=ML&solution= 1-172BD – Amro

1

説明の第1部はuser2230360からの回答ですが、あなたの質問は2倍であるため、乗算について少し説明します。

すでに指摘したように、LU分解は、いくつかのステップが可能であってもあまり簡単には並列化されません。しかし、行列の乗算は非常に並列化が可能です。あなたがこれらのことに取り組んでいるなら、手作業で行列の乗算を行うことができるはずです。そして、A * B = Cで行列Cの要素を計算することは、あなたが望む任意の順序で行うことができます。並列計算のために。これはおそらく、稲妻の高速乗算を見ているのですが、線形システムをゆっくりと解決する理由です。 1つは "他のものと同じように"並列化することはできません。

関連する問題