Intelコンパイラ クラシック

バージョン モジュールファイル名 システムA システムB/C システムG クラウドシステム 備考
2024.0 intel/2024.0 + + + + 2024年4月導入. Intelコンパイラ + MKL + TBB
2024.0-gpu intel/2024.0-gpu - - + - 2024年9月導入. Intel oneAPI for NVIDIA GPU
2023.2 (default) intel/2023.2 + + + + 2024年4月導入. Intelコンパイラ + MKL + TBB
2023.2-gpu intel/2023.2 - - + - 2024年9月導入. Intel oneAPI for NVIDIA GPU
2023.2-rt intel/2023.2-rt + + + + 2024年4月導入. ランタイムライブラリ
2023.2-rt-gpu intel/2023.2-rt - - + - 2024年9月導入. Intel oneAPI for NVIDIA GPU. ランタイムライブラリ
2023.1 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コンパイラがデフォルトで設定されています。

$ module list
Currently Loaded Modulefiles:
x) slurm x) SysB/2022  x) intel/2022.3 x) PrgEnvIntel/2022 

システムGでは、NVIDIA HPC SDKコンパイラがデフォルトで利用できるようになっています。以下のようにmoduleコマンドを実行し、コンパイラを切り替えてください。

$ module switch PrgEnvNvidia PrgEnvIntel

コンパイラのバージョンは、上表に記載のデフォルトのバージョンが設定されています。 Intelコンパイラのバージョンを切り替えたい場合は、PrgEnvIntel ごと切り替える必要があります。 以下のようにmoduleコマンドを実行してください。

$ module switch PrgEnvIntel/2022 PrgEnvIntel/2023

ログイン時に自動で環境設定を行いたい場合は、ログインシェルの起動ファイルに必要なmoduleコマンドを記述してください。詳細は 環境設定 をご覧ください。 moduleコマンドの詳細は Modules をご覧ください。

言語 コマンド 実行形式
C icc icc [オプション] ファイル名
C++ icpc icpc [オプション] ファイル名
Fortran ifort ifort [オプション] ファイル名

オプション名 説明
-o FILENAME オブジェクトファイルの名前を指定します。
-mcmodel=medium 2Gbyteを超えてメモリを利用できるようになります。
-shared-intel インテルが提供するライブラリをすべて動的にリンクします。
-fpic 位置に依存しないコードを生成します。
-qopenmp OpenMP指示子を有効にしてコンパイルします。
-qmkl MKLライブラリをリンクします。
-parallel 自動並列化を行います。
-O0 / -O1 / -O2 / -O3 最適化のレベルを指定します(デフォルトは-O2)。
-fast プログラムの実行速度が最大になるように最適化します。-fast オプションにより、次のオプションが自動で付与されます。
-ipo, -O3, -no-prec-div, -static, -fp-model fast=2 -xHost
-ip 単一ファイル内で、手続き間の処理を最適化します。
-ipo 複数ファイル間で、手続き間の処理を最適化します。コンパイルに要する時間が大幅に増加します。
-qopt-report 実施した最適化についての情報を表示します。
-xHost コンパイルするホスト上のプロセッサで利用可能な最上位の命令セット向けのコードを生成します。
-xCORE-AVX512
-xCORE-AVX2
Intelプロセッサ向けに,指定した命令セットに対応した最適化コードを生成します。
-static-intel インテルが提供するライブラリを静的にリンクします。静的リンクすることで、プログラム起動時の動的ライブラリ探索の負荷を下げる効果があります。
-Bstatic -Bstatic オプションに続くコマンドライン上のすべてのライブラリを静的にリンクします。ただし、-Bdynamic オプションが途中で見つかった場合は、それ以降は動的にリンクします。
-Bdynamic -Bdynamic オプションに続くコマンドライン上のすべてのライブラリを動的にリンクします。ただし、-Bstatic オプションが途中で見つかった場合は、それ以降は静的にリンクします。

2GB以上のメモリを使うプログラムをコンパイルする場合は、以下のオプションを指定してください。
-mcmodel=medium -shared-intel

$ icc test.c      # C言語の例
$ icpc test.cpp   # C++の例
$ ifort test.f90      # Fortranの例
$ tssrun ./a.out  # 実行

$ ifort -parallel test.f90
$ tssrun --rsc p=1:t=4:c=4 ./a.out # 並列数4を指定して実行

