袖套的内存要求
Memory requirements for cufft
我有四个 cufftHandles,我使用 cufftPlanMany 来初始化它们中的每一个(一起)。
我正在使用 cufftGetSizeMany() 来估计每一个所需的内存。
假设 s0 是第一个的大小,s1 是第二个的大小,依此类推。
我使用这四个计划进行 fft 和 ifft,最后我将它们全部销毁。
我的问题是,这四个计划所需的实际总内存是否等于
total_size = s0 + s1 + s2 + s3
,
或
total_size = max(s0, s1, s2, s3)
请注意,我是一个一个使用的,但是我一开始就一起计划,最后一起销毁。
计划所需的内存仅在该计划参与 exec 调用时才需要。
"执行计划时,cuFFT需要一个工作区用于暂存中间结果..."
我不同意其他答案(或者至少不同意 OP 在对答案的评论中的解释)。
当然只有在执行计划时需要内存,但是在创建计划时分配内存(在默认的自动分配模式)。
文档中有几个地方指出了这种行为,例如here
Function cufftDestroy(): Frees all GPU resources associated with a
cuFFT plan and destroys the internal plan data structure. This
function should be called once a plan is no longer needed, to avoid
wasting GPU memory.
我还验证了(在探查器时间轴中)计划创建时只有内存分配,执行时没有分配。
解决方案
如果您只想使用 max(s0,s1,s2,s3) 内存,您需要自己管理工作区。
- 您需要在创建计划前用
cufftSetAutoAllocation(plan, false)
设置分配模式。
- 然后,创建计划后,您可以为每个计划
cufftGetSize()
获得所需的内存大小
- 并使用
cufftSetWorkArea()
将所有计划指向具有最大大小的相同内存位置。
我有四个 cufftHandles,我使用 cufftPlanMany 来初始化它们中的每一个(一起)。
我正在使用 cufftGetSizeMany() 来估计每一个所需的内存。
假设 s0 是第一个的大小,s1 是第二个的大小,依此类推。
我使用这四个计划进行 fft 和 ifft,最后我将它们全部销毁。
我的问题是,这四个计划所需的实际总内存是否等于
total_size = s0 + s1 + s2 + s3
,
或
total_size = max(s0, s1, s2, s3)
请注意,我是一个一个使用的,但是我一开始就一起计划,最后一起销毁。
计划所需的内存仅在该计划参与 exec 调用时才需要。
"执行计划时,cuFFT需要一个工作区用于暂存中间结果..."
我不同意其他答案(或者至少不同意 OP 在对答案的评论中的解释)。
当然只有在执行计划时需要内存,但是在创建计划时分配内存(在默认的自动分配模式)。
文档中有几个地方指出了这种行为,例如here
Function cufftDestroy(): Frees all GPU resources associated with a cuFFT plan and destroys the internal plan data structure. This function should be called once a plan is no longer needed, to avoid wasting GPU memory.
我还验证了(在探查器时间轴中)计划创建时只有内存分配,执行时没有分配。
解决方案
如果您只想使用 max(s0,s1,s2,s3) 内存,您需要自己管理工作区。
- 您需要在创建计划前用
cufftSetAutoAllocation(plan, false)
设置分配模式。 - 然后,创建计划后,您可以为每个计划
cufftGetSize()
获得所需的内存大小 - 并使用
cufftSetWorkArea()
将所有计划指向具有最大大小的相同内存位置。