2017-01-23 5 views
1

を期待するサブルーチンに配列を渡す私は1次元ワーク配列2次元アレイ異なる形状

pure subroutine f(work, dim1, dim2) 
    real(8), intent(out) :: work(dim1, dim2) 
    integer, intent(in) :: dim1, dim2 
    ... 

で動作サブルーチンに渡される

real(8), allocatable :: work(:) 

を有します配列を渡す次の方法の違いは何ですか?

call f(work, dim1, dim2) 
call f(work(1), dim1, dim2) 

最初の配列要素へのポインタを渡しただけであるか、どちらかの呼び出しで余分なオーバーヘッドがありますか?現代のFortranでは、次元を明示的に渡すことなく形状を変更する必要があるが、パフォーマンス・ヒットはせずに配列を渡す方がよりエレガントな方法がありますか?

私は古いFortranのように見えますが、親サブルーチンで2次元配列を宣言し、配列セクションwork(:dim1,:dim2)fに渡すよりも速く見つけました。

+0

ここでは2つの全く異なる質問があります。 [work]と 'work(1)' .asの引数の違いは何ですか? [2]](http://stackoverflow.com/q/24472907)どのように別の形状としてダミーに関連付けられている1つの形状の配列を持っている? (:DIM1、:DIM2) 'work'はあなたではなくアレイ部'仕事よりも、全体の配列として 'work'を渡すと何が起こるかランク2の配列であり、'場合は、あなたの最後のポイントについては – francescalus

+0

、? – francescalus

+0

ありがとうございます。サブルーチンの中で、私は 'dgemm'を' work(:dim1、:dim2) 'を引数の1つとして呼び出すようなことをしています。呼び出し元のスコープ内で 'work'が2次元配列として宣言され、完全配列が渡された場合、これは一時配列の自動生成につながります。ポイントは、呼び出しごとに次元が異なることがありますが、私はワークスペースを1回だけ割り当てています。 –

答えて

3

両方例文は、配列関連性の形態です。実際の引数は、配列要素の順序で仮引数の要素に関連付けられた配列要素のシーケンスを指定します。 (発呼範囲で)

作業する場合は、非ゼロのサイズに割り当てられていると、実装に実用的差である可能性が低い一方の下限がありました。両方の場合において

は、プログラマは、仮引数のサイズは実際の引数要素配列のサイズ以下でなければならないことを保証しなければなりません。全体の配列参照を使用して

読者(おそらくコンパイラ)に、それが明確になり、潜在的に、アレイの全ての要素を含む、配列要素の配列を渡すために作者の意図でした。また、実際の引数がゼロサイズであるか、おそらくは1以外の下限を持つことを防ぎます。特定の要素への参照は、配列要素の配列を指定するために使用される場合

著者の意図は、はるかに明らかです。

実際の引数が割り付け可能であるため、コンパイラは実際の引数の要素シーケンスが連続していることを認識し、仮配列を要素シーケンスに適切に関連付けることができます。他のケースでは、実際の引数自体が連続した属性のない仮引数であった場合、コンパイラは要素シーケンスが連続していることを知らず、呼び出しの前に要素シーケンスのコピーを作成する必要があります。これは物質的なパフォーマンスに影響を与える可能性があります。おそらく、実際の引数として不連続なランク2の配列セクションを使用することがより遅いことがわかったのはおそらく理由です。

関連する問題