ホーム > システム > 玄界 > 玄界ソフトウェア > Intel onAPI, Intel MPI

Intelコンパイラ利用法

最終更新日:2024年8月2日


Intelコンパイラはインテル oneAPI ベース & HPC ツールキットを構成するソフトウェアのひとつです。 ここでは、主にプログラミング言語Fortran, C, C++の翻訳・実行方法とバッチ処理用スクリプトの作成方法について解説します。


利用環境

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

  • ノードグループA
バージョン 九州大学構成員 学術研究機関構成員 民間利用の方
OneAPI 2024.1
OneAPI 2023.2
  • ノードグループB
バージョン 九州大学構成員 学術研究機関構成員 民間利用の方
OneAPI 2024.1
OneAPI 2023.2
  • ノードグループC
バージョン 九州大学構成員 学術研究機関構成員 民間利用の方
OneAPI 2024.1
OneAPI 2023.2

利用コマンド

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

言語処理系 コマンド 最適化オプション*1 OpenMP*2
非MPI並列 Fortran ifort -xCORE-AVX512 -qopenmp
C icc
C++ icpc
MPI並列*3 Fortran mpiifort
C mpiicc
C++ mpiicpc

*1 最適化されたロードモジュールを作成するための推奨オプションです。
*2 OpenMPオプションはデフォルトでは無効です。
*3 MPI 並列を使用する場合はMPI ライブラリのmodule のロードが必要です。


利用方法

環境設定(moduleコマンド)

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

OneAPI 2024.1を利用する場合

$ module load intel/2024.1

OneAPI 2023.2を利用する場合

$ module load intel/2023.2

Intel MPIを利用する場合

$ module load intel
$ module load impi


C/C++

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

例1)逐次プログラム
$ icc sample.c

例2)ノード内スレッド並列(OpenMP)プログラム
$ icc -qopenmp sample.c

例3)MPI並列(フラットMPI)プログラム
$ mpiicc sample.c

例4)ハイブリッド並列(OpenMP+MPI)プログラム
$ mpiicc -qopenmp sample.c


Fortran

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

例1)逐次プログラム
$ ifort ample.f90

例2) ノード内スレッド並列(OpenMP)プログラム
$ ifort -qopenmp sample.f90

例3) MPI並列(フラットMPI)プログラム
$ mpiifort sample.f90

例4) ハイブリッド並列(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 と等価)
-qopenmp OpenMP指示行を認識してスレッド並列化したコードを生成します。このオプションはソースファイルの翻訳時だけでなくリンク(実行ファイル作成)時にも必要です
-opt-report[n] 最適化に関するレポートを作成して標準エラー出力に出力します[n=0-3]。
nが大きいほど、より詳細な情報が出力されます(nを省略した場合はn=2。n=0の場合はレポートを作成しない)
-opt-report-routine=string 文字列stringを含む関数、または、サブルーチンに対する最適化レポートを作成します
-qmkl 数値演算ライブラリ 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を指定している場合には,このオプションなしでもスレッドセーフなMPIライブラリがリンクされます
-ilp64(Intel MPI専用) MPI関数中のすべての整数を64bit整数として取り扱います(ILP64サポート)。 Fortranコンパイラで-i8オプションを指定した場合に用います
-freeまたは-nofixed(Fortranのみ) ソースファイルを自由形式として扱います。
-fixedまたは-nofree(Fortranのみ) ソースファイルを固定形式として扱います。
-extend-source number 固定形式の一行あたり文字数を_number_にします。72, 80, 132から選択が可能です。_number_を指定しない場合は132になります。

コンパイルオプションについての詳細は、「インテル コンパイラー日本語マニュアル」(後述)をご参照下さい。


数値演算ライブラリMKL(Intel Math Kernel Library)

Intel Math Kernel Library(以下MKL)はインテルプロセッサに最適化された数値演算ライブラリです。 Intelコンパイラで -qmklオプションをつけてリンクすればリンクされます。
-qmklにはさらにサブオプションを付けることができます。 -qmkl=sequtntialはスレッド並列化されていないMKLをリンクします。 -qmkl=parallelはスレッド並列化されたMKLをリンクします。 -qmkl=clusterはMPI版の並列数値計算関数(ScaLAPACK, FFT, 直接法スパースソルバ)を使用する場合に指定するオプションです。 特にサブオプションを指定しない場合は-qmkl=parallelと同じになります。

MKLは以下の多岐にわたる機能を持ちます。

BLAS、LAPACK、ScaLAPACK、BLACS、PBLAS、Sparse BLAS、疎行列演算関数(PARDISO含む)、Fourier変換、 偏微分方程式、非線形最適化ソルバ、データフィッティング関数、GMP(多倍長計算)関数、 ベクトル化数学ライブラリ(VML)、統計関数(疑似乱数生成含む)。


バッチ処理

GENKAIのサブシステム A/BでIntelコンパイラで作成した実行可能ファイル(モジュール)を実行するためには、 「バッチ処理」と呼ばれる手続きにより計算サーバーに処理の依頼をする必要があります。

バッチ処理の詳細は バッチ処理を参照してください。

以下にIntelコンパイラで翻訳した実行可能ファイルをバッチ処理により処理するスクリプトの例を示します。

例1)逐次プログラム

#!/bin/bash

#PJM -L rscgrp=a-batch
#PJM -L vnode-core=1
#PJM -L elapse=0:10:00
#PJM -j

module load intel

./a.out
  • 1ノード、1プロセス、1コア(1スレッド)
  • 最大結果時間10分
  • 標準エラー出力と標準出力を同じファイルに保存

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

#!/bin/bash

#PJM -L rscgrp=a-batch
#PJM -L vnode-core=16
#PJM -L elapse=1:00:00
#PJM -j

module load intel
export OMP_NUM_THREADS=16

./a.out
  • 1ノード、1プロセス、16スレッド
  • 最大結果時間1時間

例3)単一ノード(共有)フラットMPI並列プログラム

#!/bin/bash

#PJM -L rscgrp=a-batch
#PJM -L vnode-core=16
#PJM --mpi proc=16
#PJM -L elapse=1:00:00
#PJM -j

module load intel
module load impi

mpiexec ./a.out
  • 1ノード、16プロセス

例4)単一ノード(共有)ハイブリッド並列化プログラム

#!/bin/bash

#PJM -L rscgrp=a-batch
#PJM -L vnode-core=32
#PJM --mpi proc=4
#PJM -L elapse=2:00:00
#PJM -j

module load intel
module load impi
export OMP_NUM_THREADS=8

mpiexec ./a.out
  • 1ノード、4プロセス、8スレッド

例5)単一ノード(専有)MPI並列ジョブ用スクリプト

#!/bin/bash

#PJM -L rscgrp=a-batch
#PJM -L node=1
#PJM --mpi proc=32
#PJM -L elapse=2:00:00
#PJM -j

module load intel
module load impi

mpiexec ./a.out

例6)複数ノード(専有)MPI並列ジョブ用スクリプト

#!/bin/bash

#PJM -L rscgrp=a-batch
#PJM -L node=2
#PJM --mpi proc=120
#PJM -L elapse=2:00:00
#PJM -j

module load intel
module load impi

mpiexec ./a.out

参考資料