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)
필드를 분할하여 선택 사례가 필요하지 않은 방법이 있습니까?
도움을 주시면 대단히 감사하겠습니다.
필자는 실제로 컴파일러의 불만을 제거하지는 않지만 컴파일러 플래그에 대한 불만을 제기하고 있습니다. 중요한 것은'호출 연산자'가'diff_stag'보다는 순수하다는 것입니다. 내 질문에 조금 성급한 것 같아. 나는이 의견에서 내 결론을 주석/확정 할 수 있다면이 대답을 받아 들일 것입니다. – Charlie
의견을 이해할 수 없습니다. "컴파일러 플래그"란 무엇입니까? "중요한 것은 무엇"이라고 할 때 무엇을 중요하게 생각합니까? – IanH
죄송합니다. "컴파일러 플래그"가 아닌'! $ OMP PARALLEL DO SHARED (T, f, gt)'문을 의미했습니다. 또한 '중요한 점'의 의미는 컴파일러가'diff_stag' 서브 루틴이 아닌 병렬 처리 루프를 최적화하기 위해'operator' 서브 루틴을 순수하게 사용해야한다는 것입니다. – Charlie