0

我有一个迭代计算,每次迭代都涉及傅立叶变换。

在高级情况下,它看起来像这样:

// 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)) 之前处理的,因此确实有可能出现负值。

4

1 回答 1

1

关于 FFT/IFFT,我认为您错误地假设 CUFFT 例程不在内部使用共享内存。FFT 计算的典型算法将整个 FFT 拆分为适合一个线程块的较小的算法,因此它们可能已经在内部利用共享内存,例如参见论文

关于 PER_PIXEL_CALCULATIONS,共享内存通常用于使线程块内的线程相互协作。我的问题是:PER_PIXEL_CALCULATIONS 是否相互独立?如果是这样,则可能不需要线程协作,您也不需要共享内存并仅使用寄存器来安排计算。

无论如何,要更具体地说明后一点,您应该提供有关您实际需要的更多信息(通过编辑原始帖子)。您的代码是否与 Gerchberg-Saxton 算法的实现有关?

于 2013-01-05T22:24:34.657 回答