0
私は最近、純粋なサブルーチンがより良い視差最適化を可能にすることを(here)読みました。これが本当であると仮定して、私は次のルーチンを純粋にすることができる方法はありますか?動的スライシングによる純粋な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)
というフィールドをスライスして、選択する必要がないようにする方法はありますか?
ご協力いただきありがとうございます。
私は実際にはコンパイラーの苦情を取り除いているわけではありませんが、コンパイラーのフラグについて苦情を受けています。重要なのは、 'call operator'が' diff_stag'ではなくpureであることです。私の質問は少し面白かったと思います。このコメントで私の結論をコメント/確認できるなら、私はこの答えを受け入れるでしょう。 – Charlie
コメントが分かりません。どのような "コンパイラフラグ"? 「何が重要なのか」と言うと、何のために重要なのですか? – IanH
申し訳ありません、私は '!$ OMP PARALLEL DO SHARED(T、f、gt)'ステートメントを意味し、 "コンパイラフラグ"は意味しません。また、私が「重要なこと」を意味するのは、 '演算子'サブルーチンが 'diff_stag'サブルーチンではなく並列化されたループを最適化するためにコンパイラにとって純粋でなければならないということです。 – Charlie