0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Spackの使い方

0
Last updated at Posted at 2026-10-17

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

参考にしました

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?