我需要运行块模拟。我已经使用OMEdit来创建系统,我调用omc来使用带有zmq的OMPython进行模拟以进行消息传递。模拟工作正常但现在我需要将其移动到服务器以长时间模拟系统。
由于服务器是由一群人共享的,因此它使用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和simulation标志传递给omc。我曾尝试使用--numProcs
(编译标志),但这似乎只适用于编译过程中,并不影响最终的可执行文件。我已经扫描了模拟标志页面,寻找相关的东西,但似乎没有更改cpu使用的选项。
答案 0 :(得分:1)
我们在并行执行OpenModelica测试时添加的唯一内容是添加GC_MARKERS=1
环境变量和--numProcs=1
;这使得我们对10000个测试的夜间库测试全部按顺序运行。但是GC_MARKERS
不应该影响模拟,除非他们分配了大量的内存。除此之外,OpenModelica模拟是串行的,除非你使用并行的blas / lapack / sundials库,它可能会使用更多的内核而没有OpenModelica知道它的任何内容;在这种情况下,您需要阅读消耗所有资源的库的文档。
有点令人惊讶的是slurm
如何允许您的进程消耗比您设置的CPU更多的CPU;它可以使用taskset
命令使内核强制进程只使用某些CPU。
答案 1 :(得分:1)
我的服务器管理员不确定taskset
是否会干扰slurm内部。所以我们找到了另一个选择如果omc使用openMP进行编译,我们还可以使用以下内容限制替换slurm文件最后一行的核心数:
OMP_NUM_THREADS=8 python ./Test_ADC2_pipe_4096s.py
我将这个anwser留在这里以补充sjoelund.se anwser