Math Library

OpenBLAS

OpenBLAS は、GotoBLAS2 1.13 BSD に基づく、最適化されたライブラリです。
OpenBLAS には、ベクトル・行列に関する基本演算ライブラリーであるBLAS (Basic Linear Algebra Subprogam)および 連立一次方程式、固有値、固有ベクトルなどの線形計算ライブラリーであるLAPACK(Linear Algebra PACKage)が含まれます。
また、BLAS および LAPACK は Fortran形式であるため、それらをC言語から呼び出すためのインタフェースとして、 CBLAS および LAPACKE も含まれています。

利用方法

モジュール名は以下の通りです。

バージョンmodule名
シリアル版スレッド版
0.3.17OpenBLAS/0.3.17.serialOpenBLAS/0.3.17

なお、スレッド版の場合、スレッド数の指定は通常、環境変数 OPENBLAS_NUM_THREADS にて行ってください。 上記OpenBLAS/0.3.17をロードして環境設定を行うと、デフォルトでは OPENBLAS_NUM_THREADS は 1 に設定されていますので、 必要に応じて適宜、値を設定してください。

リンクする方法:
コンパイル時に -lopenblas をつけてください。

バッチスクリプトでの実行例(スレッド版)

以下に GNUコンパイラ + OpenBLAS(スレッド版)の場合のバッチスクリプトのサンプルを示します。 また、スレッド数は赤字部分になります。すべて同じ数字としてください。

#!/bin/csh
#PBS -q APC
#PBS -N title
#PBS -l select=1:ncpus=4

source /etc/profile.d/modules.csh
module load gcc/10.3.0
module load OpenBLAS/0.3.17

setenv OPENBLAS_NUM_THREADS 4

cd $PBS_O_WORKDIR

gfortran -o test ./test.f -lopenblas
./test

この例では、実行プロセス数は 4 と指定しています。

scaLAPACK

scaLAPACK は、MPI通信による並列化を実装した行列計算ライブラリーです。
内部には LAPACK のルーチンが含まれ、関数名は原則としてLAPACKの関数名の先頭に"P"がつけられています。
また、MPI通信による並列化を行うため、BLACS を利用します。

スパコンシステムで提供しているscaLAPACKのMPIライブラリとしてはOpenMPIを採用、 またBLAS, LAPACKのルーチンについては、OpenBLASを採用しています。

利用方法

scaLAPACKでは、BLASやLAPACKを利用するため、ここではOpenBLASを指定した場合の手順を示します。 また、MPI通信による並列化も行うため、以下の例ではMPIライブラリとしてはOpenMPIを使った例を示します。

バージョンmodule名
シリアル版スレッド版
2.1.0OpenBLAS/0.3.17.serial
openmpi/4.0.3
scalapack/2.1.0
OpenBLAS/0.3.17
openmpi/4.0.3
scalapack/2.1.0

ここでのシリアルやスレッドは、1つのMPIプロセスに対してシリアルかスレッドか、という意味になります。 スレッド版の場合、スレッド数の指定は通常、環境変数 OPENBLAS_NUM_THREADS にて行ってください。 上記OpenBLAS/0.3.17をロードして環境設定を行うと、デフォルトでは OPENBLAS_NUM_THREADS は 1 に設定されていますので、 必要に応じて適宜、値を設定してください。

リンクする方法:
コンパイル時に -lopenblas -lscalapack をつけてください。

バッチスクリプトでの実行例(ハイブリッド)

以下に GNUコンパイラ + OpenBLAS(スレッド版)+ OpenMPI の場合のバッチスクリプトのサンプルを示します。 また、スレッド数およびMPIプロセス数は赤字部分になります。mpiprocs= # と -np # を同じ数字としてください。

#!/bin/csh
#PBS -q APC
#PBS -N title
#PBS -l select=1:ncpus=8:mpiprocs=2

source /etc/profile.d/modules.csh
module load gcc/10.3.0
module load OpenBLAS/0.3.17
module load scalapack/2.1.0
module load openmpi/4.0.3

setenv OPENBLAS_NUM_THREADS 4

cd $PBS_O_WORKDIR

mpif90 -o test ./test.f -lopenblas -lscalapack
mpirun -np 2 ./test

この例では、MPIプロセスは2, 各MPIプロセスに対して生成されるOpenBLASのスレッド数は4 です。 したがって、ジョブ全体のプロセス数は、2 * 4 = 8 となります。

Intel oneMKL

