Fortran 90/95 OpenMP редукция с массивом (сумма) - PullRequest
1 голос
/ 04 ноября 2011

Я работаю над добавлением некоторых директив OpenMP в большой набор довольно дорогих вложенных циклов.Я считаю, что мне нужно использовать предложение сокращения с моей директивой, поскольку операции над массивом не обязательно независимы.Однако, когда я пытаюсь добавить директиву сокращения, дамп ядра моего приложения (но компилируется).Я использую компилятор XL Fortran от IBM с поддержкой OpenMP 3.0.Мой (упрощенный) код приведен ниже:

!$omp parallel do reduction(+:f)  private(n,m,l,i,j,k, &
!$omp            parm,ista,iend,jsta,jend,ksta,kend)
do n=1,lm     !k
 do m=1,jm   !j
  do l=1,im !i

    if (val(l,m,n) .ne. zero) then

     jsta=max j bounds in box
     jend=min j bounds in box
     ista=max i bounds in box
     iend=min i bounds in box
     ksta=min k bounds in box
     kend=max k bounds in box

     do k=ksta,kend
      do j=jsta,jend
       do i=ista,iend

          parm = exp( -dx*(abs(i-l)) &
                      -dy*(abs(j-m)) &
                      -dz*(abs(k-n)))

          f(i,j,k) = f(i,j,k)+ val(l,m,n) * parm

       end do
      end do
     end do

    end if

  end do
 end do
end do

Где f имеет размерность (im, jm, lm).Это просто проблема синтаксиса?Я пробовал это на нескольких небольших игрушечных проблемах, но у меня возникают проблемы с получением того, что я изучаю, с меньшим тестом, чтобы применить в этом контексте.Для справки я задал похожий вопрос несколько месяцев назад, но с тех пор проблема немного изменилась, и я не верю, что решение сейчас так просто ( link ).

Спасибо залюбая помощь / комментарии!

1 Ответ

1 голос
/ 15 августа 2012

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

В моем случае следующее решает проблему, которая увеличивает размер стека потоков. Надеюсь, это поможет.

[hoge@hoge]$ ulimit -s unlimited
[hoge@hoge]$ export OMP_STACKSIZE=1g # 1GB for thread stack size
...