对于相同名称和大小的数组,FFTW3 计划是否应该针对循环中的每次迭代而更改?

Should the FFTW3 plans change for each iteration in a loop for arrays of same names and sizes?

提问人:R2197 提问时间:8/7/2023 最后编辑:toyota SupraR2197 更新时间:8/7/2023 访问量:40

问:

我正在研究 FEAP8.4 (Fortran) 和库,我正在尝试对具有相同大小和名称的数组进行傅里叶变换。但这些是通过主程序的子程序调用的。主程序有一个时间循环。因此,对于每个时间步长,都会调用子程序,然后执行傅里叶变换。现在,我声明了计划和数组的所有必要变量,程序运行良好。FFTW3FFTW3

subroutine XYZ()
 implicit none

 integer*8 plan_r2c_p
 integer*8 N
 PARAMETER(N=8)
 real*8 psi(N), psiHat(N/2+1)

 call dfftw_plan_dft_r2c_1d(plan_r2c_p,N,psi,psiHat,FFTW_ESTIMATE)
 write(*,*) 'plan_r2c_p=',plan_r2c_p

psi 和 psiHat 只是 N 和 N/2+1 大小的数组。

当我编写这些整数“计划”的值时,它们在每次循环迭代中都会发生变化(尽管顺序相同)。但我的理解告诉我,对于相同大小和相同机器上的阵列,计划可以/应该保持不变。这是正确的吗?如果不是,它们为什么以及如何变化?FFTW3

这个问题背后的原因是,如果我单独声明它们并直接调用它们的值,而不是在子例程中调用创建计划的函数,我可能会节省一些计算工作。

Fortran FFTW

评论

1赞 PierU 8/7/2023
如果对大小相同(当然数据不同)的同一数组多次执行 FFT,则只需在迭代之前调用一次。dfftw_plan_dft_r2c_1d
1赞 Vladimir F Героям слава 8/7/2023
请注意,您使用的是旧的旧版 API。现代 API 使用 Fortran 2023 功能 fftw.org/doc/Calling-FFTW-from-Modern-Fortran.html 关键是只创建一次计划。制定计划需要花费大量时间,即使使用 .但关键是用标志制定一个计划,使其在执行时更有效率,并使用 or (fftw.org/doc/Plan-execution-in-Fortran.html) 多次执行。FFTW_ESTIMATEFFTW_MEASUREfftw_executefftw_execute_dft
0赞 R2197 8/7/2023
感谢 PierU 和 Vladimir 的评论。那么,说到最基本的一点,在其他地方运行一个简单的代码来为所需的数组创建计划,查看值并将其硬编码到这个主程序中是否有意义?
0赞 Vladimir F Героям слава 8/7/2023
不,一点也不。您看到的计划值只是一个句柄。它指向存储相当复杂的数据结构的某个地方。这个底层数据结构本身也不应该被存储,因为它本身包含指向其他结构的指针之类的东西。您应该始终在计算开始时使用计划例程创建计划,然后在执行例程中重用它。

答: 暂无答案