Fortran OMP Parallel Do для цикла Do While - PullRequest
0 голосов
/ 03 июня 2018

В последнее время я читал и играл с OpenMP parallel do в Fortran 95. Однако я до сих пор не понял, как parallel do будет использоваться в коде, подобном приведенному ниже:

I=1

DO WHILE I<100
  A=2*I
  B=3*I
  C=A+B
  SUM(I)=C

  I=I+1
END DO

Использование просто !$OMP PARALLEL DO перед циклом do и !$OMP END PARALLEL DO, похоже, не работает.Я прочитал несколько вещей о частных и общих переменных, однако я думаю, что каждый последующий цикл кода выше полностью независим.Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Следующий пример может помочь понять ваш подход к тому, что вы наметили.Он показывает использование! $ OMP, а также идентифицирует поток, используемый для каждой итерации цикла.Я изменил SUM на SUMI, чтобы сохранить SUM как внутреннюю функцию.Надеюсь, что вы можете основываться на этом.

 use omp_lib

  real sumi(99), a,b,c
  integer thread_used(0:9), I

    nThreads = omp_get_max_threads ()
    thread_used = 0

!$OMP PARALLEL DO                   &
!$OMP  SHARED  (SUMI,thread_used)   &
!$OMP  PRIVATE (i,a,b,c,iThread)
    DO I = 1,99
      iThread  = omp_get_thread_num  ()
      thread_used(iThread) = thread_used(iThread) + 1
      A=2*I
      B=3*I
      C=A+B
      SUMI(I)=C
    END DO
!$OMP END PARALLEL DO

    write (*,*) sum (SUMI)
    do i = 0, nThreads
      write (*,*) i, thread_used(i)
    end do

 end
0 голосов
/ 04 июня 2018

Конструкция parallel do не работает с do while циклами.Вам нужно изменить цикл do while на стандартный цикл DO.Это из стандарта OpenMP 4.0 для конструкции parallel do на https://www.openmp.org/wp-content/uploads/OpenMP4.0.0.pdf, стр. 59:

• Связанные do-loop должны быть структурированными блоками.

• С помощью оператора CYCLE может быть сокращена только итерация самого внутреннего связанного цикла.

• Ни один оператор в связанных циклах, кроме операторов DO, не может вызвать переход из циклов.

• Итерационная переменная do-loop должна иметь тип integer.

• * do-loop не может быть DO WHILE илиDO петля без петлевого управления.

...