1

Fortran 90 に問題があります。

私はユーザー定義型を持っており、MPI サブルーチンの 1 つを呼び出すと、データは値で渡されるように見えます (私が思っていたように、アドレスではありません)。出力引数は変更されません。MPI 呼び出しに固有のようです。簡単なテストで同じことを試しましたが、呼び出しスコープで渡された値を変更できます。Fortran は常にアドレスで渡すと思っていたので、これがなぜなのかわかりません。何が起こっているのでしょうか?

明確にするために、コメント付きのスニペットは呼び出しがどのように行われるかを示しています。最初の呼び出しでc%NSubDomainsは、出力引数であり、呼び出しスコープで変更する必要がありますが、そうではありません。ユーザー定義型のメンバーではなく配列で呼び出すと、コメント解除されたスニペットで機能します。

! ! This doesn't work output values aren't modified ??
! call MPI_Dims_create(c%NProcs,c%NDims,c%NSubDomains,iErr)

nsubs(:)=0
call MPI_Dims_create(c%NProcs,c%NDims,nsubs,iErr)
c%NSubDomains=nsubs
4

2 に答える 2

1

@MSBが観察しているように、Fortran標準では、引数の受け渡しをどのように実装するかを義務付けていません。ただし、引数の受け渡しのセマンティクスによって、引数が参照によって渡されるかのようにプログラマーに見えるようにすることが義務付けられていることは明らかだと思います。INTENT(OUT)だから私は、これがの議論には当てはまらないように見えるというOPの動揺を理解していますMPI_DIMS_CREATE

コンパイラが次のような宣言の構文をサポートしている場合:

!DEC$ ATTRIBUTE

または、Fortran 2003のC相互運用性機能が実装されたコンパイラーを使用している場合は、参照のようにコンパイラーにコンポーネントを渡すように強制できる場合があります。ただし、そうする場合、コンパイラがバックグラウンドで、コメントされていないコードで自分が行っていることを実行するコードを生成している可能性が高くなります。つまり、参照のように渡すことができる変数を作成し、それをサブルーチンに渡します。

この状況では、フローを使用して自分でコードを記述します。

于 2010-03-19T09:22:19.627 に答える
1

Fortran言語標準では、引数の受け渡し方法については規定されていません。さまざまなコンパイラーが、引数のタイプと引数の「意図」(in / out / inout)に応じて、さまざまな方法で引数の受け渡しを実装できます。

nsubsとC%NSubDomainsはどのように宣言されますか?MPI_Dims_createを呼び出す方法をコンパイラーに指示するためのインターフェース宣言(おそらくMPIへのFortran 90バインディングから)がありますか?

于 2010-03-19T02:53:38.077 に答える