0

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

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

total_size = s0 + s1 + s2 + s3,

或者

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

请注意,我一次使用它们中的每一个,但我在开始时将它们全部计划在一起,并在最后将它们全部销毁。

4

2 回答 2

2

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

请注意此处的文档

在计划执行期间,cuFFT 需要一个工作区来临时存储中间结果……”

于 2016-06-23T16:28:15.423 回答
2

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

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

文档中有几个地方表明了这种行为,例如这里

函数 cufftDestroy():释放所有与 cuFFT 计划相关的 GPU 资源,并销毁内部计划数据结构。一旦不再需要计划,应调用此函数,以避免浪费 GPU 内存。

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


解决方案

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

  • 您需要cufftSetAutoAllocation(plan, false)在创建计划之前设置分配模式。
  • 然后,在创建计划后,您可以获得cufftGetSize()每个计划所需的内存大小
  • 并用于cufftSetWorkArea()将所有计划指向具有最大大小的相同内存位置。
于 2016-06-24T08:00:08.983 回答