OpenMPは、プログラムの並列化のためのオープン規格です。 ソースコードに#pragma ompで始まる指示を書き込み、所定のオプションをつけてコンパイルするだけで、コンパイラに自動で並列化を行わせることができます。

OpenMPへの指示を書き込んだソースコードをコンパイルするには、-qopenmpオプションをつけます。

$ icc -qopenmp test.c

コンパイルしたプログラムを実行する際、--rscオプションでtとcに並列数を指定すると、その並列数でプログラムが実行されます。

$ tssrun --rsc p=1:t=8:c=8 ./a.out # 並列数8を指定して実行

Coarrayは、Fortran 2008で追加された、プログラム並列化に関する機能です。 以下のようにコンパイルすることで、Coarrayを有効化することができます。 なお、srunを使ってcoarrayを実行する場合は、コンパイル時に -coarray=single と指定してください。 バッチ処理でsrunコマンドを使用せずに、プログラムを実行する場合は、 sharedやdistributedを指定して実行することも可能です。

## 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月時点の情報)

#!/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 を使用せずに実行してください。

Intel コンパイラは、プログラムの誤りや通知すべき情報があるときに、以下に示す形式でメッセージを出力します。

ファイル名(行番号): XXX #YYY: メッセージ本文
ソースコードの該当行の内容
^
  • XXX : メッセージ種別(error/warning)
  • YYY : メッセージの通し番号
  • ポインタ(^) : ソースコードの該当行でエラーが発見された正確な場所

出力例

sample.c(27): warning #175: subscript out of range
    printf(" %d , %d\n",c[1][0],c[1][10]);
                                    ^                                    

ファイル名(行番号): XXX #YYY: メッセージ本文
ソースコードの該当行の内容
--------------^
  • XXX : メッセージ種別(error/warning)
  • YYY : メッセージの通し番号
  • ポインタ(^) : ソースコードの該当行でエラーが発見された正確な場所

出力例

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)

Intelコンパイラは共有ストレージである /opt/system/app/intel にインストールしています。 全ノードから共通のファイルを参照することができるため、ストレージ容量の節約と管理性の向上を図ることが可能です。

一方で、全ノードからのアクセスが共有ストレージに集中する問題があります。

この問題を解決するために、 システムA/B/Cの計算ノードのローカルストレージには、intelコンパイラのランタイムライブラリ(コンパイル機能を含まないライブラリ群)をインストールしてあります。 大規模なMPIプログラムの実行、アレイジョブによる大量のプログラムの起動、短時間のプログラムを繰り返し実行する場合等にランタイムライブラリを利用すると、/opt/system の負荷を軽減し、プログラムの起動を早める効果があります。

ジョブスクリプトに次に示すmodule を切り替えるコマンドを記載いただくことで、簡易にご利用いただけますので、是非お試しください。 コンパイル時に静的リンクすることでも、同様な効果がありますが、動的リンクしかできないケースもありますので、そのような場合に是非ご利用ください。

コンパイル時と同じバージョンのランタイムライブラリに切り替えてください。 ランタイムライブラリは、バージョン番号の末尾に「-rt 」が記載されているモジュールファイルです。

module switch に -f オプションをつけて強制的にswitchする必要があります。

module switch -f intel/2022.3 intel/2022.3-rt -f
もしくは
module switch -f intel/2022.3-rt

Intelコンパイラと同様に、module switch に -f オプションをつけて強制的にswitchする必要があります。

module switch -f intelmpi/2022.3 intelmpi/2022.3-rt
もしくは
module switch -f intelmpi/2022.3-rt

以下の例は、4096並列で起動したMPIプログラムのジョブの完了までに要した経過時間を記載しています。 プログラムの演算部分を時間計測するとどちらも8秒以内に完了していますが、sacctで確認できるジョブ全体の経過時間では、ランタイムライブラリを使用することで、ジョブの経過時間が1分以上短縮されています。

## 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

Intel MPIライブラリが利用できます。MPIプログラムのコンパイル、リンク、実行方法については、Intel MPIライブラリ をご覧ください。

Intelコンパイラを利用する場合、以下の数値計算ライブラリを利用できます。各ライブラリの利用方法については、個別のページをご覧ください。

ライブラリ システムA システムB システムC システムG クラウド
MKLライブラリ + + + - +

+ : すべてのユーザが利用可能
AU : 学術研究機関限定で利用可能
- : 利用不可