我有一个迭代计算,每次迭代都需要傅里叶变换。
在高级别看起来像这样:
// 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”库来进行转换。
现在的问题是我一直在处理全局记忆,
基本上如果有一种方法可以使用共享内存完成某些工作,那就很棒了,
但似乎使用FFT不允许我绕过这个,因为“cufft”库函数只能从主机调用,并将输入和输出存储在全局内存中。
我应该如何解决这个问题?
感谢。
编辑:
因为存在数据依赖性。看起来我做不了多少但是优化了“每像素”计算...
瓶颈仍然是由于内核通过全局内存传递数据这一事实。在这种情况下这似乎是不可避免的。
所以基本上我必须进行变换的事实是反过来使我无法共享中间计算数据。
目前我正在探索在频率空间中进行大部分计算的方法。 (更多数学问题)
所有人都对如何给定F {f(x,y)} approximate F {max(0,f(x,y))}有一个好主意吗?
编辑:
请注意,f(x,y)位于时域中,因此是实数值,
f(x,y)也是在计算逐点最大值(0,f(x,y))之前处理的,因此确实可能出现negetiv值。
答案 0 :(得分:1)
关于FFT / IFFT,我认为您错误地认为CUFFT例程不在内部使用共享内存。用于FFT计算的典型算法将整个FFT分成适合一个线程块的较小FFT,因此它们可能已在内部利用共享内存,例如参见paper。
关于PER_PIXEL_CALCULATIONS,共享内存通常用于使线程块内的线程相互协作。我的问题是:PER_PIXEL_CALCULATIONS是否相互独立?如果是这样,也许不需要线程协作,您也不需要共享内存,只使用寄存器来安排计算。
无论如何,要更具体地说明后一点,您应该提供更多关于您实际需要的信息(通过编辑您的原始帖子)。您的代码是否与Gerchberg-Saxton算法的实现相关?