Я новичок в OpenMP, и я пытаюсь парализовать уже существующий серийный код. Код имеет около 40000 строк, поэтому я не могу опубликовать его здесь.Реализация задач OpenMP в FORTRAN?
Я пытаюсь выполнить следующий код (в C) в FORTRAN:
my_pointer = listhead;
#pragma omp parallel
{
#pragma omp single nowait
{
while(my_pointer) {
#pragma omp task firstprivate(my_pointer)
{
(void) do_independent_work (my_pointer);
}
my_pointer = my_pointer->next ;
}
} // End of single - no implied barrier (nowait)
} // End of parallel region - implied barrier
В моем коде:
- my_pointer = цзы;
- listhead = z% first;
- zi% kc (zi% np) представляет собой массив размера zi% np;
- do_independent_work (my_pointer) = ALLOCATE (zi% kc (zi% np)) и инициализирует вектор 0;
Мой код выглядит следующим образом:
!$OMP PARALLEL
!$OMP SINGLE
DO WHILE(ASSOCIATED(zi))
IF (zi%compt) THEN
!$OMP TASK
ALLOCATE(zi%kc(zi%np), STAT = AllocateStatus)
IF (AllocateStatus /= 0) STOP "*** zi%kc Allocate failed ***"
FORALL(i=1:zi%np)
zi%kc(i) = 0.0_SDP
END FORALL
!$OMP END TASK
ENDIF
zi => zi%next
ENDDO
!$OMP END SINGLE NOWAIT
!$OMP END PARALLEL
Проблема заключается в следующем: серийная версия этого кода работает без каких-либо проблем, в то время как параллельная версия я реализовал аварии по какой-то причине.
Я делаю что-то принципиально неправильно?
Кроме того, если я ставлю firstprivate (цзы) рядом с «$ OMP ЗАДАЧА!» Я получаю «Ошибка 1 ошибка # 7266:. Указатель F90 не допускается в OpenMP * FIRSTPRIVATE, LASTPRIVATE или п СОКРАЩЕНИЯ»
Я использую Parallel Studio XE 2011 с Visual Studio 2010.
Не важно, но вместо 'FORALL (i = 1: zi% np) zi% kc (i) = 0.0_SDP END FORALL' вы можете сделать только 'zi% kc = 0'. –
Вы правы, я его поменяю. Я по-прежнему аннулирую код, который мне дал. –