【发布时间】:2012-12-19 17:18:27
【问题描述】:
我有一个迭代计算,每次迭代都涉及傅里叶变换。
在高层次上是这样的:
// 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)也是在计算pointwise max(0,f(x,y))之前处理的,所以确实有可能出现负值。
【问题讨论】:
-
你是说A和B在全局内存上?
-
是的,主要是因为“cufft”库只允许对全局内存进行操作。
-
假设 cufft 调用 (FFT_2D, INVERSE_FFT_2D) 编写良好,如果可能,将充分利用共享内存。这意味着您希望将注意力集中在 SOME_PER_PIXEL_CALCULATION 例程上。仅仅因为图像或它的变换存储在全局内存中并不意味着共享内存不能用于良好的效果。但是在不知道您的每像素函数在做什么的情况下,没有什么可以说的。无论如何,除非它小于大约 48K 字节,否则您将无法将整个图像放入共享内存中。
-
你如何比较 0 和复数?
-
@BenMatok 我已经在link 上发布了一些关于您的数学问题的cmets。我希望他们会有所帮助。
标签: optimization cuda fft latency