【问题标题】:FFTW plan creation for multidimensional datas and OpenMP多维数据和 OpenMP 的 FFTW 计划创建
【发布时间】:2015-02-19 23:56:44
【问题描述】:

我无法在 openMP 环境中使用 fftw_plan 例程处理 2D 数据。我的编译器是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

但是,如果我取消注释三个!plan 行中的任何一个,如果我运行可执行文件,我会得到一个分段错误。 如果我总结一下我的问题:

  • 我可以为一维变换或二维原位变换创建计划

  • 无论使用什么语法,我都会遇到 2D 异位变换的段错误

【问题讨论】:

    标签: multidimensional-array fortran openmp fftw


    【解决方案1】:

    如果数组是静态声明的,而不是使用 ALLOCATE 进行动态内存分配,则大型数组的 FFTW 规划器会崩溃(因此我对 2D 数组有问题,但仅高于 ~512x512)。

    更具体地说,这个变量声明使程序在调用fftw_plan 时崩溃,

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

    而这个工作正常:

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

    【讨论】:

    • 是的,OpenMP 将尝试将静态数组放在堆栈上。而且它们不适合那里。
    猜你喜欢
    • 2013-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    相关资源
    最近更新 更多