多维数据和 OpenMP 的 FFTW 计划创建
FFTW plan creation for multidimensional datas and OpenMP
我在 openMP 环境中使用二维数据的 fftw_plan
例程时遇到问题。我的编译器是 gfortran
,我的 OS 是 Ubuntu 12.04。我用 --enable-openmp
选项编译了 fftw,库似乎链接正确。但是,当我遇到麻烦时 运行 以下最小示例:
PROGRAM test_fft_OMP
USE, intrinsic :: iso_c_binding
USE OMP_LIB
IMPLICIT NONE
INCLUDE 'fftw3.f03'
INTEGER*4, PARAMETER :: N=512
REAL(C_DOUBLE), DIMENSION(N) :: dbgr
COMPLEX(C_DOUBLE_COMPLEX), DIMENSION(N/2+1) :: dbgc
COMPLEX(C_DOUBLE_COMPLEX), DIMENSION(N) :: dbgcc
COMPLEX(C_DOUBLE_COMPLEX), DIMENSION(N,N) :: D2CA
COMPLEX(C_DOUBLE_COMPLEX), DIMENSION(N,N) :: D2CB
REAL(C_DOUBLE), DIMENSION(N,N) :: D2R
COMPLEX(C_DOUBLE_COMPLEX), DIMENSION(N/2+1,N):: D2C
INTEGER :: nthreads, void
TYPE(C_PTR) :: plan
INTEGER(C_INT), DIMENSION(2) :: n2 = [N,N]
INTEGER(C_INT), DIMENSION(1) :: n1 = [N]
nthreads = omp_get_num_threads()
void = fftw_init_threads()
CALL fftw_plan_with_nthreads(nthreads)
plan=fftw_plan_dft_c2r_1d(N, dbgc , dbgr,FFTW_MEASURE)
!plan=fftw_plan_dft_c2r_2d(N,N, D2C , D2R ,FFTW_MEASURE)
plan=fftw_plan_dft_1d(N, dbgcc , dbgcc,FFTW_FORWARD,FFTW_MEASURE)
plan=fftw_plan_dft_2d(N,N, D2CA , D2CA ,FFTW_FORWARD,FFTW_MEASURE)
plan=fftw_plan_dft(1,n1, dbgc , dbgc ,FFTW_FORWARD,FFTW_MEASURE)
plan=fftw_plan_dft(2,n2, D2CA , D2CA ,FFTW_FORWARD,FFTW_MEASURE)
!plan=fftw_plan_dft_2d(N,N, D2CA , D2CB ,FFTW_FORWARD,FFTW_MEASURE)
!plan=fftw_plan_dft(2,n2, D2CA , D2CB ,FFTW_FORWARD,FFTW_MEASURE)
END PROGRAM test_fft_OMP
代码编译没问题,使用
gfortran -fopenmp -o execmp test.f90 -I/usr/local/lib/ -L/usr/local/lib/ -lfftw3_omp -lfftw3 -lm -lpthread
但是,如果我取消注释三行 !plan
中的任何一行,我会在 运行 可执行文件时出现分段错误。
如果我总结一下我的问题:
我可以为一维变换或二维就地变换制定计划
无论使用何种语法,我都会遇到二维错位转换的段错误
如果数组是静态声明的而不是使用 ALLOCATE 进行动态内存分配,FFTW 规划器会因大型数组而崩溃(因此我的二维数组出现问题,但仅高于 ~512x512)。
更具体地说,这个变量声明使程序在调用 fftw_plan
时崩溃,
COMPLEX(C_DOUBLE_COMPLEX), DIMENSION(N,N) :: D2C
而这个工作正常:
COMPLEX(C_DOUBLE_COMPLEX), ALLOCATABLE, DIMENSION(:,:) :: D2C
ALLOCATE(D2C(N,N))
我在 openMP 环境中使用二维数据的 fftw_plan
例程时遇到问题。我的编译器是 gfortran
,我的 OS 是 Ubuntu 12.04。我用 --enable-openmp
选项编译了 fftw,库似乎链接正确。但是,当我遇到麻烦时 运行 以下最小示例:
PROGRAM test_fft_OMP
USE, intrinsic :: iso_c_binding
USE OMP_LIB
IMPLICIT NONE
INCLUDE 'fftw3.f03'
INTEGER*4, PARAMETER :: N=512
REAL(C_DOUBLE), DIMENSION(N) :: dbgr
COMPLEX(C_DOUBLE_COMPLEX), DIMENSION(N/2+1) :: dbgc
COMPLEX(C_DOUBLE_COMPLEX), DIMENSION(N) :: dbgcc
COMPLEX(C_DOUBLE_COMPLEX), DIMENSION(N,N) :: D2CA
COMPLEX(C_DOUBLE_COMPLEX), DIMENSION(N,N) :: D2CB
REAL(C_DOUBLE), DIMENSION(N,N) :: D2R
COMPLEX(C_DOUBLE_COMPLEX), DIMENSION(N/2+1,N):: D2C
INTEGER :: nthreads, void
TYPE(C_PTR) :: plan
INTEGER(C_INT), DIMENSION(2) :: n2 = [N,N]
INTEGER(C_INT), DIMENSION(1) :: n1 = [N]
nthreads = omp_get_num_threads()
void = fftw_init_threads()
CALL fftw_plan_with_nthreads(nthreads)
plan=fftw_plan_dft_c2r_1d(N, dbgc , dbgr,FFTW_MEASURE)
!plan=fftw_plan_dft_c2r_2d(N,N, D2C , D2R ,FFTW_MEASURE)
plan=fftw_plan_dft_1d(N, dbgcc , dbgcc,FFTW_FORWARD,FFTW_MEASURE)
plan=fftw_plan_dft_2d(N,N, D2CA , D2CA ,FFTW_FORWARD,FFTW_MEASURE)
plan=fftw_plan_dft(1,n1, dbgc , dbgc ,FFTW_FORWARD,FFTW_MEASURE)
plan=fftw_plan_dft(2,n2, D2CA , D2CA ,FFTW_FORWARD,FFTW_MEASURE)
!plan=fftw_plan_dft_2d(N,N, D2CA , D2CB ,FFTW_FORWARD,FFTW_MEASURE)
!plan=fftw_plan_dft(2,n2, D2CA , D2CB ,FFTW_FORWARD,FFTW_MEASURE)
END PROGRAM test_fft_OMP
代码编译没问题,使用
gfortran -fopenmp -o execmp test.f90 -I/usr/local/lib/ -L/usr/local/lib/ -lfftw3_omp -lfftw3 -lm -lpthread
但是,如果我取消注释三行 !plan
中的任何一行,我会在 运行 可执行文件时出现分段错误。
如果我总结一下我的问题:
我可以为一维变换或二维就地变换制定计划
无论使用何种语法,我都会遇到二维错位转换的段错误
如果数组是静态声明的而不是使用 ALLOCATE 进行动态内存分配,FFTW 规划器会因大型数组而崩溃(因此我的二维数组出现问题,但仅高于 ~512x512)。
更具体地说,这个变量声明使程序在调用 fftw_plan
时崩溃,
COMPLEX(C_DOUBLE_COMPLEX), DIMENSION(N,N) :: D2C
而这个工作正常:
COMPLEX(C_DOUBLE_COMPLEX), ALLOCATABLE, DIMENSION(:,:) :: D2C
ALLOCATE(D2C(N,N))