Intelコンパイラ利用法
最終更新日:2023年4月7日
Intelコンパイラはインテル Parallel Studio XE Cluster Editionを構成するソフトウェアのひとつです。
ここでは、主にプログラミング言語Fortran, C, C++の翻訳・実行方法とバッチ処理用スクリプトの作成方法について解説します。
利用環境
システム・バージョン・利用範囲
- サブシステムA
バージョン |
九州大学構成員 |
学術研究機関構成員 |
民間利用の方 |
OneAPI 2022.3.1 |
○ |
○ |
○ |
OneAPI 2021.3 |
○ |
○ |
○ |
2020.1 |
○ |
○ |
○ |
2019.4 * |
○ |
○ |
○ |
2018.3 |
○ |
○ |
○ |
2017 |
○ |
○ |
○ |
2016 |
○ |
○ |
○ |
- サブシステムB
バージョン |
九州大学構成員 |
学術研究機関構成員 |
民間利用の方 |
OneAPI 2022.3.1 |
○ |
○ |
○ |
OneAPI 2021.3 |
○ |
○ |
○ |
2020.1 |
○ |
○ |
○ |
2019.4 * |
○ |
○ |
○ |
2018.3 |
○ |
○ |
○ |
2017 |
○ |
○ |
○ |
2016 |
○ |
○ |
○ |
- 基本フロントエンド
バージョン |
九州大学構成員 |
学術研究機関構成員 |
民間利用の方 |
OneAPI 2022.3.1 |
○ |
○ |
○ |
OneAPI 2021.3 |
○ |
○ |
○ |
2020.1 |
○ |
○ |
○ |
2019.4 * |
○ |
○ |
○ |
2018.3 |
○ |
○ |
○ |
2017 |
○ |
○ |
○ |
2016 |
○ |
○ |
○ |
*プロセス数が1,000を超えるMPIプログラムの実行の場合、エラーが発生する可能性があります。
その場合は 2018.3 をお使いください。
なお、その際、スクリプト内の I_MPI_FABRICS を shm:ofi から shm:ofa に変更してください。
利用コマンド
プログラム言語の翻訳・リンクのための書式とコマンドの一覧は以下の通りです。
|
言語処理系 |
コマンド |
自動並列化* |
OpenMP* |
非MPI並列 |
Fortran |
ifort |
-parallel |
-qopenmp |
C |
icc |
C++ |
icpc |
MPI並列 |
Fortran |
mpiifort |
C |
mpiicc |
C++ |
mpiicpc |
* 自動並列化およびOpenMPオプションはデフォルトでは無効です。
利用方法
環境設定(moduleコマンド)
moduleコマンドによる環境設定はコンパイル時と実行時の両方で行う必要があります。
OneAPI 2022.3.1を利用する場合
$ module load oneapi/2022.3.1 |
OneAPI 2021.3を利用する場合
$ module load oneapi/2021.3 |
2020 (2020.1)を利用する場合
$ module load intel/2020.1 |
2019 (2019.4)を利用する場合
$ module load intel/2019.4 |
2018 (2018.3.222)を利用する場合
$ module load intel/2018.3 |
2017 (2017.4.196)を利用する場合
2016 (2016.4.258)を利用する場合
C/C++
C/C++コンパイラにはicc
/ icpc
コマンドを用います。
またIntel MPIを利用する場合には,mpiicc
/ mpiicpc
コマンドを用います。
(以下のプログラム例では icc
およびmpiicc
のみを記載しますのでC++を使う場合はicpc
およびmpiicpc
に読み替えてください。)
例1)逐次プログラム
例2)ノード内スレッド並列(自動並列)プログラム
例3)ノード内スレッド並列(OpenMP)プログラム
例4)MPI並列(フラットMPI)プログラム
例5) ハイブリッド並列(OpenMP+MPI)プログラム
$ mpiicc -qopenmp sample.c |
Fortran
Fortranコンパイラは ifort
コマンドを利用します。
またIntel MPIを利用する場合には mpiifort
コマンドを利用します。
例1)逐次プログラム
例2) ノード内スレッド並列(自動並列)プログラム
$ ifort -parallel sample.f90 |
例3) ノード内スレッド並列(OpenMP)プログラム
$ ifort -qopenmp sample.f90 |
例4) MPI並列(フラットMPI)プログラム
例5) ハイブリッド並列(OpenMP+MPI)プログラム
$ mpiifort -qopenmp sample.f90 |
主なコンパイルオプション
コンパイルオプション |
説明 |
-c |
オブジェクトファイルまで作成します |
-o filename |
実行可能ファイル名/オブジェクトファイル名をfilenameに変更します。デフォルトの実行可能ファイル名は a.out |
-On |
最適化を行います [n=0〜3]。n の値が大きくなるに従って、最適化のレベルが上がります。
n=0の場合は最適化を行いません(nを省略した場合は -O2)
|
-fast |
-O3 よりもより細かな最適化を行います(-xHOST -O3 -ipo -no-prec-div -static -fp-model fast=2 と等価)
|
-parallel |
安全に並列化できるループに対して自動並列化を行います |
-guide[=n] |
-parallelと同時に使用された場合にループのベクトル化や自動並列化を促進するためのアドバイスを生成します[n=0-4]。
nが大きくなるほど細かなアドバイスが生成されます(nが省略された場合はn=4)
|
-qopenmp |
OpenMP指示行を認識してスレッド並列化したコードを生成します。このオプションはソースファイルの翻訳時だけでなくリンク(実行ファイル作成)時にも必要です
|
-opt-report [n] |
最適化に関するレポートを作成して標準エラー出力に出力します[n=0-3]。
nが大きいほど、より詳細な情報が出力されます(nを省略した場合はn=2。n=0の場合はレポートを作成しない)
|
-opt-report-routine=string |
文字列stringを含む関数、または、サブルーチンに対する最適化レポートを作成します |
-mkl |
数値演算ライブラリ Intel Math Kernel Library(MKL)をリンクします。
最適化されたBLAS、LAPACK、ベクトル演算ライブラリなどを利用する場合に用います。
機能が多いため、次節「数値演算ライブラリMKL(Intel Math Kernel Library)」の説明及び
ページ下部からリンクされているマニュアル等もご参照ください。
|
-mt_mpi (Intel MPI専用) |
スレッドセーフなMPIライブラリをリンクします。
MPI_THREAD_FUNNELED, MPI_THREAD_SERIALIZED、または、MPI_THREAD_MULTIPLEを使用している場合に用います。
ただし,コンパイルオプションに,-qopenmpまたは, -parallelを指定している場合には,このオプションなしでもスレッドセーフなMPIライブラリがリンクされます
|
-ilp64(Intel MPI専用) |
MPI関数中のすべての整数を64bit整数として取り扱います(ILP64サポート)。
Fortranコンパイラで-i8オプションを指定した場合に用います
|
-freeまたは-nofixed(Fortranのみ) |
ソースファイルを自由形式として扱います。 |
-fixedまたは-nofree(Fortranのみ) |
ソースファイルを固定形式として扱います。 |
-extend-source number |
固定形式の一行あたり文字数をnumberにします。72, 80, 132から選択が可能です。numberを指定しない場合は132になります。 |
コンパイルオプションについての詳細は、「インテル コンパイラー日本語マニュアル」(後述)をご参照下さい。
なお、スーパーコンピュータ納入業者である富士通株式会社の推奨最適化オプションは
-ipo -O3 -no-prec-div -fp-model fast=2 -xHost
です。
数値演算ライブラリMKL(Intel Math Kernel Library)
Intel Math Kernel Library(以下MKL)はインテルプロセッサに最適化された数値演算ライブラリです。
Intelコンパイラで -mkl
オプションをつけてリンクすればリンクされます。
-mkl
にはさらにサブオプションを付けることができます。
-mkl=sequtntial
はスレッド並列化されていないMKLをリンクします。
-mkl=parallel
はスレッド並列化されたMKLをリンクします。
-mkl=cluster
はMPI版の並列数値計算関数(ScaLAPACK, FFT, 直接法スパースソルバ)を使用する場合に指定するオプションです。
特にサブオプションを指定しない場合は-mkl=parallel
と同じになります。
MKLは以下の多岐にわたる機能を持ちます。
BLAS、LAPACK、ScaLAPACK、BLACS、PBLAS、Sparse BLAS、疎行列演算関数(PARDISO含む)、Fourier変換、
偏微分方程式、非線形最適化ソルバ、データフィッティング関数、GMP(多倍長計算)関数、
ベクトル化数学ライブラリ(VML)、統計関数(疑似乱数生成含む)。
バッチ処理
ITOのサブシステム A/BでIntelコンパイラで作成した実行可能ファイル(モジュール)を実行するためには、
「バッチ処理」と呼ばれる手続きにより計算サーバーに処理の依頼をする必要があります。
バッチ処理の詳細は バッチ処理を参照してください。
以下にIntelコンパイラで翻訳した実行可能ファイルをバッチ処理により処理するスクリプトの例を示します。
例1)逐次プログラム
仮想ノード数
|
:1ノード(1プロセス) |
仮想ノード当たりのコア数(スレッド数)
|
:1コア(1スレッド)(リソースグループの利用可能コア数を指定) |
最大経過時間
|
:10分 |
標準エラー出力と標準出力を同じファイルに保存
|
:あり |
ジョブリソースグループ(キュー)
|
:ito-single |
#!/bin/bash
#PJM -L "rscunit=ito-a"
#PJM -L "rscgrp=ito-single"
#PJM -L "vnode=1"
#PJM -L "vnode-core=1"
#PJM -L "elapse=10:00"
#PJM -j
#PJM -X
module load oneapi/2022.3.1
./a.out
|
|
サブシステム名(ito-a)の指定
リソースグループ(ito-single)の指定
仮想ノード数を指定
仮想ノードあたりのコア数を指定
最大経過時間の指定
標準エラー出力と標準出力をまとめて標準出力に書き出す
ジョブ投入時の環境変数をジョブ実行環境に継承
環境設定
プログラムの実行
|
|
例2)ノード内スレッド並列(自動並列、および、OpenMP)プログラム
仮想ノード数
|
:1ノード(1プロセス) |
仮想ノード当たりのコア数(スレッド数)
|
:36コア(36スレッド)(リソースグループの利用可能コア数を指定) |
最大経過時間
|
:10分 |
標準エラー出力と標準出力を同じファイルに保存
|
:あり |
ジョブリソースグループ(キュー)
|
:ito-ss-dbg |
#!/bin/bash
#PJM -L "rscunit=ito-a"
#PJM -L "rscgrp=ito-ss-dbg"
#PJM -L "vnode=1"
#PJM -L "vnode-core=36"
#PJM -L "elapse=10:00"
#PJM -j
#PJM -X
module load oneapi/2022.3.1
export OMP_NUM_THREADS=36
./a.out
|
|
サブシステム名(ito-a)の指定
リソースグループ(ito-ss-dbg)の指定
仮想ノード数を指定
仮想ノードあたりのコア数を指定(リソースグループの利用可能コア数を指定)
最大経過時間の指定
標準エラー出力と標準出力をまとめて標準出力に書き出す
ジョブ投入時の環境変数をジョブ実行環境に継承
環境設定
スレッド数の指定
プログラムの実行
|
|
例3)フラットMPI並列プログラム
プロセス数
|
:144プロセス |
物理ノード数(仮想ノード数)
|
:4ノード |
プロセスの割り当て
|
:1ノードあたり36プロセス |
最大経過時間
|
:10分 |
標準エラー出力と標準出力を同じファイルに保存
|
:あり |
ジョブリソースグループ(キュー)
|
:ito-s-dbg |
#!/bin/bash
#PJM -L "rscunit=ito-a"
#PJM -L "rscgrp=ito-s-dbg"
#PJM -L "vnode=4"
#PJM -L "vnode-core=36"
#PJM -L "elapse=10:00"
#PJM -j
#PJM -X
module load oneapi/2022.3.1
NUM_NODES=${PJM_VNODES}
NUM_CORES=36
NUM_PROCS=144
export I_MPI_PERHOST=$NUM_CORES
export I_MPI_FABRICS=shm:ofi
export I_MPI_HYDRA_BOOTSTRAP=rsh
export I_MPI_HYDRA_BOOTSTRAP_EXEC=/bin/pjrsh
export I_MPI_HYDRA_HOST_FILE=${PJM_O_NODEINF}
mpiexec.hydra -n $NUM_PROCS ./a.out
|
|
サブシステム(ito-a)の指定
リソースグループ(ito-s-dbg)の指定
仮想ノード数(物理ノード数)を指定
仮想ノードあたりのコア数を指定(= 物理ノード当たりのコア数を指定)
最大経過時間の指定
標準エラー出力と標準出力をまとめて標準出力に書き出す
ジョブ投入時の環境変数をジョブ実行環境に継承
環境設定
物理ノード数を設定(vnodeの値を自動的に設定)
物理ノードあたりのコア数を設定(vnode-coreと同じ値を設定)
起動するMPIプロセス数を設定
物理ノードあたりのMPIプロセス数設定(必須)
ノード内及びノード間の通信手段設定(必須) ※intel 2018以前はofi→ofaを指定
Intel MPIの起動方法に関する指定
MPIプログラムを起動
|
|
上記のスクリプトにある、NUM_NODES
、NUM_CORES
及び NUM_PROCS
を設定せずに、
これらの値を参照している箇所に直接数値を記述しても問題ありません.
例4)ハイブリッド並列化プログラム
プロセス数
|
:16プロセス |
1プロセスあたりのスレッド数
|
:9スレッド |
物理ノード数(仮想ノード数)
|
:4ノード |
プロセスの割り当て
|
:1ノードあたり4プロセス |
最大経過時間
|
:10分 |
標準エラー出力と標準出力を同じファイルに保存
|
:あり |
ジョブリソースグループ(キュー)
|
:ito-s-dbg |
#!/bin/bash
#PJM -L "rscunit=ito-a"
#PJM -L "rscgrp=ito-s-dbg"
#PJM -L "vnode=4"
#PJM -L "vnode-core=36"
#PJM -L "elapse=10:00"
#PJM -j
#PJM -X
module load oneapi/2022.3.1
NUM_NODES=$PJM_VNODES
NUM_CORES=36
NUM_PROCS=16
NUM_THREADS=9
export I_MPI_PERHOST=`expr $NUM_CORES / $NUM_THREADS`
export I_MPI_FABRICS=shm:ofi
export I_MPI_PIN_DOMAIN=omp
export I_MPI_PIN_CELL=core
export OMP_NUM_THREADS=$NUM_THREADS
export KMP_STACKSIZE=8m
export KMP_AFFINITY=compact
export I_MPI_HYDRA_BOOTSTRAP=rsh
export I_MPI_HYDRA_BOOTSTRAP_EXEC=/bin/pjrsh
export I_MPI_HYDRA_HOST_FILE=${PJM_O_NODEINF}
mpiexec.hydra -n $NUM_PROCS ./a.out
|
|
サブシステム(ito-a)の指定
リソースグループ(ito-s-dbg)の指定
仮想ノード数(物理ノード数)を指定
仮想ノードあたりのコア数を指定
最大経過時間の指定
標準エラー出力と標準出力をまとめて標準出力に書き出す
ジョブ投入時の環境変数をジョブ実行環境に継承
環境設定
物理ノード数を設定(vnodeの値を自動的に設定)
物理ノードあたりのコア数を設定(vnode-coreと同じ値を設定)
起動するMPIプロセス数の合計を設定
プロセスあたりのOpenMPスレッド並列数を設定
物理ノードあたりのMPIプロセス数設定(必須)
ノード内及びノード間の通信手段設定(必須) ※intel 2018以前はofi→ofaを指定
プロセス及びスレッド割り当てに関する設定
プロセス及びスレッド割り当てに関する設定
OpenMPスレッド並列数を設定
スタックサイズを設定
スレッドとコアの対応関係を設定
Intel MPIの起動方法に関する指定
MPIプログラムを起動
|
|
上記のスクリプトにある、NUM_NODES
、NUM_CORES
及び NUM_PROCS
を設定せずに、
これらの値を参照している箇所に直接数値を記述しても問題ありません.
参考資料
-
インテル コンパイラー日本語マニュアル
-
ログインノードの
/home/app/intel/intel2018_up3/documentation_2018/
から各種マニュアルを参照することができます。