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

Intelコンパイラ利用法

最終更新日:2018年2月28日

Intelコンパイラはインテル Parallel Studio XE 2018 Cluster Editionを構成するソフトウェアのひとつです。 ここでは、プログラム言語Fortran, C, C++の翻訳・実行方法とバッチ処理用スクリプトの作成方法について解説します。


環境設定

システム・バージョン・利用範囲

  • サブシステムA
  • バージョン 九州大学構成員 学術研究機関構成員 民間利用の方
    2018
    2017
    2016
  • サブシステムB
  • バージョン 九州大学構成員 学術研究機関構成員 民間利用の方
    2018
    2017
    2016
  • 基本フロントエンド
  • バージョン 九州大学構成員 学術研究機関構成員 民間利用の方
    2018
    2017
    2016
  • 大容量フロントエンド
  • バージョン 九州大学構成員 学術研究機関構成員 民間利用の方
    2018
    2017
    2016

利用コマンド

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

言語処理系 コマンド 自動並列化* OpenMP*
非MPI並列 Fortran ifort -parallel -qopenmp
C icc
C++ icpc
MPI並列 Fortran mpiifort
C mpiicc
C++ mpiicpc

* 自動並列化およびOpenMPオプションはデフォルトでは無効です。


利用方法

環境設定(moduleコマンド)

moduleコマンドによる環境設定はコンパイル時と実行時の両方で行う必要があります。

2018 (2018.0.128)を利用する場合

$ module load intel/2018

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) ハイブリッド並列(MPI/OpenMP)プログラム

$ 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) ハイブリッド並列(MPI/OpenMP)プログラム

$ 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)、統計関数(疑似乱数生成含む)。


バッチ処理用スクリプトの記述例

実行可能ファイルをサブシステムのバッチ処理で実行する方法について説明します。


逐次プログラムの実行スクリプトは富士通コンパイラを用いた場合と同じジョブスクリプトです。 一方でノード内スレッド並列化プログラム、およびMPI並列(フラットMPIおよびハイブリッド並列) プログラムを実行する場合には、プロセス割り当てなどの制御をユーザが指定する必要があるため、 富⼠通のツールを⽤いた場合とはジョブスクリプトの書き方が異なります。


