Cuda cufft的内存要求
我有四个CufftHandle,我使用cufftPlanMany(一起)初始化它们中的每一个。Cuda cufft的内存要求,cuda,cufft,Cuda,Cufft,我有四个CufftHandle,我使用cufftPlanMany(一起)初始化它们中的每一个。 我正在使用cufftGetSizeMany()来估计它们中每一个所需的内存。 假设s0是第一个的大小,s1是第二个的大小,依此类推。 我使用这四种方案进行fft和ifft,最后我将它们全部销毁 我的问题是,这四个计划所需的实际总内存是否等于 总尺寸=s0+s1+s2+s3 或 请注意,我一次使用它们中的每一个,但我在开始时将它们全部计划在一起,并在结束时将它们全部销毁。计划所需的内存仅在该计划参与ex
我正在使用cufftGetSizeMany()来估计它们中每一个所需的内存。
假设s0是第一个的大小,s1是第二个的大小,依此类推。
我使用这四种方案进行fft和ifft,最后我将它们全部销毁 我的问题是,这四个计划所需的实际总内存是否等于
总尺寸=s0+s1+s2+s3
或
请注意,我一次使用它们中的每一个,但我在开始时将它们全部计划在一起,并在结束时将它们全部销毁。计划所需的内存仅在该计划参与exec调用时才需要 注:
“在计划执行期间,cuFFT需要一个工作区来临时存储中间结果……”只有当计划参与exec调用时,才需要计划所需的内存 注:
“在计划执行过程中,cuFFT需要一个工作区来临时存储中间结果……”我不同意另一个答案(或者至少不同意对答案评论中OP的解释) 当然,只有在执行计划时才需要内存,但是在创建计划时分配内存(默认为自动分配模式) 文件中有几个地方表明了这种行为,例如 函数cufftDestroy():释放与 cuFFT计划并破坏内部计划数据结构。这 一旦不再需要计划,就应该调用函数,以避免 浪费GPU内存 我还验证了(在探查器时间线中)在创建计划时只有内存分配,在执行时没有分配
解决方案 如果只想使用max(s0、s1、s2、s3)内存,则需要自己管理工作区
- 在创建计划之前,您需要使用
设置分配模式cufftsetatoallocation(plan,false)
- 然后,在创建计划后,可以使用
为每个计划获取所需的内存大小cufftGetSize()
- 并使用
将所有计划指向具有最大大小的相同内存位置cufftSetWorkArea()
解决方案 如果只想使用max(s0、s1、s2、s3)内存,则需要自己管理工作区
- 在创建计划之前,您需要使用
设置分配模式cufftsetatoallocation(plan,false)
- 然后,在创建计划后,可以使用
为每个计划获取所需的内存大小cufftGetSize()
- 并使用
将所有计划指向具有最大大小的相同内存位置cufftSetWorkArea()
total_size = max(s0, s1, s2, s3)