インテルFortranコンパイラー:コンパイル時の最適化のヒント


21

私の研究室での個人的な経験から始めます。ifort 9と10日に戻って、-O3とプロセッサ固有のフラグ(たとえば、-xW -xSSE4.2)を使用してコンパイルする最適化に非常に積極的でした。しかし、ifort 11から始めて、次のことに気付き始めました
。1.結果にいくつかの矛盾があります(セマンティクスが保持されなかったため)
2. -O2に比べて小さいゲイン。

そのため、現在は、通常-O2と-xhostを使用してコンパイルするだけです。ifort 11でより良い提案がありますか?ifort 12に移行すると、これは再び変わりますか?前もって感謝します。


7
最適化はすべてのコードに一様に利益をもたらすわけではありません。したがって、より良い質問は「どのコンパイラ最適化が有効であるかを知るために、どのようにコードをプロファイリングできますか?」
マットネプリー

1
セマンティクスが保持されなかったため、または何かが並べ替えられたためですか?これはトピックから少し外れているかもしれませんが、問題を再現するコードの断片を見るのは良いことです。気に入らない方法で何かが並べ替えられたのかもしれませんが、コンパイラは大丈夫だと思っているのかもしれません。私の経験では、Intel 12は前任者のどれよりも優れたベクトル化の仕事をしているので、最新版に切り替えるとより多くの変更が行われることを期待しています。
ビル・バルト

セマンティクスが保存されていないと言うことは、順序付けが保存されないことに等しいと思いました。とにかく、私は自分の質問が(あまりにも?)ジェネリックであることに気付き、詳細にこだわることを望みませんでした。Intel 10にはいくつかの問題があり、コンパイラのバグと説明されていないものがありました。そのため、11で安全にプレイし、パフォーマンスに満足しています。しかし、おそらく私たちはそれをあまりにも安全にプレイしているので、コミュニティにアドバイスがあったかどうか知りたかったのです。
FrenchKheldar

回答:


16

すべてのユーザーが-O3 -xHost -ipoifort 11とifort 12の両方から始めることを強くお勧めします。一部の計算の精度に影響するO3によって特定の浮動小数点変換が有効になっている場合は、-fp-model precise -fp-model except(または、より劇的に-fp-model strict)キャッシュのループブロック、ループの融合と展開、メモリアクセスの最適化など、O3が有効にする他の最適化を保持します。

グローバルに無効にするのではなく、個々のファイルで浮動小数点モデルを試して、それが違いをもたらす場所を見つけることをお勧めします。15%程度のスピードバンプになる可能性があり、計算に影響を与えない場所でそれを維持できるようにする必要があります。精度がどこに影響されているかわからない場合は、それらのファイルの浮動小数点モデルフラグをオンまたはオフにして、または丸めモードで遊んでください

最近、x86用のgnuおよびintelコンパイラーに焦点を当てて、最適化フラグについてユーザーに短い話をしました。その講演のスライドはこちらで見ることができます

ちなみに、コードの最適化フラグを選択することについて話しているときは、コンパイラがループをベクトル化しようとして失敗した場所を確認するために、-vec-reportの出力を見る価値があります。ループに小さな変更を加えると、ベクトル化が可能になる場合があります(4倍の高速化が可能です)。同様に、より一般的な-opt-reportについても同様です。


私はあなたの答えが好きですが、私たちのテストケースの1つでもう一度試してみましたが、-O3 -xhost -fp-model precise -fp-model except結果は30%遅くなりました。プロファイリング-vec-reportをもう一度見て、何が起こっているのかを確認しようとしています...
FrenchKheldar

2
-O2 -xhost経由?それは面白い; それは非常に珍しいことですが、起こる可能性があります。このような場合、オプティマイザーは速度を向上させると考える正当な理由があることを行っていますが、事態は悪化します。通常、かなり単純な構造を持つ科学コードの場合、これは起こりません。-このようなケースでは、ガイド付き最適化のプロファイルsoftware.intel.com/sites/products/documentation/hpc/compilerpro/... -しばしば助けることができます。

5

IFortを使用して、Fortranで大規模で高度に技術的なアプリケーションを製造する会社で働いています。速度が(精度を維持しながら)主要なセールスポイントであるため、アプリケーションはパフォーマンスに非常に重要です。

私たちは常に-O3でコンパイルしますが、私の知る限り、-O3が行う主なことはループの展開とプリフェッチです。ほとんどの科学計算アプリケーション、特にループの最適化がこれらの恩恵を大いに受けると思います。かなり長い間、コンパイラエラーは発生していません(MacでIfortを使用しているときにいくつかのリンカエラーが発生しています)。11.1.095を使用します。

これがお役に立てば幸いです。


4

この答えはおそらく遠すぎて遅すぎると思いますが、積極的な最適化のためには、「-fast」オプションが最も簡単な解決策のようです。manページからの抜粋:

-fast
    Maximizes speed across the entire program.
    Description:
    This option maximizes speed across the entire program.

    It sets the following options:
     - On Linux* systems: -ipo, -O3, -no-prec-div, -static, and -xHost
     - On OS X* systems: -ipo, -mdynamic-no-pic, -O3, -no-prec-div, and -xHost
     - On Windows*  systems:  /O3,  /Qipo,  /Qprec-div-,  and /QxHost

    NOTE: Option fast sets some aggressive optimizations that may not be appropriate for all
    applications. The resulting executable may not run on processor types different from the
    one on which you compile. You should make sure that you understand the individual optimi-
    zation options that are enabled by option fast.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.