袖套的内存要求

Memory requirements for cufft

我有四个 cufftHandles,我使用 cufftPlanMany 来初始化它们中的每一个(一起)。
我正在使用 cufftGetSizeMany() 来估计每一个所需的内存。
假设 s0 是​​第一个的大小,s1 是第二个的大小,依此类推。
我使用这四个计划进行 fft 和 ifft,最后我将它们全部销毁。

我的问题是,这四个计划所需的实际总内存是否等于

total_size = s0 + s1 + s2 + s3,

total_size = max(s0, s1, s2, s3)

请注意,我是一个一个使用的,但是我一开始就一起计划,最后一起销毁。

计划所需的内存仅在该计划参与 exec 调用时才需要。

备注the documentation here

"执行计划时,cuFFT需要一个工作区用于暂存中间结果..."

我不同意其他答案(或者至少不同意 OP 在对答案的评论中的解释)。

当然只有在执行计划时需要内存,但是在创建计划时分配内存(在默认的自动分配模式)。

文档中有几个地方指出了这种行为,例如here

Function cufftDestroy(): Frees all GPU resources associated with a cuFFT plan and destroys the internal plan data structure. This function should be called once a plan is no longer needed, to avoid wasting GPU memory.

我还验证了(在探查器时间轴中)计划创建时只有内存分配,执行时没有分配。


解决方案

如果您只想使用 max(s0,s1,s2,s3) 内存,您需要自己管理工作区。

  • 您需要在创建计划前用cufftSetAutoAllocation(plan, false)设置分配模式。
  • 然后,创建计划后,您可以为每个计划cufftGetSize()获得所需的内存大小
  • 并使用 cufftSetWorkArea() 将所有计划指向具有最大大小的相同内存位置。