mirror of
https://github.com/CHN-beta/nixos.git
synced 2024-10-23 05:39:05 +08:00
localPackages.vasp: fix
This commit is contained in:
parent
55b26b28aa
commit
8e2c742340
@ -14,17 +14,15 @@
|
||||
## 基本概念
|
||||
|
||||
队列系统使用 slurm。这是个在集群上广泛使用的队列系统,可靠性应该会比之前好很多。
|
||||
学校的 hpc 上用的是 PBS,和这个不一样,但很多概念是相通的,例如队列、节点等(当然这里只有一个队列和一个节点)。
|
||||
学校的 hpc 上用的是 LFS,和这个不一样,但很多概念是相通的,例如队列、节点等(当然这里只有一个队列和一个节点)。
|
||||
这里只简单记录一下如何使用。更多内容,网上随便搜一下 slurm 的教程就可以找到很多介绍,也可以看官网文档。
|
||||
|
||||
slurm 限制 CPU 按照核(而不是线程)分配,
|
||||
提交任务时, `sbatch` 命令中的 `cpu` 或者 `core` (它俩是同义词)都是指核的数量而不是线程数
|
||||
(也就是说,实际运行的线程数要再乘以 2)。
|
||||
提交任务时, `sbatch` 命令中的 `cpu` 或者 `core` (它俩是同义词)都是指虚拟的 CPU 核数,也就是实际执行时的线程数。
|
||||
|
||||
一些软件(例如 VASP)支持两个层面的并行,一个叫 MPI,一个叫 OpenMP,实际运行的线程数是两者的乘积。
|
||||
MPI 并行的数量就是提交任务时指定的 task 的数量,
|
||||
OpenMP 并行的数量等于提交任务时指定的分配给每个 task 的 CPU 的数量再乘以 2,
|
||||
也就是最终的线程数等于指定的 CPU 数量乘以 2。
|
||||
OpenMP 并行的数量就是提交任务时指定的分配给每个 task 的 CPU 的数量,
|
||||
最终的线程数等于两者的乘积。
|
||||
此外对于 VASP 还有一个限制:当使用 GPU 时,MPI 并行的数量必须等于 GPU 的数量,否则 VASP 会在开头报个警告然后只用 CPU 计算(但不会报错)。
|
||||
其它大多使用 MPI 并行的软件没有这个限制。
|
||||
|
||||
@ -44,7 +42,7 @@ sbatch --gpus=1 --ntasks-per-gpu=1 --job-name="my great job" vasp-nvidia-6.4.0 m
|
||||
“gre” 是 “generic resource” 的缩写。
|
||||
* `--ntasks-per-gpu=1` 是一定要写的。
|
||||
* `--job-name=` 指定任务的名字。可以简写为 `-J`。也可以不指定。
|
||||
* 默认情况下,一个 task 会搭配分配一个 CPU 核(两个线程),一般不用修改。如果一定要修改,用 `--cpus-per-task`。
|
||||
* 默认情况下,一个 task 会搭配分配一个 CPU 核(一个线程),一般已经够用,不用修改。如果一定要修改,用 `--cpus-per-task`。
|
||||
|
||||
提交一个 VASP CPU 任务的例子:
|
||||
|
||||
@ -55,7 +53,7 @@ sbatch --ntasks=2 --cpus-per-task=2 --job-name="my great job" vasp-intel-6.4.0 s
|
||||
|
||||
* `--ntasks=2` 指定在 MPI 层面上并行的数量。
|
||||
可以简写为 `-n`。
|
||||
* `--cpus-per-task=2` 指定每个 task 使用的 CPU 核的数量,OpenMP 并行的数量等于这个数再乘以 2。
|
||||
* `--cpus-per-task=2` 指定每个 task 使用的 CPU 核的数量,也就是 OpenMP 并行的数量。
|
||||
|
||||
要把其它程序提交到队列里,也是类似的写法。请自行举一反三。
|
||||
|
||||
|
@ -37,10 +37,10 @@ let
|
||||
runtimeInputs = [ (vasp version) ];
|
||||
text =
|
||||
''
|
||||
if [ -n "''${SLURM_CPUS_PER_TASK-}" ] && [ -n "''${SLURM_THREADS_PER_CPU-}" ]; then
|
||||
export OMP_NUM_THREADS=$(( SLURM_CPUS_PER_TASK * SLURM_THREADS_PER_CPU ))
|
||||
# if SLURM_CPUS_PER_TASK is set, use it to set OMP_NUM_THREADS
|
||||
if [ -n "''${SLURM_CPUS_PER_TASK-}" ]; then
|
||||
export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK
|
||||
fi
|
||||
export PATH=$PATH:$PWD
|
||||
exec "$@"
|
||||
'';
|
||||
};
|
||||
|
@ -55,9 +55,9 @@ let
|
||||
module load tbb compiler-rt oclfpga # dependencies
|
||||
module load mpi mkl compiler
|
||||
|
||||
# if SLURM_CPUS_PER_TASK and SLURM_THREADS_PER_CPU are set, use them to set OMP_NUM_THREADS
|
||||
if [ -n "''${SLURM_CPUS_PER_TASK-}" ] && [ -n "''${SLURM_THREADS_PER_CPU-}" ]; then
|
||||
export OMP_NUM_THREADS=$(( SLURM_CPUS_PER_TASK * SLURM_THREADS_PER_CPU ))
|
||||
# if SLURM_CPUS_PER_TASK is set, use it to set OMP_NUM_THREADS
|
||||
if [ -n "''${SLURM_CPUS_PER_TASK-}" ]; then
|
||||
export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
|
@ -57,10 +57,11 @@ let
|
||||
module use ${nvhpc}/share/nvhpc/modulefiles
|
||||
module load nvhpc
|
||||
|
||||
# if SLURM_CPUS_PER_TASK and SLURM_THREADS_PER_CPU are set, use them to set OMP_NUM_THREADS
|
||||
if [ -n "''${SLURM_CPUS_PER_TASK-}" ] && [ -n "''${SLURM_THREADS_PER_CPU-}" ]; then
|
||||
export OMP_NUM_THREADS=$(( SLURM_CPUS_PER_TASK * SLURM_THREADS_PER_CPU ))
|
||||
# if SLURM_CPUS_PER_TASK is set, use it to set OMP_NUM_THREADS
|
||||
if [ -n "''${SLURM_CPUS_PER_TASK-}" ]; then
|
||||
export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
'';
|
||||
runEnv = version: buildFHSEnv
|
||||
|
Loading…
Reference in New Issue
Block a user