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)というフィールドをスライスして、選択する必要がないようにする方法はありますか?

ご協力いただきありがとうございます。

答えて

3

与えられたサブルーチンには、STOP文が含まれているため、純粋にすることはできません。

さらに、サブルーチンを純粋にすることができるかどうかは、operatorサブルーチンが純粋である(または純粋にできる)か、おそらく派生型にポインタコンポーネントがあるかどうかによって異なります。

「ダイナミックスライス」は適切ではないと思います。

+0

私は実際にはコンパイラーの苦情を取り除いているわけではありませんが、コンパイラーのフラグについて苦情を受けています。重要なのは、 'call operator'が' diff_stag'ではなくpureであることです。私の質問は少し面白かったと思います。このコメントで私の結論をコメント/確認できるなら、私はこの答えを受け入れるでしょう。 – Charlie

+0

コメントが分かりません。どのような "コンパイラフラグ"? 「何が重要なのか」と言うと、何のために重要なのですか? – IanH

+0

申し訳ありません、私は '!$ OMP PARALLEL DO SHARED(T、f、gt)'ステートメントを意味し、 "コンパイラフラグ"は意味しません。また、私が「重要なこと」を意味するのは、 '演算子'サブルーチンが 'diff_stag'サブルーチンではなく並列化されたループを最適化するためにコンパイラにとって純粋でなければならないということです。 – Charlie

関連する問題