0

FORTRAN でループのベクトル化をバイパスすることは可能ですか? 私は特定のプロジェクトのために F77 標準に従って書いていますが、GNU gfortran は F95 などの最新の FORTRAN でコンパイルできます。特定の FORTRAN 標準がループのベクトル化を回避したかどうか、または gfortran にこれをオフにするフラグ/オプションがあるかどうかを知っている人はいますか?

更新: したがって、私の特定の問題に対する最終的な解決策は、反復変数の更新を許可しない FORTRAN DO ループで「DO」する必要があると思います。これについての言及は、この関連スレッドの @High Performance Mark の返信に記載されています... Loop vectorization and how to avoid it

[フォートに入り、シェルターのヌーブをRANします。]

4

4 に答える 4

3

Fortran の標準は一般に、言語をどのように実装するかについて沈黙しており、どのようなチップ アーキテクチャで言語のさまざまな機能を実装するための最良の、または良い (および悪い) オプションを決定するより適切な立場にあるコンパイラ作成者に任せています。 (s) 彼らは書いています。

ループのベクトル化をバイパスしたいと書いたとき、どういう意味ですか? 次の文では、これが FORTRAN77 プログラムでは利用できないことを示唆していますか? CPU がベクトル命令に従うことができる場合、最新の CPU 用のコンパイラがベクトル命令を生成することは完全に正常です。これは、プログラムが記述されている言語のバージョンに関係なく当てはまります。

本当にベクトル命令を生成したくない場合は、gfortran のドキュメントを注意深く調べる必要があります。これは私が使用しているコンパイラではないため、特定のオプションやフラグを示すことはできません。SSE レベルに特に注意を払いながら、アーキテクチャ固有のコード生成の機能を確認することをお勧めします。

すべてのループが明示的である場合 (配列全体の操作がない場合)、およびコードを他の方法でベクトル化するのが困難な場合 (ループ反復間の依存関係など) は、コンパイラーに強制的にループをベクトル化しないように強制できる可能性があります。しかし、優れた最新のコンパイラーは、干渉することなく、自分の利益のためにループをベクトル化するために最善を尽くします。

コンパイラにその性質に反するように強制しようとするのは、私にはかなりひねくれているように思えます。おそらく、なぜそれを行いたいのかをより詳細に説明してください。

于 2010-12-13T14:20:47.103 に答える
1

High Performance Markが書いたように、コンパイラは、結果が言語の規則に従っている限り、ソースコードを実装するためのマシン命令を自由に選択できます。ループのベクトル化の結果として出力値の違いを観察できないはずです...コードはより高速に実行されるはずです。では、なぜ気にするのですか?

最適化レベル間で違いが見られる場合があります。たとえば、一部のアーキテクチャでは、レジスタの精度が非常に高くなっています。

これらの種類のコンパイラ最適化を探す場所は、gccマニュアルです。それらはgccコンパイラスイート全体で共通であるため、そこにあります。

于 2010-12-13T14:42:13.443 に答える
1

最近のほとんどのコンパイラでは、コマンドライン オプション -O0 を使用して、ループのベクトル化を含むすべての最適化を無効にする必要があります。

これにより、バグが明らかに消えてしまうことが時々あります。ただし、通常、これは私のコードに何か問題があることを意味するため、この種のことが起こっている場合は、ほぼ間違いなくバグのあるプログラムを作成しています。

理論的には可能ですが、コンパイラにバグがある可能性ははるかに低く、別の fortran コンパイラでコードをコンパイルすることで簡単に確認できます。(gfortran や g95 など)。

于 2010-12-14T06:39:10.173 に答える