2

Matlabを使用したGPUでのfftと単純な追加の大きなパフォーマンスの違いについて疑問に思っています。fft は単純な追加よりも GPU で遅いと思います。しかし、なぜ逆なのでしょうか?助言がありますか?

a=rand(2.^20,1);
a=gpuArray(a);
b=gpuArray(0);
c=gpuArray(1);

tic % should take a long time
for k=1:1000
    fft(a);
end
toc % Elapsed time is 0.085893 seconds.

tic % should be fast, but isn't
for k=1:1000
    b=b+c;
end
toc %  Elapsed time is 1.430682 seconds.

また興味深いことに、ベクトル a の長さを短くすると、加算 (2 番目のループ) の計算時間が短縮されます。

編集

2 つのループの順序を変更すると、つまり加算が最初に行われると、加算に 1.4 秒ではなく 0.2 秒かかります。FFT 時間は同じです。

4

2 に答える 2

1

出力がどこにも使用されていないため、Matlab は実際には fft を実行していないと推測しています。また、単純な追加ループでは、各反復は前の反復に依存するため、連続して実行する必要があります。

ループの順序が重要な理由がわかりません。おそらく、最初のループの後に GPU メモリをクリーンアップすることと関係があります。ループ間で呼び出しpause(1)て、2 番目のループの前にコンピューターをアイドル状態に戻すことができます。これにより、タイミングがより一貫したものになる可能性があります。

于 2013-01-25T14:48:55.713 に答える
0

これを確認するためにGPUを備えた2012b MATLABを手元に持っていませんが、wait()コマンドが欠落していると思います。2012a で、MATLAB は非同期 GPU 計算を導入しました。そのため、GPU に何かを送信すると、処理が完了するまで待機せずにコードに進みます。これを試して:

mygpu=gpuDevice(1);

a=rand(2.^20,1);
a=gpuArray(a);
b=gpuArray(0);
c=gpuArray(1);

tic % should take a long time
for k=1:1000
    fft(a);
end
wait(mygpu); %Wait until the GPU has finished calculating before moving on
toc 

tic % should be fast
for k=1:1000
    b=b+c;
end
wait(mygpu); %Wait until the GPU has finished calculating before moving on
toc

加算の計算時間は、いつ実行されるかに依存しなくなります。確認して折り返しご連絡いただけますでしょうか。

于 2013-02-01T16:47:48.417 に答える