2013-01-05 72 views
0

我有一個迭代計算,每次迭代都需要傅里葉變換。CUDA:優化因迭代過程造成的延遲

在較高水平,它看起來是這樣的:

// executed in host , calling functions that run on the device 
B = image 
L = 100 
while(L--) { 
    A = FFT_2D(B) 
    A = SOME_PER_PIXEL_CALCULATION(A) 
    B = INVERSE_FFT_2D(A) 
    B = SOME_PER_PIXEL_CALCULATION(B) 
} 

我使用「CUFFT」庫做變換。

現在的問題是,我始終與全球內存的工作,

基本上,如果有做一些共享內存的工作這將是巨大的一種方式,

,但它似乎像使用由於只能從主機調用「cufft」庫函數,並且將輸入和輸出存儲在全局內存中,FFT不會允許我繞過此操作。

我該如何解決這個問題?

謝謝。


編輯:

由於存在數據相關性。看起來我不能做太多但優化'每像素'的計算...

瓶頸仍然是由於內核通過全局內存傳遞數據的事實,在這種情況下似乎不可避免。

所以基本上,我必須做轉換和反轉的事實是讓我不能共享中間計算數據。

目前我正在探索在頻率空間中進行大部分計算的方法。 (更多的數學問題)

因此,如果給定F {f(x,y)},F {max(0,f(x,y))} {approximate


編輯:

注意,F(X,y)是在時域中,因此實值,

F(X,Y)也計算逐點最大值之前被處理(0,f(x,y)),所以確實可能出現negetiv值。

+0

你是說A和B在全局內存? –

+0

是的,主要是因爲「cufft」庫只允許在全局內存上運行。 – BenMatok

+2

假設調用cufft(FFT_2D,INVERSE_FFT_2D)編寫得很好,並儘可能地充分利用共享內存。這意味着您希望將注意力集中在SOME_PER_PIXEL_CALCULATION例程上。僅僅因爲圖像或它的變換存儲在全局內存中並不意味着共享內存不能用於良好的效果。但不知道你的每像素功能在做什麼,沒有什麼可以說的。無論如何,您將無法將整個圖像放在共享內存中,除非它小於約48K字節。 –

回答

1

關於FFT/IFFT,我認爲你錯誤地認爲CUFFT例程不在內部使用共享內存。用於FFT計算的典型算法將整個FFT分成適合一個線程塊的較小FFT,因此它們可能已經在內部利用共享內存,例如參見paper

關於PER_PIXEL_CALCULATIONS,共享內存通常用於使線程塊內的線程相互協作。我的問題是:PER_PIXEL_CALCULATIONS是否相互獨立?如果是這樣,可能不需要線程協作,也不需要共享內存,並只使用寄存器來安排計算。

無論如何,要更具體地說明後一點,您應該提供更多關於您實際需要的信息(通過編輯原始帖子)。您的代碼是否與Gerchberg-Saxton算法的實現相關?