【问题标题】:FFTW 3 segmentation faultFFTW 3 分段错误
【发布时间】:2014-07-30 15:06:03
【问题描述】:

在将 FFTW 与 fortran 一起使用时,我遇到了一个奇怪的分段错误,我无法弄清楚原因。在线搜索也没有运气。这是我的代码:

 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错误

我已经在两台不同的机器上尝试了 fftw 3.2 和 fftw 3.4 以及 ifort 以及 gfortran(这些机器的所有可能组合),但没有任何成功。

快把我逼疯了!!我需要帮助!为什么会这样?

谢谢!

【问题讨论】:

  • 您是否对错误检查进行了 cimoile?你试过调试器吗?
  • 我确实通过错误检查进行编译,调试器只告诉我错误在哪里(正如我在原始帖子中提到的那样)。

标签: segmentation-fault fortran fftw


【解决方案1】:

您正在使用应用于不同阵列的相同计划。 FFTW 仅在它们在内存中对齐的情况下才有效 - 参见例如final point here,以及文档中的相关部分,说明为什么这很难保证。

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

  1. 创建临时数组,为这些临时数组构建计划,并在调用 execute_dft 之前/之后将数据复制到临时数组中或从临时数组中复制出来。我过去曾用它来避免类似的错误,但这并不是最好的性能。但是,这是一个简单的更改,可以轻松检查这是否是问题的原因。
  2. 创建多个计划。

此外,您似乎正在使用legacy Fortran interface。如果可能的话,最好使用"Modern" interface,但我过去的经验是一些编译器不能很好地使用它。

【讨论】:

  • 我尝试了您的两个建议,但都没有奏效。我的理解是,如果您在与您创建计划的大小完全相同的阵列上使用它,您可以创建一次计划并一遍又一遍地使用它。而且,如果是计划问题,无论如何都会报错。疯狂的是,如果注释了 et & bx 行,并且在我取消注释这些行后立即停止工作(计划的第一次执行),它就可以正常工作。
  • 这很奇怪。我过去使用过的示例文件是this file on github,但我看不到建议中没有的任何明显内容。如果它是 FFTW 跺整个内存,你的代码中注释掉的行就是我希望它失败的地方。
猜你喜欢
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多