1

这似乎是一个简单的问题,但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的所有数据大小相同。请忽略语法的正确性。我只需要一个概念性的答案。data2data3

第三种实现对我来说看起来不正确......

4

2 回答 2

3

作为罗伯特回答的一个次要后续行动,引用cuFFTCUFFT 指南中指出重复使用计划的可能性可能很有用:

CUFFT 提供了一种称为计划的简单配置机制,该机制预先配置内部构建块,以便对于给定配置和所选特定 GPU 硬件,转换的执行时间尽可能短。然后,当调用执行函数时,实际的转换发生在执行计划之后。这种方法的优点是,一旦用户创建了计划,库就会保留多次执行计划所需的任何状态,而无需重新计算配置。

于 2013-09-25T10:50:38.563 回答
2

我认为这三个都可以工作。方法 2 可能最快,只要计划适合 data1、data2 和 data3 中的每一个的数据。

只要您的转换意图不变,您就可以根据需要多次重复使用计划。

于 2013-09-24T16:16:50.797 回答