2011-12-22 45 views
6

私はforallを使って動的配列を割り当てようとしましたが、gfortranはそれを好まなかったのです。私はまた、forallブロックでwriteステートメントが禁止されていることを知りました。私はreadステートメントもそうだと考えています。Fortran forallの制限

forallブロックには他のどのような機能/操作が許可されていませんか?

注文が問題ではないときにdoループを置き換えることがありますが、このコンストラクトはまったく何ですか?特に、操作の順序が重要ではないときに表示すると、より読みやすく、エレガントなコーディングができると思っていましたが、forallの中でどのような操作ができるかは非常に制限されています。

これらの制限の理由は何ですか?つまり、ユーザーが邪魔しないように保護する/防止する対象は何ですか。 forallを使用することをお勧めしますか?もしそうなら、どんな目的のために?私はそこだけ1 forallブロックがある、と私はdoループでそれをすべてを翻訳した場合、それは4つのネストされたループを与えるだろうに取り組んでいるコードで今

。どちらの方が良いですか?

答えて

11

今日はFORALLWHEREのコンストラクトはあまり必要ありません。それらはFortran 95の一部として導入されました(Fortran 90へのマイナーな拡張)。これはコードベクトル化がHPCの主要な要素であったときの最適化のためです。 FORALLがアプリケーションで非常に限定されているのは、ループ最適化用に設計されたからです。また、FORALLはループ構造ではなく、割り当てであることにも注意してください。したがって、代入文だけがブロック内で使用できます。理論的には、DOループは、プロセッサがループするインデックスの順序について明示的な指示を与えます。 FORALL構造体は、配列がメモリにどのように格納されるかに基づいて、最適な順序をコンパイラが選択できるようにします。現代のコンパイラはDOのループベクトル化に非常に優れており、あなたはFORALLを使用して改善に気づかない可能性があるので、時間の経過とともにこれは意味を失いました。 PGIまたはifort -

を使用すると、コードのパフォーマンスを心配している場合、あなたはかなり異なるコンパイラを検討する必要がありますFORALLWHEREhere

に素敵な説明を参照してください。私自身の経験から、gfortranは開発には適していますが、実際にHPCには適していません。 pgf90またはifortでコンパイルされたコードでは、実行速度が数倍向上します。

+0

ありがとうございます、あなたはそれをかなり明確にしました。 –

6

Forall構造が実際にはあまりにも制限的であることが判明しており、アレイ操作のためだけに大いに有用である。正確な制限については、IBM Fortran - FORALLを参照してください。 Fortran 2008のdo concurrent構成はあまり限定的ではありません。readwrite文でも許可されています。 Intel Fortran - DO CONCURRENTおよびNew features of Fortran 2008を参照してください。

+0

Fortran 2008をサポートするコンパイラは多くありません。私はgfortran、最新の安定版(4.6?)を使用しています –

+1

Gfortran 4.6は、それを部分的にサポートしています。http://fortranwiki.org/fortran/show/Fortran+2008+status and http://gcc.gnu.org/ onlinesocs/gfortran/Fortran-2008-status.htmlのように、最新のgfortranで 'do concurrent'をサポートしていると主張しています。 –

+0

私はそれをする方法を学ぶ必要があります。 –