我有一個迭代計算,每次迭代都需要傅里葉變換。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值。
你是說A和B在全局內存? –
是的,主要是因爲「cufft」庫只允許在全局內存上運行。 – BenMatok
假設調用cufft(FFT_2D,INVERSE_FFT_2D)編寫得很好,並儘可能地充分利用共享內存。這意味着您希望將注意力集中在SOME_PER_PIXEL_CALCULATION例程上。僅僅因爲圖像或它的變換存儲在全局內存中並不意味着共享內存不能用於良好的效果。但不知道你的每像素功能在做什麼,沒有什麼可以說的。無論如何,您將無法將整個圖像放在共享內存中,除非它小於約48K字節。 –