我有一个迭代计算,每次迭代都涉及傅立叶变换。
在高级情况下,它看起来像这样:
// 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)} 的情况下近似F{max(0,f(x,y))} ?
编辑:
注意 f(x,y) 在时域中,因此是实值,
f(x,y) 也是在计算 pointwise max(0,f(x,y)) 之前处理的,因此确实有可能出现负值。