2015-11-14 5 views
2

ПРОБЛЕМЫ: Длинный список директив OpenMP Fortran77Синтаксиса для списка OpenMP долго директивы Fortran77

c$omp parallel default(shared) private(i,k,i1,i2,i3,i4,i5, 
    $ i6,x0,y0,z0,vnx0,vny0,vnz0,qs0) 
c$omp do 
     Task to be performed 
c$omp end do 
c$omp end parallel 

Я пытаюсь скомпилировать выше программу с помощью ifort и она отлично работает. Я проверил с серийной версией, и я получаю тот же результат

ifort -openmp -parallel -o ./solve 

Но когда я пытаюсь скомпилировать с помощью gfortran он не работает.

gfortran -fopenmp 

Я получаю следующую ошибку

quinckedrop.f:2341.57: 

*$omp parallel default(shared) private(i,k,i1,i2,i3,i4,i5    
                 1 
Error: Syntax error in OpenMP variable list at (1) 
quinckedrop.f:2342.6: 

    $  ,i6,x0,y0,z0,vnx0,vny0,vnz0,qs0)       
     1 
Error: Bad continuation line at (1) 
quinckedrop.f:2342.15: 

    $  ,i6,x0,y0,z0,vnx0,vny0,vnz0,qs0)       
       1 
Error: Invalid character in name at (1) 
quinckedrop.f:2381.72: 

*$omp end parallel              
                     1 
Error: Unexpected !$OMP END PARALLEL statement at (1) 
quinckedrop.f:2768.6: 

    $  private(i,k,i1,i2,i3,i4,i5,i6,x0,y0,z0,vnx0,vny0,vnz0)  
     1 
Error: Bad continuation line at (1) 
quinckedrop.f:2768.21: 

    $  private(i,k,i1,i2,i3,i4,i5,i6,x0,y0,z0,vnx0,vny0,vnz0)  
        1 
Error: PRIVATE statement at (1) is only allowed in the specification part of a module 
quinckedrop.f:4302.6: 

    $  private(i,k,i1,i2,i3,i4,i5,i6,x0,y0,z0)     
     1 
Error: Bad continuation line at (1) 
quinckedrop.f:4302.21: 

    $  private(i,k,i1,i2,i3,i4,i5,i6,x0,y0,z0)     
        1 
Error: PRIVATE statement at (1) is only allowed in the specification part of a module 
quinckedrop.f:5738.6: 

    $  private(i,k,i1,i2,i3,i4,i5,i6,x0,y0,z0      
     1 
Error: Bad continuation line at (1) 
quinckedrop.f:5738.21: 

    $  private(i,k,i1,i2,i3,i4,i5,i6,x0,y0,z0      
        1 
Error: PRIVATE statement at (1) is only allowed in the specification part of a module 

This proposed solution не работает для меня (может быть, потому что я использую Fortran77)

+0

Вам нужно использовать синтаксис продолжения правой линии. Я дам точное решение позже, если больше никто не будет писать. – Jeff

ответ

3

Ваша задача просто сводится к тому, что синтаксис продолжения OpenMP для источников фиксированного формата Код Fortran выглядит следующим образом:

c$omp parallel blah 
c$omp+private(blah) 
c$omp+reduction(blah) 

Ну, если быть более точным, то все 3 следующие формы для директив эквивалентны:

c$omp 
!$omp 
*$omp 

Но в любом случае, директива распространилась по нескольким линиям должны быть разделены, используя дополнительный символ в 6-м столбце, как уже показано , Этот символ может быть любым, кроме пробела или нуля. (Благодаря Христо Илиев за то, что поправил меня в этом. Первоначально ошибочно указано, что символ продолжения должен был быть +)

Добавление различных необходимых c$omp+ строки продолжения должны просто решить вашу проблему

Это должно выглядеть как это:

c$omp parallel default(shared) private(i,k,i1,i2,i3,i4,i5, 
c$omp+ i6,x0,y0,z0,vnx0,vny0,vnz0,qs0) 
c$omp do 
     Task to be performed 
c$omp end do 
c$omp end parallel 
+2

Символ продолжения необязательно должен быть '+'. Можно использовать любой допустимый символ Фортрана, кроме пробела и нуля. –

+1

@HristoIliev wow, вы (как всегда) полностью правы. Дело в том, что я всегда ссылался на стандарт OpenMP для этого, поскольку, поскольку я не являюсь программистом Fortran с фиксированным форматом, я никогда не был уверен. И дело в том, что единственный пример, приведенный в стандарте для строки продолжения в фиксированном формате, имеет символ '+' как символ продолжения, поэтому я наивно предполагал до сих пор, что это ожидаемый формат. И действительно, почти во всем фиксированном формате OpenMP-кода, который я видел, строка продолжения была с '+'. Это сила примеров в стандарте! Я исправлю это так или иначе – Gilles

+0

Спасибо за решение Gilles! работы: с $ OMP параллельно по умолчанию (общий) частные (я, к, i1, i2, i3, i4, i5, с $ OMP + i6, x0, y0, z0, vnx0, vny0, vnz0, qs0) Не работает (как предлагается на другом форуме): c $ omp parallel default (shared) private (i, k, i1, i2, i3, i4, i5, & c $ omp & i6, x0, y0, z0, vnx0, vny0, vnz0, qs0) –