1

Portland Group FORTRAN 90 コンパイラーに関連した非常に奇妙な問題があります。配列のオーバーフローに依存して正しく動作するコードを実行しようとしています。私はこのコードを書いていません!オリジネーターは、フラグ「-tp=piii」を使用してコンパイルし、コンパイラーに配列オーバーフローを無効にする最適化を強制的に行わないようにしなければなりませんでした。古い P3 用に作成されたコンパイラは、この種のことを行うにはあまりにも原始的だったという考えだと思います。同じことをしようとすると、「pgf90-Fatal --tp piii is not supported in this installation.」というメッセージが表示されます。だから同じことはできない。

では、pgf90 のデフォルト操作は、コードが必要とする配列オーバーフローの種類を無効にしますか? 私が一緒に働いている人々は、明らかにそうだと思っています。もしそうなら、「-tp=piii」フラグから必要なものを取得するために使用できる他のフラグはありますか?

このような質問を受けるとは思わなかったに違いありません。の気持ちを考えてみてください。はい、キーパーにやらせてくれるよう説得でき次第、書き直します。

4

2 に答える 2

2

私はもはや PGI コンパイラに精通しておらず、そのドキュメントを手元に持っていないため、必要なコンパイラ オプションに直接案内することはできませんが、配列境界境界チェックなどでインデックスが作成されます。

Fortran 90 までは、配列境界を無視する、または無視するコードを書くのが一般的でした。そのように書かれたコードの多くはまだ世に出回っており、私は (ほとんどの Fortran プログラマーと同様に) 定期的に遭遇します。悲しいことに (それは議論の余地があります)、コードを書くための受け入れ可能な方法であるという態度も同様です。もし私が野放しの態度に出くわしたら、極度の偏見をもってそれを終わらせます。

暴言...現在広く使用されているFortranコンパイラの少なくともいくつかのデフォルトの動作は、実行時にプログラムが配列の境界の外に出たときに癇癪を起こすコードを自動的に生成しないことです。ただし、それらのすべてには、実行時に境界チェックを含むコードを生成するオプションがあります。

実行時に配列の境界をチェックしないということは、通常、コードが高速になることを意味し、ほとんどの Fortran ユーザーは、コンパイラのデフォルトの動作を説明するための高速なコードに非常に関心があります。

結論として、継承したコードの必要な動作を再現するのにそれほど苦労する必要はありません。PGI コンパイラが配列の境界をチェックしないようにデフォルト設定されていない場合、少し驚かれることでしょう。ただし、機能のオンとオフを切り替えるオプションは間違いなくあります。

于 2012-08-31T20:29:00.080 に答える
0

誰かが「piii」フラグで同じ問題に遭遇した場合に備えて、最近の PGI コンパイラはこのフラグをサポートしています....32 ビット ライブラリがインストールされている場合。そして、結局のところ、私はそうではありません。

于 2012-09-01T00:19:59.127 に答える