Неклассифицируемая директива OpenMP в программе на Фортране - PullRequest
0 голосов
/ 27 января 2020

Я пытался распараллелить код на Фортране, используя openMP, с таким кодом:

program pigreco
    !----------------------------------------!
    use OMP_LIB
    implicit none
    !----------------------------------------!
    integer :: i
    integer, parameter :: N = 100000
    integer, parameter :: NCPU = 4 
    real*8 :: t0, t1 
    real :: h, totale, x, f
    !----------------------------------------!
    print '(a,2x,i15)', ' Number of intervals: ', N
    totale = 0.0
    h = 1. / N

    call OMP_SET_NUM_THREADS(NCPU)
    write(*, '(a,i10)') 'Numero di processori totali: ', NCPU

    t0 = OMP_GET_WTIME()
    !----------------------------------------!
#ifdef PARALLEL
    !
    print '(a)', "Scelta la versione parallela."
    !
    !$OMP PARALLEL DO PRIVATE(x, f) REDUCTION(+:totale)
    !
    do i = 1, N 
        x = (i - 0.5) * h
        f = (4 * h) / (1 + x**2)
        totale = totale + f
    enddo
    !$OMP END PARALLEL DO
    !
#endif
    !
    t1 = OMP_GET_WTIME()
    !
    PRINT '(a,2x,f30.25)', ' Computed PI =', totale
    PRINT '(a,2x,f30.25)', ' Total computational time =', t1 - t0
    !
end program pigreco

Когда я тогда пытаюсь скомпилировать со строкой: gfortran prova.F90 -fopenmp -D PARALLEL, это выдает мне сообщение об ошибке «не классифицируемо» Директива OpenMP в (1) ".

1 Ответ

3 голосов
/ 27 января 2020

Проблема в том, что вы определили PARALLEL с препроцессором, поэтому вместо чтения OMP PARALLEL DO компилятор читает OMP 1 DO, что, конечно, не имеет смысла. Измените #ifdef PARALLEL на #ifdef RUNPARALLEL и -DPARALLEL на -DRUNPARALLEL, тогда компилятор не выдаст ошибку.

В качестве альтернативы вы можете использовать тот факт, что при компиляции с поддержкой OpenMP макропеременная _OPENMP определяется автоматически, поэтому вы можете использовать #ifdef _OPENMP, а не флаг -D.

...