Spackとは
Spackは、科学技術計算向けソフトウェアを管理するパッケージマネージャーです。各ソフトウェア(パッケージ)について、バージョン、コンパイラ、依存ライブラリ、ビルドオプションが異なる構成を容易に共存させることができます。構成の単位をspecと呼びます。
Spack的に正しい用語か自信はありませんが、本稿では以下の用語を用います。
- パッケージ:Spackに登録されている(インストール可能な)アプリケーションソフトウェア
- spec:パッケージに設定を反映してインストールした、利用可能な構成
オブジェクト指向に例えると、パッケージはクラス、specはインスタンス、です。パッケージとspecの関係は、一対多です(多重継承はありません)。
例えば、HDF5(パッケージ)のMPI対応版と非対応版を、それぞれ別のspecとして区別してインストールできます。
以下、3つのパートに分けて使い方を説明します。
- (システムに)導入済みのSpackを利用する
- 自分でSpackをインストールした後、アプリケーションをインストールする
- アプリケーションをSpack対応する
ここで説明する他にも、豊富な機能が用意されています。公式ドキュメントも参照してください。
導入済みのSpackを利用する
(管理者に)指定された Spack の初期化スクリプトを読み込みます。
パス(/path/to/spack/)を実際のインストール場所に読み替えてください。
source /path/to/spack/share/spack/setup-env.sh
初期化スクリプトは、新しいターミナルを開く度に読み込みます。
Bashの起動(ログイン)時に読み込む場合は、~/.bashrc に先のコマンドを追加します。
spackコマンドが利用できることを確認します。
# バージョンとヘルプの確認
spack --version
spack --help
インストール済みspecの一覧を表示します。
spack find -x
# ハッシュ値付きで表示
spack find -lx
オプションなしのspack findは、依存しているspec含めて全て表示します。ほとんどの場合、ロードするのは-x付きで表示されるspecだろうと思います。利用したいspecが見つかれば、ロードします。
spack load openmx
同じ名前のspecが複数ある場合は、ハッシュ値で区別します。
spack load /abcdefg
ロード済みのspec一覧を表示します。
spack find --loaded
ロード済みのspecを、アンロードします。
spack unload openmx
自分でSpackを導入する
Spackをインストールする前に、対応しているアプリケーション(パッケージ)をWebで検索できます。
Spack本体のインストール
Spackは、管理者権限不要で各種アプリケーション(パッケージ)を簡単にインストールできます。
まず、Spack本体を準備します。
# 開発版をインストール。インストール先は、`./spack`
git clone --depth=2 https://github.com/spack/spack.git
# インストール先を指定する場合
git clone --depth=2 https://github.com/spack/spack.git "$HOME/spack"
# バージョンを指定する場合
git clone --branch v1.2.0 -depth=2 https://github.com/spack/spack.git
# 環境設定
source "$HOME/spack/share/spack/setup-env.sh"
# 動作確認
spack --version
Bashの起動(ログイン)時に読み込む場合は、~/.bashrc に次の行を追加します。
source "$HOME/spack/share/spack/setup-env.sh"
外部コンパイラの確認
ソースからのビルドには、(ほとんどの場合)コンパイラが必要です。
検出・登録したのち、一覧を確認します。
# PATH 上のコンパイラを検出・登録
spack compiler find
# 登録済みコンパイラを表示
spack compiler list
spack compilers
パスが通っていれば、oneAPIのコンパイラを自動で認識します。けれども、CUDAのコンパイラは見つけてくれない、ようです。
spack external find cuda
CUDAのコンパイラが認識されていることを確認します。
spack config get packages
アプリケーションのインストール
spack list は、Spackに用意されている(インストール可能な)パッケージの一覧を表示します。
# 全パッケージ
spack list
# 候補を絞り込む
spack list vim
興味あるパッケージがあれば、説明を確認します。
spack info neovim
パッケージ名を指定してインストールします。
# NVIDIA HPC SDK
spack install nvhpc
# AMD Optimizaing C/C++ and Fortran Compilers (AOCC)
spack install aocc +license-agreed
aoccのインストールには、+license-agreedオプションが必要です。
aoccのinfoから抜粋します。
(前略)
Variants:
build_system [generic] generic
Build systems supported by the package
license-agreed [false] false, true
Confirm acceptance of the EULA (https://www.amd.com/en/developer/aocc/aocc-compiler/eula.html)
(後略)
インストールには、ライセンス(EULA)への同意が必要です。license-agreedの既定値はfalseなので、「同意」する場合は、先頭に+を付与します(trueを指定)。逆に、既定値がtrueの項目(variant)をfalseに変える場合は、先頭に~(チルダ)を付与します。
複数バージョンのインストール
LAMMPSには様々なオプション(variants)が用意されています。
spack info lammps
利用する機能に応じたオプションを追加してインストールします。
specコマンドで具体的に選ばれる構成を確認できます。
# 確認のみ、インストールしない
spack spec lammps ~mpi
# OpenMPを無効にして、ReaxFFを有効にする(試した環境ではOpenMPIが利用されました)
spack install lammps ~openmp +reaxff
# Intel oneAPIのコンパイラとMPIを使う、並列数を制限
spack install -j 4 lammps %oneapi ^intel-oneapi-mpi
-jオプション指定無しで、並列インストールします。スパコンのフロントエンドなど、他者と共有している計算機では、並列数を制限したほうが良いでしょう。
ハッシュ値付きで、インストール済みspecの一覧を表示します。
$ spack find -lx
-- linux-ubuntu26.04-haswell / %c,cxx,fortran=oneapi@2026.1.1 ---
rx5zjl7 aocc@5.2.0
-- linux-ubuntu26.04-haswell / %c,cxx=gcc@15.2.0 ----------------
mid2ggg lammps@20250722.3
-- linux-ubuntu26.04-haswell / %c,cxx=oneapi@2026.1.1 -----------
k52i4rr lammps@20250722.3
-- linux-ubuntu26.04-haswell / no compilers ---------------------
xxdohip nvhpc@26.3
==> 5 installed packages
oneAPIでコンパイルされたLAMMPSを使うには、以下のコマンドを実行します。
# lammpsは二つあるので、ハッシュ値を指定
spack load /k52i4rr
なお、インストールされたspecの所在は、以下のコマンドで得られます。
# パッケージ名をしてしても良い
spack location -i /k52i4rr
アプリケーションのアンインストール
不要になったspecをアンインストールします。
spack uninstall lammps
依存するspecを含めて削除します。
spack uninstall -R lammps
不要になったライブラリなどを削除します。
spack gc
全てのspecを削除します。やり直したくなったときに使います。
spack uninstall --all
作業用のディスク領域が不足する場合
特別に指定しなければ、コンパイル作業は/tmpディレクトリで実行されます。/tmpに十分な容量が割り当てられていなければ、ディスク領域が不足する恐れがあります。
作業ディレクトリは、Spack設定ファイル~/.spack/config.yamlで指定できます。このファイルは、直接テキストエディタで編集できそうですが、専用のコマンドが用意されていますので、そちらを用いたほうが良いでしょう。
spack config edit config
config:
build_stage:
- ~/tmp
oneAPI依存パッケージのインストールを止める
(意図して)インストールしたspecの他に、依存するspecが自動的にインストールされます。その中には、Intel oneAPI関係のパッケージ(spec)が含まれます。
- intel-oneapi-runtime
- intel-oneapi-mpi
これらに相当するものが、(Spackとは無関係に)システムにインストールされている場合、重複してインストールするのは無駄に感じられます。これらを外部化(externals)すれば、パッケージのインストールを抑制できます。
spack config edit packages
packages:
intel-oneapi-mpi:
externals:
- spec: intel-oneapi-mpi@2021.18
prefix: /opt/intel/oneapi
buildable: false
intel-oneapi-runtime:
externals:
- spec: intel-oneapi-runtime@2026.1
prefix: /opt/intel/oneapi/compiler/2026.1
buildable: false
oneAPIを優先して使用する
以下設定は、何らかの作用がありますが、私は、解決困難なエラーに遭遇しました。(少なくとも不慣れな方は)利用を控えたほうが良いでしょう。再検討予定。
Intel系のCPUを搭載した計算機では、(CUDA, ROCmを使わない場合に;GNUコンパイラでなく)oneAPIの利用を優先したいと思います。それも、packages.yamlで設定可能です。
packages:
all:
providers:
mpi: [intel-oneapi-mpi]
c:
prefer:
- intel-oneapi-compilers
cxx:
prefer:
- intel-oneapi-compilers
fortran:
prefer:
- intel-oneapi-compilers
未対応アプリケーションをSpack対応させる
既存のパッケージを参考にする
既存のパッケージの格納場所は、以下コマンドで調べられます。
spack location -p openmx
このようなファイルで構成されています。主な作業は、package.pyを整えることです。
$ ls $(spack location -p openmx)
__pycache__ for_aarch64.patch package.py
package.py編集のためのコマンドも用意されています。
spack edit openmx
リポジトリの用意
作業用のリポジトリを用意します。
# 一つ目の引数がディレクトリ名、二つ目の引数がnamespace
spack repo create ~/spack_repo_local local
spack repo add ~/spack_repo_local/spack_repo/local
spack repo list
# removeで、リポジトリを削除
# spack repo remove local
# レポジトリを指定
spack list -r local
パッケージ作成
Bader電荷解析のパッケージを作成します。
雛形を作成します。
spack create --name bader --namespace local --template makefile https://theory.cm.utexas.edu/henkelman/code/bader/download/bader.tar.gz
package.pyを整えます。
spack edit bader
UbuntuのGNU Fortranで(は)動くようになりました。
from spack_repo.builtin.build_systems.makefile import MakefilePackage
from spack.package import *
class Bader(MakefilePackage):
"""Bader charge analysis of charge-density grids."""
homepage = "https://theory.cm.utexas.edu/henkelman/code/bader/"
url = "https://theory.cm.utexas.edu/henkelman/code/bader/download/bader.tar.gz"
version(
"1.05",
sha256="8dcc32a17b8caf11622347ed89924edb6cebbee63bfd7bf30e752f0fb402aa25",
)
depends_on("fortran", type="build")
# This recipe uses GNU Fortran compiler flags.
conflicts(
"%oneapi",
msg="This recipe currently supports GNU Fortran only.",
)
# Fortran module dependencies may not support parallel make.
parallel = False
def edit(self, spec, prefix):
if self.compiler.name != "gcc":
raise InstallError("This recipe currently supports GNU Fortran only.")
copy("makefile.osx_gfortran", "Makefile")
def install(self, spec, prefix):
mkdirp(prefix.bin)
install("bader", prefix.bin)
意図した動作をしない場合
デバッグ情報を表示します。
spack -d install -v bader
参考にしました