2013-01-25 36 views
2

我想知道fft和GPU上使用Matlab的簡單加法之間的巨大性能差異。我預計GPU的fft比簡單的添加要慢。但爲什麼是相反的呢?有什麼建議麼?Matlab GPU性能fft與簡單加法

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. 

值得注意的是,如果我減少vetor的長度a,加法(第二循環)的計算時間會減少。

EDIT

如果我改變兩個環路的順序,即,如果除了首先進行,添加花費0.2秒代替1.4秒。 FFT時間仍然相同。

+0

在你的例子中,b和c是標量。這是故意的嗎? – Jonas

+0

哪個版本的MATLAB? – Edric

+0

我使用Matlab r2012b。 @Jonas,你是對的,它的意圖是b和ca是標量。主要的一點是,爲什麼標量增加會變慢。我試圖優化我的Matlab代碼,但它總是這種加法讓我的代碼變慢。 – user2010822

回答

1

我猜測Matlab實際上並沒有運行fft,因爲輸出沒有在任何地方使用。另外,在簡單的加法循環中,每次迭代都依賴於前一次迭代,因此它必須連續運行。

我不知道爲什麼循環的順序很重要。也許這與第一次循環之後清理GPU內存有關。您可以嘗試在循環之間調用pause(1)以讓您的計算機在第二次循環之前回到空閒狀態。這可能會讓你的時間更加一致。

+0

如果我寫g = fft(a)而不是fft(a),它不會改變任何事情。 fft要快得多。 – user2010822

+0

但是g並沒有在任何地方使用,所以它仍然可以被優化掉。如果你運行s = 0,會怎樣?對於k = 1:1000,s = s + fft(a); end'? – shoelzer

+0

好的,你說得對。它被優化了。謝謝。但我仍然想知道這個補充。即使FFT被去掉了,爲什麼加法的計算時間取決於它是在FFT還是在FFT之後執行? – user2010822

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 

加法的計算時間不應該取決於它的執行時間。請介意檢查並回復我嗎?

+0

我檢查了你的代碼。第一個循環大約需要1.2秒,而第二個循環(加法)只需要0.2秒(在MATLAB2012b上)。 – user2010822