0

최근에 순수 서브 루틴이 더 나은 parallization 최적화를 허용 할 수 있다고 읽었습니다 (here). 이것이 사실이라고 가정하면 다음과 같은 일상을 순수하게 만들 수있는 방법이 있습니까?동적 슬라이스를 통한 Pure Fortran 서브 루틴

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) 필드를 분할하여 선택 사례가 필요하지 않은 방법이 있습니까?

도움을 주시면 대단히 감사하겠습니다.

답변

3

주어진 서브 루틴은 STOP 문을 포함하고 있으므로 순수하게 만들 수 없습니다.

그 외에도 서브 루틴을 순수하게 만들 수 있는지 여부는 operator 서브 루틴이 순수한 지 (또는 순수하게 만들 수 있는지) 여부와 파생 된 유형에 포인터 구성 요소가 있는지 여부에 따라 달라집니다.

나는 "동적 조각"이 적절하다고 생각하지 않습니다.

+0

필자는 실제로 컴파일러의 불만을 제거하지는 않지만 컴파일러 플래그에 대한 불만을 제기하고 있습니다. 중요한 것은'호출 연산자'가'diff_stag'보다는 순수하다는 것입니다. 내 질문에 조금 성급한 것 같아. 나는이 의견에서 내 결론을 주석/확정 할 수 있다면이 대답을 받아 들일 것입니다. – Charlie

+0

의견을 이해할 수 없습니다. "컴파일러 플래그"란 무엇입니까? "중요한 것은 무엇"이라고 할 때 무엇을 중요하게 생각합니까? – IanH

+0

죄송합니다. "컴파일러 플래그"가 아닌'! $ OMP PARALLEL DO SHARED (T, f, gt)'문을 의미했습니다. 또한 '중요한 점'의 의미는 컴파일러가'diff_stag' 서브 루틴이 아닌 병렬 처리 루프를 최적화하기 위해'operator' 서브 루틴을 순수하게 사용해야한다는 것입니다. – Charlie

관련 문제