5.4. BLAS/LAPACK/ScaLAPACKライブラリ¶
Fortran/C言語/C++からBLAS/LAPACK/ScaLAPACKを利用することができます。
BLAS(Basic Linear Algebra Subprograms)は、ベクトル演算や行列演算を行なうライブラリです。
LAPACK(Linear Algebra PACKage)は、線形代数の問題を解くライブラリです。
ScaLAPACK(Scalable LAPACK)は、線形代数分野の計算をメッセージパッシングで並列化したライブラリです。
5.4.1. Fortranコンパイル方法¶
FortranにおけるBLAS/LAPACK/ScaLAPACKのコンパイル方法を示します。
コンパイル例は以下のとおりです。
MPI/ScaLAPACK/BLAS,LAPACK(逐次版)
[_LNlogin]$ mpifrtpx -Kfast,SVE sample.f90 -SCALAPACK -SSL2
MPI/OpenMP/ScaLAPACK/BLAS,LAPACK(スレッド並列版)
[_LNlogin]$ mpifrtpx -Kfast,parallel,openmp,SVE sample.f90 -SCALAPACK -SSL2BLAMP
逐次/BLAS,LAPACK(逐次版)
[_LNlogin]$ frtpx -Kfast,SVE sample.f90 -SSL2
OpenMP/BLAS,LAPACK(スレッド並列版)
[_LNlogin]$ frtpx -Kfast,openmp,SVE sample.f90 -SSL2BLAMP
参考
BLAS、LAPACK逐次版を使用するには、frtpxコマンドに
-SSL2
を指定します。BLAS、LAPACKスレッド並列版を使用するには、
-Kopenmp
、および、-SSL2BLAMP
を指定します。ScaLAPACKを使用するには、mpifrtpxコマンドに
-SCALAPACK
をオプションとして指定します。また、BLAS、LAPACKの逐次版、スレッド並列版の種類に応じて、-SSL2
、または、-SSL2BLAMP
オプションも指定します。ログインノードで結合する場合、
-KSVE
が有効であれば、SVE
を使用したライブラリを結合します。ログインノードで結合する場合、
-KNOSVE
が有効であれば、汎用のライブラリを結合します。計算ノードで結合する場合、
-KSVE
と-KNOSVE
のどちらを指定してもSVE
を使用したライブラリを結合します。-KSVE
オプションのデフォルト(省略時)は、-KSVE
になります。ネイティブコンパイラでユーザプログラムを翻訳し、BLAS、LAPACKを結合する場合、frtコマンドを使用します。
ネイティブコンパイラでMPIプログラムを翻訳し、BLAS、LAPACKを結合する場合、mpifrtコマンドを使用します。
5.4.2. C言語コンパイル方法¶
C言語におけるBLAS/LAPACK/ScaLAPACKのコンパイル方法を示します。
コンパイル例は以下のとおりです。
MPI/ScaLAPACK/BLAS,LAPACK(逐次版)
[_LNlogin]$ mpifccpx -Kfast,SVE sample.c -SCALAPACK -SSL2
MPI/OpenMP/ScaLAPACK/BLAS,LAPACK(スレッド並列版)
[_LNlogin]$ mpifccpx -Kfast,parallel,openmp,SVE sample.c -SCALAPACK -SSL2BLAMP
逐次/BLAS,LAPACK(逐次版)
[_LNlogin]$ fccpx -Kfast,SVE sample.c -SSL2
OpenMP/BLAS,LAPACK(スレッド並列版)
[_LNlogin]$ fccpx -Kfast,openmp,SVE sample.c -SSL2BLAMP
参考
BLAS、LAPACK逐次版を使用するには、fccpxコマンドに
-SSL2
を指定します。BLAS、LAPACKスレッド並列版を使用するには、
-Kopenmp
、および、-SSL2BLAMP
を指定します。ScaLAPACKを使用するには、mpifccpxコマンドに
-SCALAPACK
をオプションとして指定します。また、BLAS、LAPACKの逐次版、スレッド並列版の種類に応じて、-SSL2
、または、-SSL2BLAMP
オプションも指定します。ログインノードで結合する場合、
-KSVE
が有効であれば、SVE
を使用したライブラリを結合します。ログインノードで結合する場合、
-KNOSVE
が有効であれば、汎用のライブラリを結合します。計算ノードで結合する場合、
-KSVE
と-KNOSVE
のどちらを指定してもSVE
を使用したライブラリを結合します。-KSVE
オプションのデフォルト(省略時)は、-KSVE
になります。ネイティブコンパイラでユーザプログラムを翻訳し、BLAS、LAPACK アーカイブを結合する場合、fccコマンドを使用します。
ネイティブコンパイラでMPIプログラムを翻訳し、BLAS、LAPACKを結合する場合、mpifccコマンドを使用します。
5.4.3. C++コンパイル方法¶
C++におけるBLAS/LAPACK/ScaLAPACKのコンパイル方法を示します。
コンパイル例は以下のとおりです。
MPI/ScaLAPACK/BLAS,LAPACK(逐次版)
[_LNlogin]$ mpiFCCpx -Kfast,SVE sample.cc -SCALAPACK -SSL2
MPI/OpenMP/ScaLAPACK/BLAS,LAPACK(スレッド並列版)
[_LNlogin]$ mpiFCCpx -Kfast,parallel,openmp,SVE sample.cc -SCALAPACK -SSL2BLAMP
逐次/BLAS,LAPACK(逐次版)
[_LNlogin]$ FCCpx -Kfast,SVE sample.cc -SSL2
OpenMP/BLAS,LAPACK(スレッド並列版)
[_LNlogin]$ FCCpx -Kfast,openmp,SVE sample.cc -SSL2BLAMP
参考
BLAS、LAPACK逐次版を使用するには、FCCpxコマンドに
-SSL2
を指定します。BLAS、LAPACKスレッド並列版を使用するには、
-Kopenmp
、および、-SSL2BLAMP
を指定します。ScaLAPACKを使用するには、mpiFCCpxコマンドに
-SCALAPACK
をオプションとして指定します。また、BLAS、LAPACKの逐次版、スレッド並列版の種類に応じて、-SSL2
、または、-SSL2BLAMP
オプションも指定します。ログインノードで結合する場合、
-KSVE
が有効であれば、SVE
を使用したライブラリを結合します。ログインノードで結合する場合、
-KNOSVE
が有効であれば、汎用のライブラリを結合します。計算ノードで結合する場合、
-KSVE
と-KNOSVE
のどちらを指定してもSVE
を使用したライブラリを結合します。-KSVE
オプションのデフォルト(省略時)は、-KSVE
になります。ネイティブコンパイラでユーザプログラムを翻訳し、BLAS、LAPACK アーカイブを結合する場合、FCCコマンドを使用します。
ネイティブコンパイラでMPIプログラムを翻訳し、BLAS、LAPACKを結合する結合する場合、mpiFCCコマンドを使用します。
5.4.4. サンプルプログラム(ScaLAPACK/FORTRAN)¶
サンプルプログラムを使用して、コンパイルからジョブ実行までの例を示します。
- ソースプログラムを用意します。サンプルプログラムを
/home/system/sample/SCALAPACK/sample_ScaLAPACK.f
として用意しています。 サンプルプログラムをコンパイルします。
[_LNlogin]$ mpifrtpx -V -Kfast,optmsg=2 -Nlst=t -o sample_ScaLAPACK sample_ScaLAPACK.f -SCALAPACK -SSL2
- ジョブスクリプトを用意します。ジョブスクリプトのサンプルは
/home/system/sample/SCALAPACK/sample_ScaLAPACK.sh
として用意しています。 pjsubコマンドでジョブを投入します。
[_LNlogin]$ pjsub sample_ScaLAPACK.sh [INFO] PJM 0000 pjsub Job 150 submitted.
5.4.5. 共有ライブラリの利用方法¶
BLAS、LAPACK、ScaLAPACK は「Fortranコンパイル方法」「C言語コンパイル方法」「C++コンパイル方法」で示した方法で結合すると、スタティックリンクになります。これとは別に、共有ライブラリも提供しています。共有ライブラリ版は動的ロードして使う場合を考慮し、アーカイブの構成および結合方法がスタティックリンク版と異なっています。
また共有ライブラリのBLAS、LAPACKでは整数型および論理型の引数が4バイト整数であるLP64インターフェースのライブラリに加えて、整数型および論理型の引数を8バイト整数とするILP64インターフェースのライブラリを使うことができます。ILP64インターフェースを使用する場合は、ILP64の共有ライブラリを指定してください。
5.4.5.1. BLAS、LAPACK 逐次版の Fortran からの利用方法¶
Fortranで書かれたユーザプログラムを翻訳し、BLAS 及び LAPACKの逐次版の共有ライブラリを結合するためには、frtpx 、または、frtコマンド行に、以下の表に示すオプションを指定します。
種類
結合オプション
LP64、汎用版
-lfjlapack
LP64、SVE版
-lfjlapacksve
ILP64、汎用版
-lfjlapack_ilp64
ILP64、SVE版
-lfjlapacksve_ilp64
このオプションはユーザプログラムよりも後ろに指定します。
利用方法の例は以下のとおりです。
Fortranで書かれたユーザプログラム
a.f
を翻訳し、SVE版 BLAS、LAPACKライブラリを結合します。
[_LNlogin]$ frtpx -Kfast,optmsg=2 a.f -lfjlapacksve
Fortranで書かれたユーザプログラム
a.f
を翻訳し、汎用版 BLAS、LAPACKライブラリを結合します。
[_LNlogin]$ frtpx -Kfast,optmsg=2 a.f -lfjlapack
Fortran で書かれたユーザプログラム
a.f
を翻訳し、ILP64 インターフェースのSVE版BLAS、LAPACKライブラリを結合します。ソースプログラムの基本整数型 および 基本論理型は、-CcdII8、-CcdLL8
オプションで、8バイトに拡張します。
[_LNlogin]$ frtpx -Kfast,optmsg=2 -CcdII8 -CcdLL8 a.f -lfjlapacksve_ilp64
OpenMP Fortran で書かれたユーザプログラム
a.f
を翻訳し、SVE版BLAS、LAPACK ライブラリを結合します。
[_LNlogin]$ frtpx -Kfast,openmp,optmsg=2 a.f -lfjlapacksve
Fortran で書かれたユーザプログラム
a.f
をネイティブコンパイラで翻訳し、SVE版BLAS、LAPACK ライブラリを結合します。
[_LNlogin]$ frt -Kfast,optmsg=2 a.f -lfjlapacksve
5.4.5.2. BLAS、LAPACK スレッド並列版の Fotran からの利用方法¶
Fortranで書かれたユーザプログラムを翻訳し、BLAS及びLAPACKのスレッド並列版の共有ライブラリを結合するためには、frtpx
、または、frt
コマンド行にオプション-Kopenmp
に加えて、以下の表に示すオプションを指定します。
種類
結合オプション
LP64、汎用版
-lfjlapackex
LP64、SVE版
-lfjlapackexsve
ILP64、汎用版
-lfjlapackex_ilp64
ILP64、SVE版
-lfjlapackexsve_ilp64
-Kopenmp
オプションのかわりに-Kparallel
オプションを指定することもできます。利用方法の例は以下のとおりです。
Fortran で書かれたユーザプログラム
a.f
を翻訳し、SVE版BLAS、LAPACK スレッド並列版ライブラリを結合します。
[_LNlogin]$ frtpx -Kfast,openmp,optmsg=2 a.f -lfjlapackexsve
Fortran で書かれたユーザプログラム
a.f
を翻訳し、汎用版BLAS、LAPACK スレッド並列版ライブラリを結合します。
[_LNlogin]$ frtpx -Kfast,openmp,optmsg=2 a.f -lfjlapackex
Fortran で書かれたユーザプログラム
a.f
を翻訳し、ILP64 インターフェースのSVE版BLAS、LAPACK スレッド並列版ライブラリを結合します。ソースプログラムの基本整数型 および 基本論理型は、-CcdII8、-CcdLL8
オプションで8バイトに拡張します。
[_LNlogin]$ frtpx -Kfast,openmp,optmsg=2 -CcdII8 -CcdLL8 a.f -lfjlapackexsve_ilp64
Fortran で書かれたユーザプログラム
a.f
をネイティブコンパイラで翻訳し、SVE版BLAS、LAPACK スレッド並列版ライブラリを結合します。
[_CNlogin]$ frt -Kfast,openmp,optmsg=2 a.f -lfjlapackexsve
Fortran で書かれたユーザプログラム
a.f
を逐次実行プログラムとして翻訳し、SVE版BLAS、LAPACK スレッド並列版ライブラリを結合します。
[_LNlogin]$ frtpx -Kfast,optmsg=2 -c a.f [_LNlogin]$ frtpx -Kfast,openmp a.o -lfjlapackexsve
Fortran で書かれたユーザプログラム
a.f
を自動並列化して翻訳し、SVE版BLAS、LAPACK スレッド並列版ライブラリを結合します。
[_LNlogin]$ frtpx -Kfast,parallel,optmsg=2 -c a.f [_LNlogin]$ frtpx -Kfast,parallel a.o -lfjlapackexsve
5.4.5.3. ScaLAPACKのFortranからの利用方法¶
ScaLAPACKを使用するユーザプログラムを翻訳しScaLAPACKの共有ライブラリを結合するためには、mpifrtpx、または、mpifrtコマンドを使用し、以下の表に示すオプションを指定します。
種類
結合オプション
LP64、汎用版
-lfjscalapack
LP64、SVE版
-lfjscalapacksve
ILP64、汎用版
-
ILP64、SVE版
-
-Kopenmp
オプションも一緒に指定します。利用方法の例は以下のとおりです。
Fortran で書かれたユーザプログラム
a.f
を翻訳し、SVE版ScaLAPACK ライブラリを結合します。BLAS、LAPACK は逐次版を結合します。
[_LNlogin]$ mpifrtpx -Kfast,optmsg=2 a.f -lfjscalapacksve -lfjlapacksve
Fortran で書かれたユーザプログラム
a.f
を翻訳し、汎用版ScaLAPACK ライブラリを結合します。BLAS、LAPACK は逐次版を結合します。
[_LNlogin]$ mpifrtpx -Kfast,optmsg=2 a.f -lfjscalapack -lfjlapack
Fortran で書かれたユーザプログラム
a.f
を翻訳し、SVE版ScaLAPACK ライブラリを結合します。BLAS、LAPACK はスレッド並列版を結合します。
[_LNlogin]$ mpifrtpx -Kfast,openmp,optmsg=2 a.f -lfjscalapacksve -lfjlapackexsve
Fortran で書かれたユーザプログラム
a.f
をネイティブコンパイラで翻訳し、SVE版ScaLAPACK ライブラリを結合します。BLAS、LAPACK はスレッド並列版を結合します。
[_CNlogin]$ mpifrt -Kfast,openmp,optmsg=2 a.f -lfjscalapacksve -lfjlapackexsve
5.4.5.4. BLAS、LAPACK逐次版のC、C++からの利用方法¶
-SSL2
、または、-SSL2BLAMP
を指定します。
種類
結合オプション
LP64、汎用版
-lfjlapack
LP64、SVE版
-lfjlapacksve
ILP64、汎用版
-lfjlapack_ilp64
ILP64、SVE版
-lfjlapacksve_ilp64
-SSL2
、または、-SSL2BLAMP
オプションはどちらを指定してもかまいません。-I$FJSVXTCLANGA/include/lapack_ilp64
を翻訳時のオプションに指定します。利用方法の例は以下のとおりです。
C で書かれたユーザプログラム
a.c
を翻訳し、SVE版BLAS、LAPACK ライブラリを結合します。
[_LNlogin]$ fccpx -Kfast,optmsg=2 a.c -lfjlapacksve -SSL2
C で書かれたユーザプログラム
a.c
を翻訳し、汎用版BLAS、LAPACK ライブラリを結合します。
[_LNlogin]$ fccpx -Kfast,optmsg=2 a.c -lfjlapack -SSL2
C で書かれたユーザプログラム
a.c
を翻訳し、ILP64 インターフェースのSVE版BLAS、LAPACK ライブラリを結合します。
[_LNlogin]$ fccpx -Kfast,optmsg=2 -I${FJSVXTCLANGA}/include/lapack_ilp64 a.c -lfjlapacksve_ilp64 -SSL2
C++で書かれたユーザプログラム
a.cpp
を翻訳し、SVE版BLAS、LAPACK ライブラリを結合します。
[_LNlogin]$ FCCpx -Kfast,optmsg=2 a.cpp -lfjlapacksve -SSL2
OpenMP C で書かれたユーザプログラム
a.c
を翻訳し、SVE版BLAS、LAPACKライブラリを結合します。
[_LNlogin]$ fccpx -Kfast,openmp,optmsg=2 a.c -lfjlapacksve -SSL2
OpenMP C で書かれたユーザプログラム
a.c
をネイティブコンパイラで翻訳し、SVE版BLAS、LAPACK ライブラリを結合します。
[_CNlogin]$ fcc -Kfast,openmp,optmsg=2 a.c -lfjlapacksve -SSL2
5.4.5.6. ScaLAPACK の C、C++からの利用方法¶
C、C++で書かれたユーザプログラムを翻訳し、ScaLAPACKの共有ライブラリを結合するためには、mpifccpx、mpiFCCpx、mpifcc、または、mpiFCCコマンドを使用します。
また、以下の表に示すオプション、および、使用するBLAS、LAPACKの種類に応じて、 BLAS、LAPACK逐次版のC、C++からの利用方法 、または、BLAS、LAPACKスレッド並列版のC、C++からの利用方法 の表に示すオプションを指定します。さらに、-SCALAPACK
に加えて -SSL2
、または、-SSL2BLAMP
を指定します。
種類
結合オプション
LP64、汎用版
-lfjscalapack
LP64、SVE版
-lfjscalapacksve
ILP64、汎用版
-
ILP64、SVE版
-
-SSL2
または、-SSL2BLAMP
オプションはどちらを指定してもかまいません。-Kopenmp
オプションも一緒に指定します。利用方法の例は以下のとおりです。
C で書かれたユーザプログラム
a.c
を翻訳し、SVE版ScaLAPACK ライブラリを結合します。BLAS、LAPACK は逐次版を結合します。
[_LNlogin]$ mpifccpx -Kfast,optmsg=2 a.c -lfjscalapacksve -lfjlapacksve -SSL2 -SCALAPACK
C で書かれたユーザプログラム
a.c
を翻訳し、汎用版ScaLAPACK ライブラリを結合します。BLAS、LAPACK は逐次版を結合します。
[_LNlogin]$ mpifccpx -Kfast,optmsg=2 a.c -lfjscalapack -lfjlapack -SSL2 -SCALAPACK
C で書かれたユーザプログラム
a.c
を翻訳し、SVE版ScaLAPACK ライブラリを結合します。BLAS、LAPACK は逐次版を結合します。
[_LNlogin]$ mpifccpx -Kfast,optmsg=2 a.c -lfjscalapacksve -lfjlapacksve -SSL2 -SCALAPACK
C++で書かれたユーザプログラム
a.cpp
を翻訳し、SVE版ScaLAPACK ライブラリを結合します。BLAS、LAPACK はスレッド並列版を結合します。
[_LNlogin]$ mpiFCCpx -Kfast,openmp,optmsg=2 a.cpp -lfjscalapacksve -lfjlapackexsve -SSL2 -SCALAPACK
C で書かれたユーザプログラム
a.c
をネイティブコンパイラで翻訳し、SVE版ScaLAPACK ライブラリを結合します。BLAS、LAPACK はスレッド並列版を結合します。
[_CNlogin]$ mpifcc -Kfast,openmp,optmsg=2 a.c -lfjscalapacksve -lfjlapackexsve -SSL2 -SCALAPACK
5.4.5.7. BLAS、LAPACK、ScaLAPACK を動的ロードして利用する方法¶
dlopen、dlsym 関数で動的ロードしてBLAS、LAPACK、ScaLAPACK ライブラリを利用する場合、dlopen 関数でにファイル名を指定してライブラリをロードします。
共有ライブラリのファイル名を以下の表に示します。
種類
BLAS、LAPACK逐次版
BLAS、LAPACKスレッド並列版
ScaLAPACK
LP64、汎用版
libfjlapack.so
libfjlapackex.so
libfjscalapack.so
LP64、SVE 版
libfjlapacksve.so
libfjlapackexsve.so
libfjscalapacksve.so
ILP64、汎用版
libfjlapack_ilp64.so
libfjlapackex_ilp64.so
-
ILP64、SVE 版
libfjlapacksve_ilp64.so
libfjlapackexsve_ilp64.so
-
dlopen、dlsym 関数を使ってBLAS、LAPACK、および、ScaLAPACKを使用する場合、結合時にライブラリを指定するオプションは必要ありません。
BLAS、LAPACK スレッド並列版を使用するユーザプログラムを結合する場合、結合時のオプションに
-Kopenmp
を指定します。fccpx、FCCpx、mpifccpxまたは mpiFCCpxコマンドを使ってユーザプログラムを結合する場合、
-SSL2
または-SSL2BLAMP
オプションも一緒に指定します。mpifccpxまたは、mpiFCCpxコマンドを使ってユーザプログラムと、ScaLAPACKライブラリを結合する場合、
-SCALAPACK
オプションも一緒に指定します。
利用方法の例は以下のとおりです。
BLAS、LAPACK 逐次版を動的ロードする Cプログラム
a.c
を翻訳、結合する。
[_LNlogin]$ fccpx -Kfast,optmsg=2 a.c -SSL2
BLAS、LAPACK スレッド並列版を動的ロードする Cプログラム
a.c
を翻訳、結合する。
[_LNlogin]$ fccpx -Kfast,openmp,optmsg=2 a.c -SSL2
ScaLAPACK および BLAS、LAPACK 逐次版を動的ロードする Cプログラム
a.c
を翻訳、結合する。
[_LNlogin]$ mpifccpx -Kfast,optmsg=2 a.c -SSL2 -SCALAPACK
ScaLAPACK および BLAS、LAPACK スレッド並列版を動的ロードする Cプログラム
a.c
を翻訳、結合する。
[_LNlogin]$ mpifccpx -Kfast,openmp,optmsg=2 a.c -SSL2 -SCALAPACK
BLAS、LAPACK 逐次版を動的ロードする Cプログラム
a.c
と、それを呼び出す Fortranプログラムb.f
を翻訳、結合する。
[_LNlogin]$ fccpx -c -Kfast,optmsg=2 a.c [_LNlogin]$ frtpx -Kfast,optmsg=2 b.f a.o
BLAS, LAPACK スレッド並列版を動的ロードする Cプログラム
a.c
と、それを呼び出す Fortranプログラムb.f
を翻訳、結合する。
[_LNlogin]$ fccpx -c -Kfast,optmsg=2 a.c [_LNlogin]$ frtpx -Kfast,openmp,optmsg=2 b.f a.o
ScaLAPACK および BLAS、LAPACK 逐次版を動的ロードする Cプログラム
a.c
と、それを呼び出す Fortran プログラムb.f
を翻訳、結合する
[_LNlogin]$ mpifccpx -c -Kfast,optmsg=2 a.c [_LNlogin]$ mpifrtpx -Kfast,optmsg=2 b.f a.o
ScaLAPACK および BLAS、LAPACK スレッド並列版を動的ロードする Cプログラム
a.c
と、それを呼び出す Fortran プログラムb.f
を翻訳、結合する
[_LNlogin]$ mpifccpx -c -Kfast,optmsg=2 a.c [_LNlogin]$ mpifrtpx -Kfast,openmp,optmsg=2 b.f a.o