Можно ли использовать переменную производного типа с атрибутом shared в параллельной области OpenMP? - PullRequest
2 голосов
/ 06 февраля 2012

Я использую код Fortran (скомпилированный с Intel Fortran), который имеет параллельную область OpenMp, в которой я хотел бы иметь доступ к данным, которые хранятся в векторе производного типа (так как он имеет выделяемые поля разных типов).

Каждый поток будет работать только с одной позицией в этом векторе, поэтому я хотел бы, чтобы вектор имел атрибут "shared".

При выполнении кода я получаю некоторые странные ошибки и поэтому яИнтересно, можно ли использовать вектор производного типа таким образом?

1 Ответ

5 голосов
/ 06 февраля 2012

Конечно, нет проблем с использованием производных типов:

program derivedtype
   use omp_lib
   implicit none

   integer, parameter :: sz=20

   type mytype1
       integer, dimension(sz) :: a
       real   , dimension(sz) :: b
   end type mytype1

   type mytype2
       integer :: a
       real    :: b
   end type mytype2

   type(mytype1) :: var1
   type(mytype2), dimension(sz) :: var2
   integer:: i
   integer:: isum
   real   :: rsum

   var1%a = 2
   var1%b = 1.
   forall (i=1:sz)
       var2(i)%a = 3
       var2(i)%b = 4.
   endforall

   isum = 0
   rsum = 0.
   print *, var1%a
   print *, var1%b
   print *, [(var2(i)%a, i=1,sz)]
   print *, [(var2(i)%b, i=1,sz)]

!$omp parallel do default(none) shared(var1,var2), reduction(+:rsum), reduction(+:isum)
   do i=1,sz
      isum = isum + var1%a(i) + var2(i)%a
      rsum = rsum + var1%b(i) + var2(i)%b
   enddo

   print *,'isum = ', isum
   print *,'rsum = ', rsum
end program derivedtype

Проблема, вероятно, связана с размещаемыми частями, и это немного более тонко; OpenMP3.0 на самом деле не имел дело с производными типами с размещаемыми компонентами, и мне не ясно, что, если вообще что-то, 3.1 говорит об этом. Но даже если не считать этого, в OpenMP есть способы, с помощью которых вы можете пойти не так, как надо - с такими же проблемами возникают Си и указатели. Можете ли вы дать нам пример того, что именно терпит неудачу?

...