Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multidimensional array 为多维数据和OpenMP创建FFTW计划_Multidimensional Array_Fortran_Openmp_Fftw - Fatal编程技术网

Multidimensional array 为多维数据和OpenMP创建FFTW计划

Multidimensional array 为多维数据和OpenMP创建FFTW计划,multidimensional-array,fortran,openmp,fftw,Multidimensional Array,Fortran,Openmp,Fftw,在openMP环境中使用2D数据的fftw\u计划例程时遇到问题。我的编译器是gfortran,我的操作系统是Ubuntu 12.04。我使用--enable openmp选项编译了fftw,该库似乎链接正确。但是,当我运行以下最小示例时遇到问题: PROGRAM test_fft_OMP USE, intrinsic :: iso_c_binding USE OMP_LIB IMPLICIT NONE INCLUDE 'fftw3.f03'

在openMP环境中使用2D数据的
fftw\u计划
例程时遇到问题。我的编译器是
gfortran
,我的操作系统是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
但是,如果我取消注释这三个
中的任何一个!计划
行,如果运行可执行文件,则会出现分段错误。 如果我总结一下我的问题:

  • 我可以为一维变换或二维在位变换创建平面

  • 无论使用何种语法,2D错位变换都会出现seg错误


如果数组是静态声明的,而不是使用ALLOCATE进行动态内存分配,则FFTW planner会因大型数组而崩溃(因此我的问题是2D数组,但仅在~512x512以上)

更具体地说,当调用
fftw\u plan
时,此变量声明使程序崩溃

COMPLEX(C_DOUBLE_COMPLEX), DIMENSION(N,N)    :: D2C
然而,这一个很好:

COMPLEX(C_DOUBLE_COMPLEX), ALLOCATABLE, DIMENSION(:,:)    :: D2C
ALLOCATE(D2C(N,N))

是的,OpenMP将尝试在堆栈上放置静态阵列。而且它们不适合那里。