2016-12-08 4 views
6

私はサブルーチンに想定されたシェイプ配列として宣言されたサブルーチンに配列を渡そうとしていました。それは、代わりにポインタを渡すことで私が解決できたいくつかの問題を私に与えてくれました。Doポインタはコンパイラの最適化を阻害しますか?

しかし、高い評判を持つ一部のユーザーのコメントに私に語った:

ポインタを追加するも、それが今日の作業を行う必要はありませんコンパイラのオプティマイザを伝えるの合理的な方法です。

は、誰もがこの上の短い説明を提供してもらえますか?言語はFortran 95ですが、他の言語にも当てはまると思います。

+0

私はOPが[このコメント]を参照していると思います(http://stackoverflow.com/questions/41009109/subroutine-not-returning-correct-numerical-values-in-assumed-shape-array-due-to #comment69272729_41032273)。 – 4castle

+1

それは本当です。 SIMDでは、ポイントが連続して索引付けされているかどうかにかかわらず、データが順次であることを保証することは困難です。 多くのFortranは特にベクトル/配列をターゲットにしているので、Fortranではほとんどの言語よりも本当らしいです。しかし、コンパイラーの勇気はすべて、概してfortranとcの間でアセンブリがほぼ同じになる漸近線に近づいています。一般的にはいくつかのことを意味し、より難しいコードはより多くの作業を必要とします。 – Holmz

+1

@ 4castle誤った情報が(ポインタを使って) "あなたはもはや配列セクションを渡すことができません"という誤った情報が含まれているため、元のコメントへのリンクは意図的に含まれていませんでした。サブルーチンへの引数として渡す前に、配列セクションにポインタを代入するよりも簡単な方法はありません。 – Mephisto

答えて

4

はい、Fortranコンパイラは、ポインタが他のポインタとし、target変数に別名設定できると仮定しなければなりません。

あなたはポインタ配列abを持っている場合はaの値を変更すると、いくつかの値を変更することができますので、その後

a(i) = a(i) + b(i) 

にコンパイラは、これら二つの配列が部分的にオーバーラップしてもよいし、それが特定の最適化を阻害しなければならないことを前提としなければなりませんbいくつか不明なインデックスです。

もC restrictキーワードとIs Fortran easier to optimize than C for heavy calculations?ではるかに徹底的な議論を参照してください。ポインタエイリアシングについてのすべての点を繰り返す価値はありません。

IanHさんのコメントは、おそらく少し意図的にあまりにも強かったが、真実の多くはそれであります。

関連する問題