我有四个cufftHandles,我使用cufftPlanMany初始化每个(一起)。
我使用cufftGetSizeMany()估算每一个所需的内存。
假设s0是第一个的大小,s1是第二个的大小,依此类推
我使用这四个计划做fft和ifft,然后在最后我将所有这些计划一起销毁。
我的问题是,这四个计划所需的实际总内存是否等于
total_size = s0 + s1 + s2 + s3
,
或
total_size = max(s0, s1, s2, s3)
请注意我一次使用它们中的每一个,但我在开始时将它们全部计划在一起,并在最后将它们全部一起销毁。
答案 0 :(得分:2)
只有当该计划参与exec调用时,才需要计划所需的内存。
" 在计划执行期间,cuFFT需要一个工作区来临时存储中间结果......"
答案 1 :(得分:2)
我不同意其他答案(或至少在答案评论中对OP的解释)。
当然,执行计划时内存只需要 ,但是在创建计划时分配内存(默认情况下为自动分配模式)。
文档中有几个地方表明了这种行为,例如: here
函数cufftDestroy():释放与a关联的所有GPU资源 cuFFT计划并销毁内部计划数据结构。这个 一旦不再需要计划,应该调用函数,以避免 浪费GPU内存。
我还验证了(在分析器时间轴中)计划创建时只有内存分配,执行时没有分配。
如果您只想使用max(s0,s1,s2,s3)内存,则需要自行管理工作区。
cufftSetAutoAllocation(plan, false)
设置分配模式。cufftGetSize()
cufftSetWorkArea()
将所有计划指向具有最大大小的相同内存位置。