1

我正在尝试在集群上运行一些并行代码。集群使用 slurm,我的代码在 python 中。当我在自己的机器上运行该代码时,它使用了多个内核。但是,当我尝试在集群上运行代码时,速度非常慢,而且似乎没有使用多核。

这是来自python的相关代码:

from multiprocessing import Pool

Nz_i=range(1,13)

p=Pool()
p.map(Err_Calc,Nz_i)
p.close()
p.join()

该函数Err_Calc在前面定义。我不认为它的定义是相关的。

SBATCH用来在集群上运行代码的代码如下:

#!/bin/bash
#SBATCH -N 1
#SBATCH -p RM-shared
#SBATCH --ntasks-per-node 13
#SBATCH -t 03:10:00

module load python/intel_2.7.14

python Err_vs_Nz_Cl.py 

该文件Err_vs_Nz_Cl.py包含我上面显示的代码。我希望这SBATCH可以为我提供 13 个内核,但代码似乎只使用了 1 个内核,或者由于其他原因可能很慢。有谁知道出了什么问题?

4

2 回答 2

1

这可能是错误的(我是新手),但是如果您将 --ntasks-per-node 13 参数更改为 --cpus-per-task 13 会发生什么?我认为文档说您需要以这种方式明确指定 cpu 的数量,否则它将仅使用一个 cpu 运行。

来源:https ://slurm.schedmd.com/sbatch.html

于 2020-03-03T19:47:43.160 回答
0

因为你没有运行srun -n(这对于multiprocessing基于进程的“线程”模型是正确的)你需要另一种方法来告诉它要使用多少 CPU。这是在您的sbatch脚本中使用--ntasks=1--cpus-per-task=13(或您的节点有多少核心)完成的。

谨慎使用multiprocessing。如果您没有在整个节点上运行,或者没有明确指定内核数量,它将尝试在所有可见的 CPU 内核上运行,无论它们是否已分配给您!

于 2020-03-04T15:26:55.750 回答