【问题标题】:CUDA: optimize latency due to iterative processCUDA:由于迭代过程优化延迟
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-04-17
    • 1970-01-01
    • 2011-07-16
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多