その他の考慮事項

インテル® oneAPI DPC++/C++ コンパイラーと GCC にはいくつかの大きな違いがあります。インテル® oneAPI DPC++/C++ コンパイラーでソースコードをコンパイルする際は、次のことに注意してください。

環境設定

インテル® oneAPI DPC++/C++ コンパイラーは、コンパイラーのバイナリー、ライブラリー、man ページ、ライセンスファイルの場所を環境変数から読み取ります。これらの環境変数は、GCC が使用する環境変数とは異なる場合があります。また、これらの変数はインテル® oneAPI DPC++/C++ コンパイラーをインストールしても、デフォルトで設定されません。インテル® oneAPI DPC++/C++ コンパイラーを実行する前に、次の環境変数を設定できます。

これらの環境変数を設定するには、setvars.sh スクリプトをソースします (source setvars.sh)。

setvars.sh を使用してこれらの環境変数を設定すると、GCC との競合が発生しません。同じシェルで両方のコンパイラーを使用することができます。

最適化の使用

インテル® oneAPI DPC++/C++ コンパイラーは、インテル® アーキテクチャーで実行する際に、アプリケーションからより高いパフォーマンスを引き出すための最適化コンパイラーです。そのため、O2 オプションなどの特定の最適化は、インテル® oneAPI DPC++/C++ コンパイラーのデフォルトの起動の一部として実行されます。デフォルトでは、GCC コンパイラーは最適化をオフにします。これは O0 でのコンパイルに相当します。次の表は、O<n> オプションの比較です。

オプション

インテル® oneAPI DPC++/C++ コンパイラー

GCC

-O0

最適化をオフにします。

デフォルト。最適化をオフにします。

-O1

速度がある程度向上し、コードサイズは減少します。

速度がある程度向上し、コードサイズは減少します。

-O2

デフォルト。コードサイズはある程度増加しますが、速度について最適化します。O オプションと同じです。組込み関数、ループアンロール、インライン展開が行われます。

コードサイズが増加しない限り、速度について最適化します。例えば、アンロールやインライン展開は行われません。

-O3

O2 オプションの最適化に加えて、プリフェッチ、スカラー置換、ループ変換、およびメモリーアクセス変換などのより強力な最適化を有効にします。

コードサイズは大きくなりますが、速度について最適化します。O2 オプションの最適化のほか、ループアンロール、インライン展開が行われます。

インテル® プロセッサーを対象にする

両コンパイラーで特定のプロセッサーを対象とする同様のオプションは多くありますが、インテル® コンパイラーには最新のプロセッサーを対象としたプロセッサー固有の命令スケジュールを利用するオプションが含まれています。

設定の変更

インテル® oneAPI DPC++/C++ コンパイラーでは、コンパイルの一環として設定ファイルと応答ファイルの管理が行われます。設定ファイルに格納されるオプションは、すべてのコンパイルに適用され、応答ファイルに格納されるオプションはコマンドラインに追加された場合に適用されます。各ビルドに適用される make ファイルにいくつかのオプションがある場合は、これらのオプションを設定ファイル (icx.cfg または icpx.cfg (C++) または dpcpp.cfg (DPC++)) に移動すると簡単です。

マルチユーザーのネットワーク環境では、icx.cfg または icpx.cfg (C++) または dpcpp.cfg (DPC++) ファイルにリストされているオプションは、通常、コンパイラーを使用するすべてのユーザーを対象としています。個別の設定が必要な場合は、ICXCFG または ICPXCFG (C++) または DPCPPCFG (DPC++) 環境変数を使用して、/my_code/my_config.cfg などのように自分の .cfg ファイルの名前と場所を指定できます。コンパイラーに異なる設定ファイルを使用するように指示すると、常にシステムの設定ファイル (icx.cfg または icpx.cfg (C++) または dpcpp.cfg (DPC++)) は無視されます。

インテルのライブラリーの使用

インテル® oneAPI DPC++/C++ コンパイラーは、よく使用される多くの関数の最適化された実装を含む追加ライブラリーを提供します。これらの関数の一部は、CPU ディスパッチを使用して実装されています。これは、さまざまなプロセッサーで実行されたときに異なるコードが実行されることを意味します。

提供されるライブラリーには、インテルの数学ライブラリー (libimf)、SVML (libsvml)、libirc などがあります。これらのライブラリーはデフォルトでリンクされます。sinmemset のような一部のライブラリー関数は、コンパイラーがコードをインライン展開するため、ライブラリーへの呼び出しが不要な場合もあります。

インテル® コンパイラーの数学ライブラリーには、さまざまなインテル® プラットフォーム向けにパフォーマンスが最適化された実装が含まれています。デフォルトでは、ハードウェアに最適な実装がランタイムに選択されます。ライブラリーがマルチスレッド・コードをディスパッチすると、データ競合が発生することがあります。これは、特定のソフトウェア解析ツールで検出できます。しかし、スレッドが同じ CPUID を持つコア上で実行されている限り、これらのデータ競合は無害であり、問題にはなりません。

インテルの数学ライブラリー (libimf)

インテル® コンパイラーでは、デフォルトでインテルの数学ライブラリー (libimf) がリンクされます。sin などの関数の場合、コンパイラーですでに sin 関数の計算方法が認識されているため、このライブラリーへの呼び出しは不要です。インテルの数学ライブラリーには、標準の数学ライブラリーにはない関数も含まれています。

GCC では、インテルの数学ライブラリーの呼び出しは行えません。

libimfライブラリーの多くのルーチンは、互換マイクロプロセッサーよりもインテル製マイクロプロセッサーでより最適化されます。

SVML (Short Vector Mathematical Library) (libsvml)

ベクトル化が行われるとき、コンパイラーは libimf 数学ライブラリー関数への呼び出しを libsvml 関数に変換することがあります。これらの関数は、インテルの数学ライブラリーと同じ基本演算を実装しますが、ショートベクトルのオペランドで演算を行います。そのため、効率が向上します。場合によっては、libsvml 関数は、対応する libimf 関数より多少精度が低くなります。

libimfライブラリーの多くのルーチンは、互換マイクロプロセッサーよりもインテル製マイクロプロセッサーでより最適化されます。

libirc

libirc には、よく使用される文字列関数とメモリー関数の最適化された実装が含まれています。例えば、memcpymemset の最適化されたバージョンがあります。memcpy および memset への呼び出しがあれば、コンパイラーは自動的にこれらの関数への呼び出しを生成します。また、コンパイラーは memcpy あるいは memset に相当するループをこれらの関数へ変換することもあります。

libirc ライブラリーの多くのルーチンは、互換マイクロプロセッサーよりもインテル製マイクロプロセッサーでより最適化されます。

製品および性能に関する情報

性能は、使用状況、構成、その他の要因によって異なります。詳細については、http://www.intel.com/PerformanceIndex/ (英語) を参照してください。

注意事項の改訂 #20201201

関連情報