--- title: 'Intelコンパイラ クラシック' --- [toc] ## 利用環境{#enviroment} ### 利用できるバージョン・システム{#version} バージョン | モジュールファイル名 | システムA | システムB/C | システムG | クラウドシステム | 備考 --- | --- | --- | --- | --- | --- | --- 2024.0 | intel/2024.0 | + | +| - | + | 2024年4月導入. Intelコンパイラ + MKL + TBB 2023.2 | intel/2023.2 | + | +| - | + | 2024年4月導入. Intelコンパイラ + MKL + TBB 2023.2-rt | intel/2023.2-rt | + | +| - | + | 2024年4月導入. ランタイムライブラリ 2023.1 (default) | intel/2023.1 | + | +| - | + | 2023年8月導入. Intelコンパイラ + MKL + TBB 2023.1-rt | intel/2023.1-rt | + | +| - | + | 2023年8月導入. ランタイムライブラリ 2022.3 | intel/2022.3 | + | + | - | + | 2022年11月導入. Intelコンパイラ + MKL + TBB 2022.3-rt | intel/2022.3-rt | + | + | - | + | 2022年11月導入. ランタイムライブラリ 注:Intelコンパイラの個別のバージョンではなく、Intel OneAPI の包括的なバージョンで記載しています。 \+ : すべてのユーザが利用可能 \- : 利用不可 システムA、B、C、クラウドシステムでは、システムにログインした時点でIntelコンパイラがデフォルトで設定されています。システムG は、動作検証をしていません。 ```nohighlight $ module list Currently Loaded Modulefiles: x) slurm x) SysB/2022 x) intel/2022.3 x) PrgEnvIntel/2022 ``` コンパイラのバージョンは、上表に記載のデフォルトのバージョンが設定されています。 Intelコンパイラのバージョンを切り替えたい場合は、PrgEnvIntel ごと切り替える必要があります。 以下のようにmoduleコマンドを実行してください。 ```nohighlight $ module switch PrgEnvIntel/2022 PrgEnvIntel/2023 ``` ログイン時に自動で環境設定を行いたい場合は、ログインシェルの起動ファイルに必要なmoduleコマンドを記述してください。詳細は [環境設定](/config) をご覧ください。 moduleコマンドの詳細は [Modules](/config/modules) をご覧ください。 ## コンパイル方法{#usage} ### コマンド{#command} | 言語 | コマンド | 実行形式 | | - | - | - | | C | icc | icc [オプション] ファイル名 | | C++ | icpc | icpc [オプション] ファイル名 | | Fortran | ifort | ifort [オプション] ファイル名 | ### オプション{#option} | オプション名 | 説明 | | - | - | | -o FILENAME | オブジェクトファイルの名前を指定します。| | -mcmodel=medium | 2Gbyteを超えてメモリを利用できるようになります。| | -shared-intel | インテルが提供するライブラリをすべて動的にリンクします。 | | -fpic | 位置に依存しないコードを生成します。| | -qopenmp | OpenMP指示子を有効にしてコンパイルします。| | -qmkl | MKLライブラリをリンクします。| | -parallel | 自動並列化を行います。 | | -O0 / -O1 / -O2 / -O3 | 最適化のレベルを指定します(デフォルトは-O2)。| | -fast | プログラムの実行速度が最大になるように最適化します。-fast オプションにより、次のオプションが自動で付与されます。<br>`-ipo, -O3, -no-prec-div, -static, -fp-model fast=2 -xHost `| | -ip | 単一ファイル内で、手続き間の処理を最適化します。 | | -ipo | 複数ファイル間で、手続き間の処理を最適化します。コンパイルに要する時間が大幅に増加します。| | -qopt-report | 実施した最適化についての情報を表示します。| | -xHost | コンパイルするホスト上のプロセッサで利用可能な最上位の命令セット向けのコードを生成します。| | -xCORE-AVX512<br/>-xCORE-AVX2 | Intelプロセッサ向けに,指定した命令セットに対応した最適化コードを生成します。| | -static-intel | インテルが提供するライブラリを静的にリンクします。静的リンクすることで、プログラム起動時の動的ライブラリ探索の負荷を下げる効果があります。 | | -Bstatic | -Bstatic オプションに続くコマンドライン上のすべてのライブラリを静的にリンクします。ただし、-Bdynamic オプションが途中で見つかった場合は、それ以降は動的にリンクします。| | -Bdynamic | -Bdynamic オプションに続くコマンドライン上のすべてのライブラリを動的にリンクします。ただし、-Bstatic オプションが途中で見つかった場合は、それ以降は静的にリンクします。| #### 2GB以上のメモリを使う場合のオプション 2GB以上のメモリを使うプログラムをコンパイルする場合は、以下のオプションを指定してください。 <br> `-mcmodel=medium -shared-intel` ## コンパイル例{#sample} ### 逐次プログラム{#serial} ```nohighlight $ icc test.c # C言語の例 $ icpc test.cpp # C++の例 $ ifort test.f90 # Fortranの例 $ tssrun ./a.out # 実行 ``` ### 自動並列化の利用{#auto_parallel} ```nohighlight $ ifort -parallel test.f90 $ tssrun --rsc p=1:t=4:c=4 ./a.out # 並列数4を指定して実行 ``` ### OpenMPの利用{#openmp} OpenMPは、プログラムの並列化のためのオープン規格です。 ソースコードに#pragma ompで始まる指示を書き込み、所定のオプションをつけてコンパイルするだけで、コンパイラに自動で並列化を行わせることができます。 OpenMPへの指示を書き込んだソースコードをコンパイルするには、-qopenmpオプションをつけます。 ```nohighlight $ icc -qopenmp test.c ``` コンパイルしたプログラムを実行する際、--rscオプションでtとcに並列数を指定すると、その並列数でプログラムが実行されます。 ```nohighlight $ tssrun --rsc p=1:t=8:c=8 ./a.out # 並列数8を指定して実行 ``` ### Coarrayの利用{#coarray} Coarrayは、Fortran 2008で追加された、プログラム並列化に関する機能です。 以下のようにコンパイルすることで、Coarrayを有効化することができます。 なお、srunを使ってcoarrayを実行する場合は、コンパイル時に **-coarray=single** と指定してください。 バッチ処理でsrunコマンドを使用せずに、プログラムを実行する場合は、 sharedやdistributedを指定して実行することも可能です。 ```nohighlight ## srunを使用する場合 $ ifort -coarray=single coarray.f90   ## srunを使用しない場合(会話型処理を除く) $ ifort -coarray=distributed coarray.f90 ``` コンパイルしたプログラムを実行する際は、--rscオプションで pに並列数を指定すると、 その並列数でプログラムが実行されます。 -coarrayオプションにsharedやdistributedを設定した場合は、FOR_COARRAY_NUM_IMAGES という環境変数に並列数を 指定する必要があります。 また、IntelMPIをInfiniband経由で使用する場合の不具合により、** MPIR_CVAR_CH4_OFI_ENABLE_RMA ** という 環境変数を「0」に設定した上で,ジョブを実行する必要があります。(2023年6月時点の情報) <!-- ```nohighlight $ export MPIR_CVAR_CH4_OFI_ENABLE_RMA=0 $ tssrun --rsc p=2 ./test_coarray # 並列数を「2」とする場合。 ``` --> ```nohighlight #!/bin/bash #============ Slurm Options =========== #SBATCH -p gr19999b # ジョブキュー(パーティション)の指定。投入したいキュー名に適宜変更が必要。 #SBATCH -t 1:00:00 # 経過時間の指定(1時間を指定する例)。 #SBATCH --rsc p=2 # 要求リソースの指定(Coarrayを2並列で実行する場合の例)。 #SBATCH -o %x.%j.out # ジョブの標準出力ファイルの指定。%xはジョブ名、%j はジョブIDに置換されます。 #============ Shell Script ============ # (任意) set -x を指定するとジョブスクリプトの実行経過を把握しやすくなります。 set -x # IntelMPIをInfiniband経由で使用する場合の不具合対応 export MPIR_CVAR_CH4_OFI_ENABLE_RMA=0 # 並列数を環境変数に設定 export FOR_COARRAY_NUM_IMAGES=${SLURM_DPC_NPROCS} # ジョブの実行 (-coarray=single の場合) srun ./a.out # 補足: -coarray=distributed や -coarray=shared の場合は、コンパイルした実行ファイル自体が # 内部的にmpiexecを呼び出すため、srun を使用せずに実行してください。 ``` ## コンパイル時メッセージ{#compile_message} Intel コンパイラは、プログラムの誤りや通知すべき情報があるときに、以下に示す形式でメッセージを出力します。 ### C/C++{#message_c} ```nohighlight ファイル名(行番号): XXX #YYY: メッセージ本文 ソースコードの該当行の内容 ^ ``` - XXX : メッセージ種別(error/warning) - YYY : メッセージの通し番号 - ポインタ(^) : ソースコードの該当行でエラーが発見された正確な場所 **出力例** ```nohighlight sample.c(27): warning #175: subscript out of range printf(" %d , %d\n",c[1][0],c[1][10]); ^ ``` ### Fortran{#message_fortran} ```nohighlight ファイル名(行番号): XXX #YYY: メッセージ本文 ソースコードの該当行の内容 --------------^ ``` - XXX : メッセージ種別(error/warning) - YYY : メッセージの通し番号 - ポインタ(^) : ソースコードの該当行でエラーが発見された正確な場所 **出力例** ```nohighlight sample.f90(26): error #5560: Subscript #2 of the array C has value 20 which is greater than the upper bound of 2 print *, c(1,1),",", c(1,20) -----------------------^ compilation aborted for sample.f90 (code 1) ``` ## 利用可能なライブラリ{#library} ### ランタイムライブラリ{#runtime} Intelコンパイラは共有ストレージである /opt/system/app/intel にインストールしています。 全ノードから共通のファイルを参照することができるため、ストレージ容量の節約と管理性の向上を図ることが可能です。 一方で、**全ノードからのアクセスが共有ストレージに集中する問題**があります。 この問題を解決するために、 システムA/B/Cの計算ノードのローカルストレージには、intelコンパイラのランタイムライブラリ(コンパイル機能を含まないライブラリ群)をインストールしてあります。 大規模なMPIプログラムの実行、アレイジョブによる大量のプログラムの起動、短時間のプログラムを繰り返し実行する場合等にランタイムライブラリを利用すると、/opt/system の負荷を軽減し、プログラムの起動を早める効果があります。 **ジョブスクリプトに次に示すmodule を切り替えるコマンドを記載いただくことで、簡易にご利用いただけますので、是非お試しください。** コンパイル時に静的リンクすることでも、同様な効果がありますが、動的リンクしかできないケースもありますので、そのような場合に是非ご利用ください。 #### Intelコンパイラをランタイムライブラリに切り替えるコマンド コンパイル時と同じバージョンのランタイムライブラリに切り替えてください。 ランタイムライブラリは、バージョン番号の末尾に「-rt 」が記載されているモジュールファイルです。 module switch に -f オプションをつけて強制的にswitchする必要があります。 ```nohighlight module switch -f intel/2022.3 intel/2022.3-rt -f もしくは module switch -f intel/2022.3-rt ``` #### Intel MPI をランタイムライブラリに切り替えるコマンド Intelコンパイラと同様に、module switch に -f オプションをつけて強制的にswitchする必要があります。 ```nohighlight module switch -f intelmpi/2022.3 intelmpi/2022.3-rt もしくは module switch -f intelmpi/2022.3-rt ``` #### ランタイムライブラリを使った例 以下の例は、4096並列で起動したMPIプログラムのジョブの完了までに要した経過時間を記載しています。 プログラムの演算部分を時間計測するとどちらも8秒以内に完了していますが、sacctで確認できるジョブ全体の経過時間では、ランタイムライブラリを使用することで、ジョブの経過時間が1分以上短縮されています。 ```nohighlight ## runtime ライブラリを未使用のジョブ(1分26秒) $ sacct -X -j 234069 -o jobid,elapsed JobID Elapsed ------------ ---------- 234069 00:01:26 ## runtime ライブラリを使用したジョブ (17秒) $ sacct -X -j 234060 -o jobid,elapsed JobID Elapsed ------------ ---------- 234060 00:00:17 ``` ### MPIライブラリ{#mpi_library} Intel MPIライブラリが利用できます。MPIプログラムのコンパイル、リンク、実行方法については、[Intel MPIライブラリ](/compilers/intelmpi) をご覧ください。 ### 数値計算ライブラリ{#numerical_library} Intelコンパイラを利用する場合、以下の数値計算ライブラリを利用できます。各ライブラリの利用方法については、個別のページをご覧ください。 ライブラリ | システムA | システムB | システムC | システムG | クラウド - | - [MKLライブラリ](/software/mkl) | + | + | + | - | + <!-- [NAGライブラリ](/compilers/nag) | AU [IMSLライブラリ](/compilers/imsl) | AU --> \+ : すべてのユーザが利用可能 AU : 学術研究機関限定で利用可能 \- : 利用不可 ## マニュアル{#manual} - [Intel C++ Compiler Classic Developer Guide and Reference](https://www.intel.com/content/www/us/en/develop/documentation/cpp-compiler-developer-guide-and-reference/top.html) - [Intel Fortran Compiler Classic and Intel Fortran Compiler Developer Guide and Reference](https://www.intel.com/content/www/us/en/develop/documentation/fortran-compiler-oneapi-dev-guide-and-reference/top.html)