1つのジョブの中で複数のプログラムを別々のCPU/GPUで走らせたい

以下のようにして、1つのジョブの中で複数のプログラムを別々のCPU/GPUで走らせることができます。

以下ではa.outがCPU0-6+GPU0, b.outがCPU7-13+GPU1, c.outがCPU14-20+GPU2, d.outがCPU21-27+GPU3を使います。

#!/bin/sh
#$ -cwd
#$ -V
#$ -l f_node=1
#$ -l h_rt=00:30:00

 

a[0]=./a.out

a[1]=./b.out

a[2]=./c.out

a[3]=./d.out

 

for i in $(seq 0 3)
do
    export CUDA_VISIBLE_DEVICES=$i
    numactl -C $((i*7))-$((i*7+6)) ${a[$i]} &
done
wait