FFTW 3分段故障

时间:2014-06-10 00:24:12

标签: segmentation-fault fortran fftw

我在使用带有fortran的FFTW时遇到了一个故障的分段错误,而我却无法找出原因。在线搜索也没有运气。这是我的代码:

 integer, parameter :: Nx=128, Ny=Nx, Nz=Nx
 integer, parameter :: NORM=Nx*Ny*Nz,Ntop=MAX(Nx,Ny,Nz)/2, LX1=Nx/2+1
 double precision, parameter :: Etot=0.5
 double complex, dimension(LX1,Ny,Nz) :: fbx, fby, fbz
 double precision, dimension(Nx,Ny,Nz) :: bx, by, bz
 real
 ! ...
 ! Assign values to fbx, fby, fbz 
 ! ...
 call dfftw_plan_dft_c2r_3d(plan,Nx,Ny,Nz,fbx,bx,FFTW_ESTIMATE)
 call dfftw_execute_dft_c2r(plan, fbx, bx)
 call dfftw_execute_dft_c2r(plan, fby, by)
 call dfftw_execute_dft_c2r(plan, fbz, bz)
 call dfftw_destroy_plan(plan)
 ! et = sum(abs(fbx)**2+abs(fby)**2+abs(fbz)**2)
 ! bx=bx*sqrt(Etot/et); by=by*sqrt(Etot/et); bz=bz*sqrt(Etot/et)

 ! Write bx, by, bz to files

代码以这种方式运行良好。当我取消对计算et和重新缩放bx的行的注释时,问题就出现了。当我取消注释这些行时,我得到分段错误,说“无效的内存引用”。在第一次执行dfftw_execute_dft_c2r()

时发生seg错误

我在两台不同的机器上使用ifort和gfortran尝试了fftw 3.2和fftw 3.4,并且没有任何成功。

这让我发疯!我需要帮助!为什么会这样?

谢谢!

1 个答案:

答案 0 :(得分:3)

您正在使用应用于不同阵列的相同计划。只有在内存中对齐时,FFTW才适用于这种情况 - 参见例如final point here,以及文档中有关为何难以保证的相关部分。

我在文档或其他地方看到的两个建议是

  1. 创建临时数组,为这些临时数组构建计划,并在调用execute_dft之前/之后将数据复制到临时数据中。我曾经用它来避免过去的类似错误,但它并不是性能最好的。但是,这是一个简单的更改,可以很容易地检查这是否是导致问题的原因。
  2. 制作多个计划。
  3. 此外,您似乎正在使用legacy Fortran interface。如果可能的话,最好使用"Modern" interface,但我过去的经验是,有些编译器不能很好地使用它。