6

方程式 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 はこれらすべての計算で高速になるはずです。

誰かがこれらの問題を解決するのを手伝ってくれませんか? :)

4

2 に答える 2

4

Matlab がどのように解を計算するかを読んでください。GPU が遅い理由を理解するのに役立ちます。

短い言葉で言ってみます。

A*x=b は L*(U*x=y)=b になり、L*U=A

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

つまり GPU クロックは CPU よりも遅く、処理を並列に実行できないため、CPU の方が高速です。いいえ、より良い方法を考え出さない限り (頑張ってください!)、非常に特殊な場合を除いて、GPU は常に遅くなります。

于 2013-04-14T23:03:47.657 に答える
1

説明のパート 1 は user2230360 からの回答にありますが、質問が 2 つあるので、乗算について少し追加します。

すでに述べたように、LU 因数分解は、いくつかのステップを並列化できたとしても、それほど簡単には並列化できません。ただし、行列の乗算は非常に並列化可能です。これらのことを扱っている場合、手動で行列の乗算を行うことができるはずです.A * B = Cの行列Cの要素の計算は、任意の順序で実行できることがわかります-したがって、可能性並列計算用。これがおそらく、電光石火のように高速な乗算を目にしているのに、線形システムの解法が遅い理由です。一方を「他方ほど」並列化することはできません。

于 2014-01-22T08:59:53.437 に答える