例1)ノード内スレッド並列(自動並列、および、OpenMP)プログラム


  • 仮想ノード数
  • :1ノード(1プロセス)
  • 仮想ノード当たりのコア数(スレッド数)
  • :36コア(36スレッド)
  • 最大経過時間
  • :10分
  • 標準エラー出力と標準出力を同じファイルに保存
  • :あり
  • ジョブリソースグループ(キュー)
  • :ito-g-4-dbg

    #!/bin/bash
    #PJM -L "rscunit=ito-b" 
    #PJM -L "rscgrp=ito-g-4-dbg"
    #PJM -L "vnode=1"
    #PJM -L "vnode-core=36"
    #PJM -L "elapse=10:00"
    #PJM -j
    #PJM -X
    
    module load intel/2018
    NUM_CORES=36
    export OMP_NUM_THREADS=$NUM_CORES
    ./a.out
    
    サブシステム名(ito-b)の指定
    リソースグループ(ito-g-4-dbg)の指定
    仮想ノード数を指定
    仮想ノードあたりのコア数を指定
    最大経過時間の指定
    標準エラー出力を標準出力に重ねる
    ジョブ投入時の環境変数をジョブ実行環境に継承
    
    環境設定
    OpenMP並列数(スレッド数)の指定
    
    ジョブの実行
    

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


  • プロセス数
  • :144プロセス
  • 物理ノード数(仮想ノード数)
  • :4ノード
  • プロセスの割り当て
  • :1ノードあたり36プロセス
  • 最大経過時間
  • :10分
  • 標準エラー出力と標準出力を同じファイルに保存
  • :あり
  • ジョブリソースグループ(キュー)
  • :ito-g-16-dbg

    #!/bin/bash
    #PJM -L "rscunit=ito-b" 
    #PJM -L "rscgrp=ito-g-16-dbg"
    #PJM -L "vnode=4"
    #PJM -L "vnode-core=36"
    #PJM -L "elapse=10:00"
    #PJM -j
    #PJM -X
    
    module load intel/2018
    
    NUM_NODES=${PJM_VNODES}
    NUM_CORES=36
    NUM_PROCS=144
    
    export I_MPI_PERHOST=$NUM_CORES
    export I_MPI_FABRICS=shm:ofa
    
    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-b)の指定
    リソースグループ(ito-g-16-dbg)の指定
    仮想ノード数(物理ノード数)を指定
    仮想ノードあたりのコア数を指定
    最大経過時間の指定
    標準エラー出力を標準出力に重ねる
    ジョブ投入時の環境変数をジョブ実行環境に継承
    
    環境設定
    
    物理ノード数を設定(vnodeの値を自動的に設定)
    物理ノードあたりのコア数を設定(vnode-coreと同じ値を設定)
    起動するMPIプロセス数を設定
    
    物理ノードあたりのMPIプロセス数設定(必須)
    ノード内及びノード間の通信手段設定(必須)
    
    
    
    
    
    MPIプログラムを起動
    

    上記のスクリプトにある、NUM_NODESNUM_CORES 及び NUM_PROCS を設定せずに、 これらの値を参照している箇所に直接数値を記述しても問題ありません.


    Intel MPIを利用する際には、MPIプログラム開始前にデーモンプログラムmpdが起動されます。 このmpdが物理ノードあたりに一つしか起動せず、また、mpdが動作している仮想ノードにしかプロセスが割り当てられません。 このことより物理ノードの36コア全てを利用するには、vnode-coreに36を指定し、 Intel MPI用の環境変数で割り当ての制御を行う必要があります。


    例3)ハイブリッド並列化プログラム


  • プロセス数
  • :16プロセス
  • 1プロセスあたりのスレッド数
  • :9スレッド
  • 物理ノード数(仮想ノード数)
  • :4ノード
  • プロセスの割り当て
  • :1ノードあたり4プロセス
  • 最大経過時間
  • :10分
  • 標準エラー出力と標準出力を同じファイルに保存
  • :あり
  • ジョブリソースグループ(キュー)
  • :ito-g-16-dbg

    #!/bin/bash
    #PJM -L "rscunit=ito-b" 
    #PJM -L "rscgrp=ito-g-16-dbg"
    #PJM -L "vnode=4"
    #PJM -L "vnode-core=36"
    #PJM -L "elapse=10:00"
    #PJM -j
    #PJM -X
    
    module load intel/2018
    
    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:ofa
    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-b)の指定
    リソースグループ(ito-g-16-dbg)の指定
    仮想ノード数(物理ノード数)を指定
    仮想ノードあたりのコア数を指定
    最大経過時間の指定
    標準エラー出力を標準出力に重ねる
    ジョブ投入時の環境変数をジョブ実行環境に継承
    
    環境設定
    
    物理ノード数を設定(vnodeの値を自動的に設定)
    物理ノードあたりのコア数を設定(vnode-coreと同じ値を設定)
    起動するMPIプロセス数の合計を設定
    プロセスあたりのOpenMPスレッド並列数を設定
    
    物理ノードあたりのMPIプロセス数設定(必須)
    ノード内及びノード間の通信手段設定(必須)
    プロセス及びスレッド割り当てに関する設定
    プロセス及びスレッド割り当てに関する設定
    
    OpenMPスレッド並列数を設定
    スタックサイズを設定
    スレッドとコアの対応関係を設定
    
    
    
    
    
    MPIプログラムを起動
    

    上記のスクリプトにある、NUM_NODESNUM_CORES 及び NUM_PROCS を設定せずに、 これらの値を参照している箇所に直接数値を記述しても問題ありません.


    Intel MPIを利用する際には、MPIプログラム開始前にデーモンプログラムmpdが起動されます。 このmpdが物理ノードあたりに一つしか起動せず、また、mpdが動作している仮想ノードにしかプロセスが割り当てられません。 このことより物理ノードの36コア全てを利用するには、vnode-coreに36を指定し、 Intel MPI用の環境変数で割り当ての制御を行う必要があります。


    参考資料

    マニュアル