Подпрограмма на чистом Фортране с помощью динамического нарезки

Недавно я прочитал (здесь), что чистые подпрограммы могут обеспечить лучшую оптимизацию параллелизма. . Предполагая, что это правда, есть ли способ сделать следующую процедуру чистой?

 subroutine diff_stag(operator,dfdh,f,T,dir,pad,gt)
   implicit none
   procedure(stencils_stag) :: operator
   type(realField),intent(inout) :: dfdh
   type(realField),intent(in) :: f
   type(triDiag),intent(in) :: T
   integer,intent(in) :: dir,pad,gt
   integer :: i,j,k
   select case (dir)
   case (1)
   !$OMP PARALLEL DO SHARED(T,f,gt)
   do k=1+pad,f%s(3)-pad; do j=1+pad,f%s(2)-pad
     call operator(dfdh%f(:,j,k),f%f(:,j,k),T,f%s(dir),dfdh%s(dir),gt)
   enddo; enddo
   !$OMP END PARALLEL DO
   case (2)
   !$OMP PARALLEL DO SHARED(T,f,gt)
   do k=1+pad,f%s(3)-pad; do i=1+pad,f%s(1)-pad
     call operator(dfdh%f(i,:,k),f%f(i,:,k),T,f%s(dir),dfdh%s(dir),gt)
   enddo; enddo
   !$OMP END PARALLEL DO
   case (3)
   !$OMP PARALLEL DO SHARED(T,f,gt)
   do j=1+pad,f%s(2)-pad; do i=1+pad,f%s(1)-pad
     call operator(dfdh%f(i,j,:),f%f(i,j,:),T,f%s(dir),dfdh%s(dir),gt)
   enddo; enddo
   !$OMP END PARALLEL DO
   case default
   stop 'Error: dir must = 1,2,3 in delGen_T in ops_del.f90.'
   end select
 end subroutine

Я считаю, что проблема заключается в том, что случай выбора вводит побочный эффект, который недопустим.

Есть ли способ, которым я могу нарезать поля f%f(i,j,k) и dfdh%f(i,j,k), чтобы случай выбора не требовался?

Любая помощь приветствуется!


person Charles    schedule 06.09.2016    source источник


Ответы (1)


Данную подпрограмму нельзя сделать чистой, так как она содержит оператор STOP.

Кроме того, возможность сделать подпрограмму чистой будет зависеть от того, была ли подпрограмма operator чистой (или могла бы быть чистой) и, возможно, имели ли производные типы компоненты-указатели.

Я не думаю, что «динамическая нарезка» актуальна.

person IanH    schedule 06.09.2016
comment
Я вижу, на самом деле я не получаю жалобы на компилятор, удаляющий остановку, но я получаю жалобы на флаги компилятора. Я предполагаю, что важно то, что call operator чистый, а не diff_stag. Думаю, мой вопрос был несколько поспешным. Я приму этот ответ, если вы сможете прокомментировать/подтвердить мой вывод в этом комментарии. - person Charles; 06.09.2016
comment
Я не понимаю комментарий. Какие флаги компилятора? Когда вы говорите, что важно, важно для чего? - person IanH; 07.09.2016
comment
Извините, я имел в виду операторы !$OMP PARALLEL DO SHARED(T,f,gt), а не флаги компилятора. Кроме того, под «что важно» я имел в виду то, что я считаю, что подпрограмма operator должна быть чистой, чтобы компилятор мог оптимизировать параллельные циклы, а не подпрограмма diff_stag. - person Charles; 07.09.2016
comment
Если вы используете параллельные директивы OpenMP, компилятор, скорее всего, будет просто делать то, что эти директивы явно говорят ему делать, а не какие-то хитроумные параллельные оптимизации. Является ли вызываемая процедура чистой или нет, вероятно, отвлекает внимание. Однако чистая процедура не повредит оптимизации. - person IanH; 07.09.2016