【发布时间】:2016-06-13 10:19:02
【问题描述】:
以下 3D 复数 FFT Fortran MPI 程序在进程数 P = 1、2、4、8 和 16 时运行。但是,当 P = 12 时它会失败,并在调用函数 fftw_mpi_plan_dft_3d 的地方出现以下错误.
“程序收到信号 SIGSEGV:分段错误 - 内存引用无效。”
为什么这个程序会因为 P = 12 而失败?
PROGRAM test
USE, INTRINSIC :: ISO_C_BINDING
IMPLICIT NONE
INCLUDE 'mpif.h'
INCLUDE 'fftw3-mpi.f03'
INTEGER :: ier
integer(C_INTPTR_T), parameter :: L = 256
integer(C_INTPTR_T), parameter :: N = 256
integer(C_INTPTR_T), parameter :: M = 48
type(C_PTR) :: plan, cdata
complex(C_DOUBLE_COMPLEX), pointer :: data(:,:,:)
integer(C_INTPTR_T) :: i, j, alloc_local, local_M, local_j_offset
CALL MPI_INIT(ier)
CALL fftw_mpi_init
alloc_local = fftw_mpi_local_size_3d(M, N, L, MPI_COMM_WORLD, local_M, local_j_offset)
cdata = fftw_alloc_complex(alloc_local)
CALL C_F_POINTER(cdata, data, [L, N, local_M])
plan = fftw_mpi_plan_dft_3d(M, N, L, data, data, MPI_COMM_WORLD, FFTW_FORWARD, FFTW_ESTIMATE)
CALL fftw_destroy_plan(plan)
CALL fftw_free(cdata)
CALL MPI_FINALIZE(ier)
STOP
END PROGRAM test
【问题讨论】:
-
也许 FFTW 开发人员可以帮助您。可以通过本网页底部的地址fftw.org/#documentation 联系到他们
-
感谢您的评论。
-
在哪一步崩溃?有效时答案是否正确?
-
我无法重现该错误。您使用哪些编译器和编译器选项?哪个FFTW版本?哪个 MPI 库?哪个版本?
-
您可以尝试为输入和输出使用不同的缓冲区吗?对于非 mpi fftw,在这种情况下必须指定标志
FFTW_IN_PLACE。见fftw.org/fftw2_doc/fftw_3.html。我假设使用 fftw-mpi 的原位转换无法正常工作...