这似乎是一个简单的问题,但cufft
使用对我来说不是很清楚。
我的问题是:以下哪个实现正确?
1)
// called in a loop
cufftPlan3d (plan1, x, y, z) ;
cufftexec (plan1, data1) ;
cufftexec (plan1, data2) ;
cufftexec (plan1, data3) ;
destroyplan(plan1)
2)
init() //called only one time in application
{
cufftPlan3d (plan1, x, y, z) ;
}
exec () //called many times with data changing size remains same
{
cufftexec (plan1, data1) ;
cufftexec (plan1, data2) ;
cufftexec (plan1, data3) ;
}
deinit() //called only one time in application
{
destroyplan(plan1)
}
3)
cufftPlan3d (plan1, x, y, z) ;
cufftexec (plan1, data1) ;
destroyplan(plan1)
cufftPlan3d (plan2, x, y, z) ;
cufftexec (plan2, data2) ;
destroyplan(plan2)
....
...
假设data1
,data2
和data3
的所有数据大小相同。请忽略语法的正确性。我只需要一个概念性的答案。
第三种实现对我来说看起来不正确......
答案 0 :(得分:3)
作为罗伯特答案的次要跟进,引用在CUFFT指南中指出重用cuFFT
计划的可能性可能是有用的:
CUFFT提供了一个简单的配置机制 一个预先配置内部构建块的计划,以便执行时间 对于给定配置和特定GPU,变换尽可能低 硬件选择。然后,当调用执行函数时,实际转换 按照执行计划进行。这种方法的优点是一次 用户创建计划,库保留执行计划所需的任何状态 多次没有重新计算配置。
答案 1 :(得分:2)
我认为所有3个都可以使用。方法2可能是最快的,只要计划适合data1,data2和data3中的每一个的数据。
您可以根据需要多次重复使用计划,只要您的转换意图不会发生变化。