对于我的研究,我正在使用第三方软件进行图像仿真,该软件正在我们大学的高性能计算集群上运行。
软件的输入参数是要模拟的零件的开始和结束(x,y)坐标。这使我只能在(x,y)处模拟1个像素,或者例如模拟NxN个像素的小簇。我正在模拟的图像大小最多为256x256像素。
对于每个呼叫,该软件必须加载相同的四个文件来定义要成像的“对象”。这些文件每个大约500 Mb。一个像素大约需要10秒钟进行计算,最后将其写入共享的输出文件。
总而言之,该软件为每个呼叫提供以下工作流程:
我使用GNU和SLURM工作负载管理器并行运行这些串行作业。当我开始这项工作时,将保留HPC上的几个节点。但是,我发现当我使用越来越多的内核时,CPU使用率会严重下降。当我看一下GNU parallel的'--progress'调用的输出时,我看到只有一个节点正忙。因此,我希望尽管保留了多个节点,但只有一个节点正在运行。
如何确保作业实际上已分布在保留的节点上?
代码如下:
#SBATCH --ntasks=200
#SBATCH --cpus-per-task=1
...
# Image size
SIZE=256
# NBLOCKxNBLOCK cluster size
NBLOCK=2
# Number of clusters in image
N=$((${SIZE}/${NBLOCK}))
# Most right pixel
MAXPIXEL=$(((${N}-1)*${NBLOCK}))
# Array of start coordinates
BEGIN=$(seq 0 ${NBLOCK} ${MAXPIXEL})
# Array of end coordinates
END=$(seq $((${NBLOCK}-1)) ${NBLOCK} $((${MAXPIXEL}+${NBLOCK}-1)))
parallel --progress -j 100% --delay 1 --joblog data/logs/runtask.log --resume srun --exclusive -N1 -n1 [relevant software call here] ::: ${BEGIN} :::+ ${END} ::: ${BEGIN} :::+ ${END}