袖口的内存要求

时间:2016-06-23 16:03:13

标签: cuda cufft

我有四个cufftHandles,我使用cufftPlanMany初始化每个(一起)。
我使用cufftGetSizeMany()估算每一个所需的内存。
 假设s0是第一个的大小,s1是第二个的大小,依此类推 我使用这四个计划做fft和ifft,然后在最后我将所有这些计划一起销毁。

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

total_size = s0 + s1 + s2 + s3

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

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

2 个答案:

答案 0 :(得分:2)

只有当该计划参与exec调用时,才需要计划所需的内存。

注意the documentation here

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

答案 1 :(得分:2)

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

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

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

  

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

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

解决方案

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

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