この記事は、インテル® ソフトウェア・サイトに掲載されている「Being Successful with the Intel® Compilers — You Need to Know」(http://software.intel.com/en-us/articles/being-successful-with-the-intel-compilers-you-need-to-know) の日本語参考訳です。
はじめに
この記事は、インテル® コンパイラーを初めて使用する開発者が、IA-32、インテル® 64、IA-64 プラットフォームの Microsoft* Windows*、Linux*、および OS X* オペレーティング・システム上でパフォーマンスを最大限に引き出せるように支援することを目的としています。
インテル® コンパイラーに関する一般的な質問とその回答を示し、コンパイラーの使用方法およびトラブルシューティング手法を含む問題への対応方法を説明します。さらに、この記事では、いくつかの最適化に関する高度な説明と、パフォーマンスを向上するヒントも提供します。
ソースをコンパイルできますか?
最初に、インテル® コンパイラーでソースコードをコンパイルできるかどうか試してください。Windows* では、インテル® C++ コンパイラーは、Microsoft* Visual C++* コンパイラーとソース/オブジェクトの互換性があるため、Microsoft* Visual C++* コンパイラーでコンパイルできるソースコードはコンパイルできます。インテル® Visual Fortran コンパイラー Windows* 版は、Compaq* Visual Fortran* と高いソース互換性があり、Fortran 95、Fortran 90、および Fortran 77 標準に準拠しています。
インテル® C++ コンパイラー Linux* 版および OS X* 版は、GNU* C/C++ とオブジェクト互換性があります。インテル® Fortran コンパイラー Linux* 版および OS X* 版も、Fortran 95、Fortran 90、および Fortran 77 標準に準拠しています。
ソースのコンパイルに失敗した場合、どうしたら良いですか?
コンパイルに失敗した場合は、サポートされていない言語拡張が使用されていないか、ソースコードを確認してください。例えば、(インテル® コンパイラーでサポートされていない) GNU* gcc 言語拡張を使用するファイルをコンパイルすると、コンパイラーは構文エラーを発行します。同様に、Fortran の場合、Fortran 95、Fortran 90、または Fortran 77 標準に違反するコードや、コンパイラーが認識しない言語拡張を含むコードをコンパイルすると、インテル® コンパイラーは構文エラーを発行します。
このような問題を解決する最良の方法は、標準に準拠し、サポートされていない言語拡張を含めずにソースコードを書き直すことです。インテル® コンパイラーは、ほかのコンパイラーでは問題ない場合でも、互換性のないソースコードに対してエラーを発行することがあります。
プログラムを実行できますか?
アプリケーションをビルドしたら、通常、次のステップでは一連のテストを行います。テストにより、正しい結果が出力されることを確認します。
テストに失敗した場合、どうしたら良いですか?
テストに失敗した場合は、最適化を無効にする /Od (Windows*) または -O0 (Linux*/OS X*) を指定して、ファイルを再度コンパイルしてみてください。最適化については後述します。
/Od を指定してもテストに失敗する場合は、恐らくソースコードに問題があります。コンパイラーが正しくないコードを生成している可能性もあります。その場合は、インテルに問題を報告してください。
どの最適化を使用すべきですか?
インテル® コンパイラーの基本的な最適化オプションは、次のとおりです。
- /Od (最適化なし) (Linux*: -O0)
- /O1 (コードサイズを抑えつつ、速度を最適化します)
- /O2 (速度を最適化します)
- /O3 (速度を最適化し、より強力な最適化を行います)
可能な場合は、/O2 最適化オプションを推奨します。インテル® コンパイラーは、デフォルトで /O2 を使用します。/O3 を使用すると、コンパイラーは強力な最適化を行うため、/O3 ですべてのテストを実施して、アプリケーションが正しく動作することを確認してください。
特定のプロセッサー向けにコンパイルするにはどうしたら良いですか?
Intel® Compiler Options for Intel® SSE and Intel® AVX generation (SSE2, SSE3, SSE3_ATOM, SSSE3, SSE4.1, SSE4.2, AVX, AVX2) and processor-specific optimizations を参照してください。
高度な最適化を行うにはどうしたら良いですか?
プロシージャー間の最適化 (-ipo および /Qipo) は、単一のファイルおよび複数のファイルを使用するプログラムのパフォーマンスを向上します。関数のインライン展開、プロシージャー間の定数の伝播、不要コードの排除などが行われます。
プロファイルに基づく最適化 (-prof_use および /Qprof_use) は、コンパイラーにランタイム情報を渡し、プログラムのパフォーマンスを向上します。分岐予測、キャッシュ効率、インライン展開する関数の選択を改善できます。
プロシージャー間の最適化やプロファイルに基づく最適化など、強力なコンパイラーの最適化を使用する際は、必ずアプリケーションをテストすることを推奨します。これらの最適化で問題が発生すると、標準の最適化よりもデバッグが困難です。
プログラムが /Od では問題なく、/O2 で失敗する場合、どうしたら良いですか?
プログラムが /Od では正常に実行され、/O2 で失敗する場合、まず問題を引き起こしているファイルを特定します。そして、そのファイルを /Od を使用してコンパイルします。ここでは、分割統治戦略が役立ちます。最初に、半分のファイル (例えば、ファイル名の先頭が a ~ m のもの) を /O2 でコンパイルし、残りのファイルを /Od でコンパイルします。プログラムを問題なく実行できれば、ファイル名の先頭が n ~ z のファイルに問題があり、a ~ m のファイルは /O2 でコンパイルできることが分かります。次の「精度を心配する必要はありますか?」セクションを参照してください。
精度を心配する必要はありますか?
最適化を有効にすると、精度がやや低下することがあります。例えば、IA-32 上では、倍精度浮動小数点値は 80 ビットとして x87 FPU レジスターに格納され、中間の計算はこの精度で行われます。x87 FPU レジスターからメモリーに格納されるときに、値は宣言された精度に丸められます。精度のわずかな差が問題になるコードでは、最適化により動作が変わる可能性があります。その場合は、-fp-model precise (Linux*/OS X*) または /fp:precise (Windows*) を指定して IEEE 精度を強制するか、コードを書き直してください。これらのコンパイラー・オプションは、アプリケーションのパフォーマンスに影響する場合があります。詳細は、「インテル® コンパイラーの浮動小数点演算における結果の一貫性」 を参照してください。
プログラムが遅い場合、どうしたら良いですか?
ソフトウェアの “80/20 ルール” では、プログラムの実行時間の 80% はコードの 20% で費やされます。プログラムで時間がかかっている場所を特定することができる、インテル® VTune™ Amplifier XE のようなパフォーマンス解析ツールを使用することを推奨します。実行時間の大部分が費やされているソース行を特定し、コードのパフォーマンスを向上するためのヒントが得られます。
まとめ: このほかにも質問がある場合、どうしたら良いですか?
インテルでは、皆さんにインテル® コンパイラーを活用していただくことを願っています。日本語でのご質問は iSUS フォーラム を活用いただけます。技術的な問題やテクニカルサポートが必要な場合は、製品をご購入いただくとインテル® プレミアサポートによる製品サポートを 1 年間ご利用いただけます。インテル® プレミアサポートは、30 日間の評価期間中もご利用いただけます。サポートをご利用になるには、https://registrationcenter.intel.com/RegCenter/Register.aspx で登録を行ってから、https://premier.intel.com/ から問題を送信してください。開発サポートエンジニアが 1 営業日以内に回答いたします。
コンパイル時の問題を送信する場合は、問題を再現できるテストケースをお送りください。C++ に関する問題の場合は、/P (Windows*) または -E (Linux*/OS X*) オプションを指定してコンパイルし、生成される前処理済みファイルをお送りください。前処理済みファイルには、ソースファイル中のすべてのコードと、#if 処理で削除されないすべてのインクルード・ヘッダー・ファイルが含まれます。テストケースをお送りいただけない場合、可能な限り、提供いただいた情報を基にテストケースの作成を試みますが、ほとんどの場合、問題を再現することは困難です。ランタイム時の問題を送信する場合は、プログラム中の問題の関数と、その関数を呼び出す、問題を再現できるドライバーをお送りください。
パフォーマンスに関する問題の場合は、可能な限り、インテル® VTune™ Amplifier XE のようなパフォーマンス解析ツールを使用して、問題の原因を特定してください。
注: 一般に、お送りいただくテストケースは小さいほうが、より迅速に対応することができます。
すべての場合において、使用した全コンパイラー・オプションまたは Visual Studio* プロジェクトをお送りください。また、該当する場合は、リンカーオプションとランタイム引数/環境の設定もご連絡ください。
関連情報
- インテル® コンパイラー無料評価版
- インテル® コンパイラー/インテル® Composer XE、および インテル® VTune™ Amplifier XE の詳細。製品概要、ケーススタディー、入門ガイド、互換性情報などを掲載しています。
- iSUS フォーラム
- ナレッジベース
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。