ホーム > システム > スーパーコンピュータシステムITO > インテルコンパイラ利用法

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 に変更してください。

利用コマンド

プログラム言語の翻訳・リンクのための書式とコマンドの一覧は以下の通りです。

コマンド [option] file [...]
言語処理系 コマンド 自動並列化* 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)を利用する場合

$ module load intel/2017

2016 (2016.4.258)を利用する場合

$ module load intel/2016

C/C++

C/C++コンパイラにはicc / icpcコマンドを用います。 またIntel MPIを利用する場合には,mpiicc / mpiicpcコマンドを用います。 (以下のプログラム例では iccおよびmpiiccのみを記載しますのでC++を使う場合はicpcおよびmpiicpcに読み替えてください。)


例1)逐次プログラム

$ icc sample.c

例2)ノード内スレッド並列(自動並列)プログラム

$ icc -parallel sample.c

例3)ノード内スレッド並列(OpenMP)プログラム

$ icc -qopenmp sample.c

例4)MPI並列(フラットMPI)プログラム

$ mpiicc sample.c

例5) ハイブリッド並列(OpenMP+MPI)プログラム

$ mpiicc -qopenmp sample.c

Fortran

Fortranコンパイラは ifortコマンドを利用します。 またIntel MPIを利用する場合には mpiifort コマンドを利用します。


例1)逐次プログラム

$ ifort sample.f90

例2) ノード内スレッド並列(自動並列)プログラム

$ ifort -parallel sample.f90

例3) ノード内スレッド並列(OpenMP)プログラム

$ ifort -qopenmp sample.f90

例4) MPI並列(フラットMPI)プログラム

$ mpiifort sample.f90

例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_NODESNUM_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_NODESNUM_CORES 及び NUM_PROCS を設定せずに、 これらの値を参照している箇所に直接数値を記述しても問題ありません.


    参考資料