部署spack
下载
release(推荐)
github下载最新的release:github.com/spack/spack…
git
1 | git clone https://github.com/spack/spack.git ~/spack |
✨tips: github 国内下载慢,百度 github镜像加速站 或 油猴脚本 - github 高速下载
激活
对于超算/lab/hpc等多用户场景,建议将spack本地放在全局/共享目录下
单个普通用户建议放在 ~/.spack/ 或 /opt下
解压下载好的压缩包, 加载环境变量(根据具体情况变更路径):1
source spack/share/spack/setup-env.sh
可以将此命令写在~/.bashrc
或/etc/profile
中 , 打开终端自动生效
配置
spack 的用户配置文件均在 ~/.spack 下,首次使用 spack 可能没有此目录,使用 3.2 会自动创建
基本配置
1 | $ spack config get config > ~/.spack/config.yaml |
解析:
- install_tree 中 root 为当前用户 软件安装的路径 , projections 为软件路径的命名规范
- verify_ssl 在install时会校验url的ssl证书,离线环境可以选择关闭(值为 fasle)
- locks 锁机制: 默认开启,同一用户分别安装相同的软件,只允许有一个进程执行,执行完后,另一个进程将跳过该软件安装;关闭的话,可能制造重复安装,但在某些文件系统的特殊权限限制下,需要关闭,否则会报奇怪的读写错误
- build_job 安装时默认使用的最大cpu核心数
- checksum 校验源码包的hash值
编译器
使用spack compiler find
将会自动查找本机的所有编译器,生成配置文件~/.spack/linux/compilers.yaml
spack compilers查看添加到配置文件中的编译器1
2
3
4
5
6
7
8
9
10
11
12
13$ spack compilers
==> Available compilers
-- clang centos7-x86_64 -----------------------------------------
clang@12.0.1 clang@3.4.2
-- gcc centos7-x86_64 -------------------------------------------
gcc@10.2.0 gcc@8.5.0 gcc@7.5.0 gcc@6.5.0 gcc@4.9.4 gcc@4.8.5
-- intel centos7-x86_64 -----------------------------------------
intel@2021.4.0 intel@19.0.5.281
-- oneapi centos7-x86_64 ----------------------------------------
oneapi@2021.4.0
源码镜像仓库
自建源码镜像仓库
1 | $ spack mirror create -d <PATH> --all |
一个标准的源码镜像仓库符合以下目录规范:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19mirror/
cmake/
cmake-2.8.10.2.tar.gz
dyninst/
dyninst-8.1.1.tgz
dyninst-8.1.2.tgz
libdwarf/
libdwarf-20130126.tar.gz
libdwarf-20130207.tar.gz
libdwarf-20130729.tar.gz
libelf/
libelf-0.8.12.tar.gz
libelf-0.8.13.tar.gz
libunwind/
libunwind-1.1.tar.gz
mpich/
mpich-3.0.4.tar.gz
mvapich2/
mvapich2-1.9.tgz
添加私有源码镜像仓库
1 | $ spack mirror add <scope> <path> |
生成配置文件~/.spack/linux/mirrors.yaml
例如 添加 一个 在/opt/mirror下的源码镜像仓库,给它取名为haha:1
spack mirror add haha /opt/mirror
查看已添加的源码镜像仓库
1 | $ spack mirror list |
默认使用 位于美国亚马逊云的 spack公共仓库 mirror.spack.io ,在国内获取 源码/索引 的速度可能会很慢
脚本源
查看当前使用的脚本源1
2
3$ spack repo list
==> 1 package repository.
builtin /root/spack/var/spack/repos/builtin
默认使用spack官方的脚本源
添加私有脚本源
一个标准的spack脚本源符合如下的路径规范:
1 | $ tree -L /root/spack/var/spack/repos/yeesuan |
其中 repo.yaml 定义了该脚本源的命名空间:
1 | repo: |
添加该脚本源:1
$ spack repo add /root/spack/var/spack/repos/yeesuan
modules
1 | $ spack config get modules > ~/.spack/modules |
prefix_inspections:定义了声明的环境变量和路径的对应关系
其中defalut中roots的tcl /lmod 定义了 安装软件后,modules 文件的安装位置
自定义packages
spack external find
可以添加系统中的软件,为spack 管理 (超算环境不推荐)
1 | $ spack external find |
这是我们自定义添加的两块软件:
1 | packages: |
可以按照上述规范添加自己的软件
基本使用
spack中有什么?
基础命令:spack list
默认返回所有支持spack安装的软件:
1 | $ spack list |
支持通配符查找:
1 | $ spack list *blas* |
查找描述里包含某个关键词:
1 | $ spack list -d physics |
查看软件详细信息
基础命令:spack info <package_name>
1 | $ spack info vasp |
解析
1.MakefilePackage表示vasp用make构建
其他的,像gromacs 是CMakePackage
,表示用cmake
构建,fftw 是 Autotools
, 流程中需要先configure
再make
2.Description: 软件的介绍
3.Homepage:软件官网
4.Preferred version是推荐版本,Safe versions是安全的(经过充分验证的)版本
其中,左侧列是版本号
,右侧列是软件的URL地址
spack默认使用 系统命令 curl
“下载”软件 ,curl支持的协议有 https/http/file/…. ,上面例子表示默认使用当前路径下的源码包
5.Variants 我翻译为“特性”
第一列为特性的名字,第二列为特性的条件,第三列为特性的值,其中,第一列,变量名后的中括号内,是默认
的变量值
6.Installation Phases 表示了该软件安装时的三个步骤
7.Build Dependencies 表示了构建前需要加载的环境
8.Link Dependencies 表示了构建时用到的链接库
9.Run Dependencies 表示了在使用软件时,需要加载的环境
安装软件
基础命令:spack install <package_name>
1 | $ spack install zlib |
进阶-高度自定义的安装命令
指定编译器
编译器需要搭配 百分号 “%”,只能跟在软件名后面
例如使用gcc编译器:
1 | spack install zlib%gcc |
软件名和编译器之间允许有多个空格,所以也可以写成这样:
1 | spack install zlib %gcc |
一般地,我们的系统中存在多个版本的gcc编译器,所以需要指定使用哪一个版本的编译器:
1 | spack install zlib %gcc@6.5.0 |
需要说明的是,这里的编译器 名称,可能不会和 spack list 中一一对应,
例如,英特尔oneapi的编译器,list表里的名称为 intel-oneapi-compilers, 但spack compilers里则是intel
指定依赖
以2.1为例,vasp的依赖,其中的blas、lapack、netlib-scalapack 这三个数学库在英特尔的mkl库中均有实现,
所以安装vasp时可以指定使用mkl,搭配 “^”
1 | spack install vasp ^intel-mkl |
2020之后的mkl库的包名发生了变化,我们指定适合用2021.4.0版本的
1 | spack install vasp ^intel-oneapi-mkl@2021.4.0 |
我们的cc编译器也想用intel的icc, 版本号和mkl相同
1 | spack install vasp %intel@2021.4.0 ^intel-oneapi-mkl@2021.4.0 |
特性
仍以2.1为例,官方提供的vasp有一个叫vaspsol的特性,它是vasp的一个扩展包,默认关闭状态,如果想开启此特性,需要搭配“+”使用
1 | spack install vasp +vaspsol |
mpich的特性pmi的值有多个,默认为mpi
1 | pmi [pmi] -- off, pmi, pmi2, pmix PMI interface. |
我们想全都使用,则使用“=”表达,以英文小写逗号“,”分隔不同的值
1 | spack install mpich mpi=pmi,pmi2,pmix |
mpich的特性fortran的值默认时开启状态,我们不想使用它,搭配波浪线
1 | spack install mpich ~fortran |
多线程
构建时可以指定使用的最大cpu核心数,在install后面 加入 -j 参数, 后接核心数
1 | spack install -j 64 vasp |
✨tips: 可以通过系统命令 nproc 查询到最大核心数 ,也可以写成变量的形式
综合
以安装gcc6.5.0为例,使用系统自带的gcc4.8.5编译,需要开启几乎全部的特性,其中的go使用1.16版本
1 | spack install -j 64 -y gcc@6.5.0 %gcc@4.8.5 +binutils+bootstrap+piclibs+strip languages=ada,c,c++,fortran,go,java,jit,lto,objc,obj-c++ ^go@1.16 |
✨tips: 其中的 “-y”可以默认选择一些软件的提示性的编译选项或其他选项
卸载软件
基础命令:spakc uninstall <package_name>
1 | $ spack uninstall autoconf |
像上面,卸载报错,我们可以指定编译器:
1 | spack uninstall autoconf %gcc@6.5.0 |
方便地,使用其hash值:
1 | spack uninstall /2vv3qa2 |
默认卸载全部autoconf:
1 | spack uninstall --all autoconf |
有时候,卸载该软件也需要卸载其依赖:
1 | spack uninstall -d <package_name> |
查找已安装的软件
基础命令:spack find
1 | $ spack find |
指定包名
1 | $ spack find vasp |
指定编译器
1 | $ spack find vasp %intel@2021.4.0 |
指定版本号
1 | $ spack find vasp@5.4.4 |
查看软件的特征值
1 | $ spack find -l openmpi |
✨tips: 1.spack支持使用/<hash_value>
的方式替代<package_name>
,hash_vaule支持长写(完整 )和短写(前面3到7个字符) 2.可以使用 -L 查看完整的特征值
查看软件的特征值和依赖
1 | $ spack find -l -d openmpi |
查看软件的路径
1 | spack find -p openmpi |
location (建议用find -p)
location 命令也可以定位软件的路径
1 | $ spack location -i openmpi%gcc@4.8.5 |
cd 进入软件根目录
1 | $ spack cd -i openmpi%gcc@4.8.5 |
查看软件的命名空间
1 | $ spack find -N mpich |
使用软件
基础命令:
加载软件环境变量 spack load <package_name>
卸载软件环境变量 spack unload <package_name>
查看已加载的依赖
1 | $ spack find --loaded |
仅加载软件本身或它的依赖
仅软件本身:
1 | spack load --only package <package_name> |
仅依赖:1
spack load --only dependencies <package_name>
查看加载软件的所有环境变量
1 | spack load --sh <package_name> |
指定参数加载环境变量
指定版本号spack load <package_name>@<package_version>
指定编译器spack load <package_name> %<compiler_name>@<compiler_version>
指定用到的依赖/特性spack load <package_name> ^<dependency_name>
指定命名空间spack load <scope>.<package_name>
上述加载方式都可以组合使用
使用hash值 : spack load /<hash_value>
✨tips: 有时候我们查到的软件版本号和编译器甚至命名空间都一样,它将很难区分
通常,使用spack find -l -d <package_name>
可以打印多个“相同”的软件的依赖详情,我们选择其中一个的hash值加载