限制 OMPython 使用的内核数

Limit number of cores used by OMPython

背景

我需要运行块模拟。我已经使用 OMEdit 创建了系统,我调用 omc 来 运行 使用 OMPython 和 zmq 进行消息传递的模拟。模拟工作正常,但现在我需要将它移到服务器上以长时间模拟系统。

由于服务器由一组人共享,因此它使用 slurm 对作业进行排队。服务器有 32 个内核,但他们要求我在调整脚本时只使用 8 个内核,然后在我想要 运行 我的最终模拟时使用 24 个内核。

我已将 slurm 配置为按以下方式调用我的脚本:

#!/bin/bash 
#
#SBATCH --job-name=simulation_Test_ADC2_pipe_4096s
#SBATCH --output=simulation_Test_ADC2_pipe_4096s.txt 
#
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=8
#SBATCH --time=10:00
#SBATCH --mem-per-cpu=10000
source activate /home/jabozzo/conda_envs/py27
#which python
python ./Test_ADC2_pipe_4096s.py

然后我使用 sbatch 执行 slurm 文件。

问题

omc 编译工作正常。当它开始模拟时,服务器的所有 32 个核心都已加载,即使它被配置为仅使用 8 个。

我试过了

compilation and simulation 个标志可以传递给 omc。我试过使用 --numProcs (一个编译标志),但这似乎只适用于编译过程,不会影响最终的可执行文件。我扫描了模拟标志页面以寻找相关内容,但似乎没有更改 cpu 用法的选项。

我们在并行进行 OpenModelica 测试时唯一添加的是添加 GC_MARKERS=1 环境变量和 --numProcs=1;这使得我们每晚对 10000 个测试进行的库测试全部 运行 连续进行。但是 GC_MARKERS 不应该影响模拟,除非它们正在分配大量内存。除此之外,OpenModelica 模拟是串行的,除非您使用并行 blas/lapack/sundials 库,该库可能会在 OpenModelica 对它一无所知的情况下使用更多内核;在这种情况下,您需要阅读消耗所有资源的库的文档。

还有点令人惊讶的是 slurm 允许您的进程消耗比您设置的更多的 CPU;它可以使用 taskset 命令让内核强制进程只使用某些 CPU。

我的服务器管理员不确定 taskset 是否会干扰 slurm 内部结构。所以我们找到了另一个选择。如果 omc 使用 openMP 进行编译,我们还可以限制核心数,将 slurm 文件的最后一行替换为:

OMP_NUM_THREADS=8 python ./Test_ADC2_pipe_4096s.py

我将此答案留在此处以补充 答案