Spack とは
Spack(スパック)は、ローレンス・リバモア国立研究所(LLNL)で開発された、HPC環境向けの柔軟なパッケージマネージャーです。
一般的なLinuxのパッケージマネージャー(aptやyum)と異なり、HPCでは以下の要件が求められます。
- 性能の最大化: 特定のCPUアーキテクチャ(AVX-512など)に最適化してコンパイルしたい。
- コンパイラの多様性: GCC, Intel, NVIDIA (PGI), LLVMなど、異なるコンパイラを使い分けたい。
- MPIの依存関係: OpenMPI, MVAPICH2, Intel MPIなど、異なるMPIライブラリ上で動作させたい。
- バージョンの共存: 同じライブラリの「バージョン1.2」と「バージョン1.3」を同時に維持したい。
Spackは、これらの組み合わせを管理し、衝突することなくインストールすることができます。
インストール方法
以下のリポジトリをクローンし,読み込むだけ
git clone --depth=2 --branch=releases/v1.1 https://github.com/spack/spack.git
cd ./spack
source share/spack/setup-env.sh
最初にコンパイラを認識させるため,以下のコマンドを実行
spack compiler find
spack compilers
これでパスが通っているコンパイラが見つかるはずです.あとは,ライブラリやコンパイラをインストール出来ます.
コンパイラのインストール
例えば,私が使っている Ryzen9 9800X3D では AOCC コンパイラを利用する方が,性能が出るとされています.AOCC をインストールするには以下のコマンドを実行してください.
spack install aocc +license-agreed
たったこれだけで,AOCC のビルドからインストールまでやってくれます.
インストール後,AOCC コンパイラを使うには以下のコマンドでパスなどを読み込みます.
spack load aocc
ライブラリのインストール
インストール出来るライブラリの一覧は,以下のコマンドで見られます.
一度に数千件出るので注意です.
spack list
この中から,BLASライブラリを調べたいときには,以下の方法で検索できます.
spack list blas
OpenBLAS等が引っかかると思います.今回は,様々なOpenBLASをインストールしてその便利さを確かめたいと思います.BLAS を普段はマルチコアで動かし,MPI経由などではシングルスレッドで動かしたい.という要望はよくあります.このとき,ライブラリにサフィクスを付けて管理する方法もありますが,Spack ではもっと簡単出す.各ライブラリを aocc でコンパイル,その他いろいろなオプションでインストールするには以下の方法で出来ます.
# マルチスレッド版
spack install openblas +locking threads=openmp %aocc
# シングルスレッド版
spack install openblas +locking threads=none %aocc
意味としては +locking で USE_LOCKING オプションを有効化,threads でマルチ/シングル切り替え,%aocc で AOCCコンパイラでビルドです.
それぞれ,インストールされたライブラリを使用したいときは,load オプションで読み込むことが出来ます.
# マルチスレッド版
spack load openblas threads=openmp
# シングルスレッド版
spack load openblas threads=none
あとはビルドする時などに以下の記述を利用すれば,場所などは取得できます.
$(spack location -i openblas threads=none)
終わりに
以上,駆け足でしたが簡単に Spack の情報をまとめてみました.科学技術計算をやる上では,非常に便利なパッケージマネージャとなっているので,私みたいに研究を趣味としている人は是非使ってみてください.