Optimization CUDA:通过迭代过程优化延迟
我有一个迭代计算,每次迭代都需要一个傅里叶变换 在高层,它看起来是这样的:Optimization CUDA:通过迭代过程优化延迟,optimization,cuda,fft,latency,Optimization,Cuda,Fft,Latency,我有一个迭代计算,每次迭代都需要一个傅里叶变换 在高层,它看起来是这样的: // 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
// 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)也是在计算逐点最大值(0,f(x,y))之前进行处理的,因此确实有可能出现负值。关于FFT/IFFT,我认为您错误地假设CUFT例程在内部不使用共享内存。FFT计算的典型算法将整个FFT分割成适合一个线程块的较小的FFT,因此它们可能已经在内部利用了共享内存,请参见示例 关于每像素计算,共享内存通常用于使线程块内的线程相互协作。我的问题是:每像素的计算相互独立吗?如果是这样,可能不需要线程协作,也不需要共享内存,只使用寄存器来安排计算
无论如何,对于后一点,你应该提供更多关于你实际需要的信息(通过编辑你的原创文章)。您的代码是否与Gerchberg-Saxton算法的实现有关?您是说A和B在全局内存上?是的,主要是因为“cufft”库只允许在全局内存上操作。假设cufft调用(FFT\u 2D、Reverse\u FFT\u 2D)编写得很好,并且尽可能充分利用共享内存。这意味着您需要将注意力集中在一些每像素计算例程上。仅仅因为图像或其变换存储在全局内存中,并不意味着共享内存不能很好地使用。但是如果不知道你的每像素函数在做什么,就没有什么可以说的了。除非整个图像小于48K字节,否则您无法将其放入共享内存。您如何将0与复数进行比较?@BenMatok我已在上发表了一些关于您数学问题的评论。我希望他们会有所帮助。