Создание плана FFTW для многомерных данных и OpenMP

У меня проблемы с использованием подпрограмм fftw_plan для 2D-данных в среде openMP. Мой компилятор — gfortran, а моя ОС — Ubuntu 12.04. Я скомпилировал fftw с опцией --enable-openmp, и вроде бы библиотека слинкована правильно. Однако, когда у меня возникают проблемы при запуске следующего минимального примера:

   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, я получу ошибку сегментации при запуске исполняемого файла. Если я резюмирую свою проблему:

  • Я могу создавать планы для 1D-преобразований или 2D-преобразований на месте

  • Я получаю ошибку seg для 2D-преобразований неуместно, независимо от используемого синтаксиса.


person BenBoulderite    schedule 19.02.2015    source источник


Ответы (1)


Планировщик FFTW дает сбой для больших массивов (отсюда моя проблема с 2D-массивами, но только выше ~ 512x512), если массивы объявлены статически вместо использования ALLOCATE для динамического выделения памяти.

В частности, это объявление переменной вызывает сбой программы при вызове fftw_plan,

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

тогда как этот работает нормально:

COMPLEX(C_DOUBLE_COMPLEX), ALLOCATABLE, DIMENSION(:,:)    :: D2C
ALLOCATE(D2C(N,N))
person BenBoulderite    schedule 25.02.2015
comment
Да, OpenMP попытается разместить статические массивы в стеке. И они туда не влезут. - person Vladimir F; 25.02.2015