В своих исследованиях я занимаюсь моделированием изображений с использованием стороннего программного обеспечения, которое я использую в кластере высокопроизводительных вычислений нашего университета.
Входными аргументами программного обеспечения являются координаты начала и конца (x, y) моделируемой детали.Это позволяет мне моделировать всего 1 пиксель в точке (x, y) или, например, небольшие кластеры из NxN пикселей.Размеры изображений, которые я моделирую, составляют не более 256x256 пикселей.
Для каждого вызова программное обеспечение должно загружать те же четыре файла, которые определяют «объект» для изображения.Эти файлы около 500 Мб каждый.Расчет занимает около 10 секунд для одного пикселя и, наконец, записывается в общий выходной файл.
Подводя итог, программное обеспечение имеет следующий рабочий процесс для каждого вызова:
- Load 'файлы объектов
- Инициировать расчет
- Рассчитать интенсивность для желаемых пикселей
- Записать интенсивность в общий выходной файл в правильном месте
Я запускаю эти последовательные задания параллельно, используя GNU параллельно с диспетчером рабочей нагрузки SLURM.Когда я запускаю эту работу, несколько узлов в HPC зарезервированы.Тем не менее, я наблюдаю, что использование процессора серьезно падает, когда я требую все больше и больше ядер.Когда я смотрю на результат вызова --progress GNU параллельно, я вижу, что занят только один узел.Поэтому я ожидаю, что, несмотря на резервирование нескольких узлов, работает только один узел.
Как я могу убедиться, что задания фактически распределены по зарезервированным узлам?
Код выглядит следующим образом:
#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}