在HPC群集的多个节点上使用GNU Parallel进行图像仿真

时间:2018-10-05 11:18:08

标签: parallel-processing gnu hpc slurm

对于我的研究,我正在使用第三方软件进行图像仿真,该软件正在我们大学的高性能计算集群上运行。

软件的输入参数是要模拟的零件的开始和结束(x,y)坐标。这使我只能在(x,y)处模拟1个像素,或者例如模拟NxN个像素的小簇。我正在模拟的图像大小最多为256x256像素。

对于每个呼叫,该软件必须加载相同的四个文件来定义要成像的“对象”。这些文件每个大约500 Mb。一个像素大约需要10秒钟进行计算,最后将其写入共享的输出文件。

总而言之,该软件为每个呼叫提供以下工作流程:

  1. 加载“对象”文件
  2. 开始计算
  3. 计算所需像素的强度
  4. 将强度写到共享输出文件的正确位置

我使用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} 

0 个答案:

没有答案