Intel oneMKLは、BLAS, LAPACK, BLACS, scaLAPACK, PBLAS, Sparse Solver, ベクトル数学、ベクトル統計、データ適合、FFT/DFT、スパースBLAS、スパースソルバー 等の 多くの機能が含まれます。
以下に示すように、利用するコンパイラによって利用方法が異なりますのでご注意ください。

利用方法

バージョンに応じてモジュールを指定してください。最新版を利用したい場合は、mkl/latest となります。

バージョンmodule名
2021.2.0mkl/2021.2.0 または mkl/latest
2021.1.1mkl/2021.1.1

コンパイル時には以下の方法でライブラリをリンクしてください。なお、以下のリンクはサブルーチンの整数型引数がすべて 32bit の場合になります。 64bit 整数版については、関連サイトに記載の Intel Math Kernel Library Link Line Advisorを参照してください。

GNUコンパイラの場合:

シリアル版(gcc) -Wl,--no-as-needed -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread -lm -ldl
(gfortran) -Wl,--no-as-needed -lmkl_gf_lp64 -lmkl_sequential -lmkl_core -lpthread -lm -ldl
スレッド版(gcc) -Wl,--no-as-needed -lmkl_intel_lp64 -lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm -ldl
(gfortran) -Wl,--no-as-needed -lmkl_gf_lp64 -lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm -ldl
BLACS
シリアル版
シリアル版に -lmkl_blacs_intelmpi_lp64 を追加
BLACS
スレッド版
スレッド版に -lmkl_blacs_intelmpi_lp64 を追加
BLACS + scaLAPACK
シリアル版
シリアル版に -lmkl_scalapack_lp64 -lmkl_blacs_intelmpi_lp64 を追加
BLACS + scaLAPACK
スレッド版
スレッド版に -lmkl_scalapack_lp64 -lmkl_blacs_intelmpi_lp64 を追加

Intelコンパイラの場合:

シリアル版(icc/ifort) -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread -lm -ldl
スレッド版(icc/ifort) -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread -lm -ldl
BLACS
シリアル版
シリアル版に -lmkl_blacs_intelmpi_lp64 を追加
BLACS
スレッド版
スレッド版に -lmkl_blacs_intelmpi_lp64 を追加
BLACS + scaLAPACK
シリアル版
シリアル版に -lmkl_scalapack_lp64 -lmkl_blacs_intelmpi_lp64 を追加
BLACS + scaLAPACK
スレッド版
スレッド版に -lmkl_scalapack_lp64 -lmkl_blacs_intelmpi_lp64 を追加

Intel oneMKLの場合、シリアル版もしくはスレッド版は上記の通り、リンクするライブラリが異なります。 また、スレッド版でのスレッド数は以下に示すように、環境変数を使って指定します。

シリアル版環境変数 OMP_NUM_THREADS を 1 に設定します。または、シリアル版MKLをリンクします。
スレッド版環境変数 OMP_NUM_THREADS を並列実行数に設定します。 OpenMPプログラムにてMKLを利用する場合、OMP_NUM_THREADS で設定されたスレッド数で実行されます。 もし、OMP_NUM_THREADS とは異なるスレッド数でMKLを実行したい場合、MKL_NUM_THREADSを設定します。
MPIのみで並列実行MPIのみで並列実行したい場合、MKLがスレッド並列で動作しないように 環境変数 OMP_NUM_THREADS を 1 に設定するか、シリアル版MKLをリンクします。
ハイブリッド版MPIとスレッド並列のハイブリッドでの実行をしたい場合、MKLのスレッド数を OMP_NUM_THREADS もしくは MKL_NUM_THREADS で設定します。

バッチスクリプトでの実行例(ハイブリッド)

以下に GNUコンパイラ(Fortran) + Intel oneMKL(スレッド版)+ OpenMPI の場合のバッチスクリプトのサンプルを示します。 また、スレッド数およびMPIプロセス数は赤字部分になります。mpiprocs= # と -np # を同じ数字としてください。

#!/bin/csh
#PBS -q APC
#PBS -N title
#PBS -l select=1:ncpus=8:mpiprocs=2

source /etc/profile.d/modules.csh
module load mkl/latest
module load openmpi/4.0.3

setenv MKL_NUM_THREADS 4

cd $PBS_O_WORKDIR

mpif90 -o test ./test.f -Wl,--no-as-needed -lmkl_gf_lp64 -lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm -ldl
mpirun -np 2 ./test

この例では、MPIプロセスは2, 各MPIプロセスに対して生成される Intel oneMKL のスレッド数は 4 です。 したがって、ジョブ全体のプロセス数は、2 * 4 = 8 となります。

関連サイト