Cuda cufft的内存要求

Cuda cufft的内存要求,cuda,cufft,Cuda,Cufft,我有四个CufftHandle,我使用cufftPlanMany(一起)初始化它们中的每一个。 我正在使用cufftGetSizeMany()来估计它们中每一个所需的内存。 假设s0是第一个的大小,s1是第二个的大小,依此类推。 我使用这四种方案进行fft和ifft,最后我将它们全部销毁 我的问题是,这四个计划所需的实际总内存是否等于 总尺寸=s0+s1+s2+s3 或 请注意,我一次使用它们中的每一个,但我在开始时将它们全部计划在一起,并在结束时将它们全部销毁。计划所需的内存仅在该计划参与ex

我有四个CufftHandle,我使用cufftPlanMany(一起)初始化它们中的每一个。
我正在使用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()
    将所有计划指向具有最大大小的相同内存位置

我不同意另一个答案(或者至少不同意答案评论中对OP的解释)

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

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

函数cufftDestroy():释放与 cuFFT计划并破坏内部计划数据结构。这 一旦不再需要计划,就应该调用函数,以避免 浪费GPU内存

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


解决方案 如果只想使用max(s0、s1、s2、s3)内存,则需要自己管理工作区

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

非常感谢@Robert。由于我的内存分配是在开始时为所有与cufft无关的内核完成的,所以只要我为cufft留出最大(s0、s1、s2、s3)字节,我就可以使用所有内存。再次非常感谢。非常感谢@Robert。由于我的内存分配是在开始时为所有与cufft无关的内核完成的,所以只要我为cufft留出最大(s0、s1、s2、s3)字节,我就可以使用所有内存。再次非常感谢。非常感谢你的回答。我知道如何使用cufftSetWorkArea()设置工作区,但首先如何创建此工作区?它是否只是一个指向使用cudamaloc分配的最大大小的设备内存的指针?非常感谢您的回答。我知道如何使用cufftSetWorkArea()设置工作区,但首先如何创建此工作区?它是否只是一个指向使用cudamaloc分配的最大大小的设备内存的指针?
total_size = max(s0, s1, s2, s3)