У меня есть два исполняемых файла, которые я хотел бы запустить следующим образом: Для каждого узла я хочу запустить N-1 процессов для exe1 и 1 exe2
В предыдущей системе slurm, которая работала следующим образом:
#!/bin/bash -l
#SBATCH --job-name=XXX
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=2
#SBATCH --mem=120GB
#SBATCH --time=04:00:00
module purge
module load intel/compiler/2020.1.217
module load openmpi/intel/4.0.5_2020.1.217
scontrol show hostname $SLURM_JOB_NODELIST | perl -ne 'chomb; print "$_"x1'> myhostall
scontrol show hostname $SLURM_JOB_NODELIST | perl -ne 'chomb; print "$_"x1'>>myhostall
mpirun --mca btl_openib_allow_ib 1 --report-bindings -hostfile myhostall -np 2 ./exe1 : -np 2 ./exe2
В этом примере у меня есть два узла с двумя задачами/узлом. Таким образом, exe1 должен иметь 1 ранг от каждого узла и аналогично для exe2.
Если я скажу cat myhostall
:
come-0-12
come-0-13
come-0-12
come-0-13
Но в моем коде при вводе имени процессора с помощью MPI_GET_PROCESSOR_NAME
получается, что exe1 оба ранга печатают come-0-12
, а для exe2 оба печатают come-0-13
.
Так вот вопрос:
Как указать количество задач N на каждый узел для exe1 и количество задач M на каждый узел для exe2
Вы можете указать 2 хост-файла, по одному на каждый exe
например
mpirun -np 2 --hostfile hostfile_1 exe1 : -np 2 --hostfile hostfile_2 exe2
В каждом хост-файле вы можете указать, сколько слотов будет использовать каждый исполняемый файл на каждом узле.
например (подробнее см. https://www.open-mpi.org/faq/?category=running#mpirun-hostfile), если вы хотите, чтобы и exe1, и exe2 имели по 1 процессору от каждого узла , hostfile_1 и hostfile_2 могут быть идентичными или даже одним и тем же файлом:
node1 slots=1
node2 slots=1
Однако, если hostsfile_1 и hostfile_2 содержат одни и те же узлы, mpirun, скорее всего, перераспределит задачи так, как «считает» более оптимальным.
Другой подход — указать тот же файл hosts и использовать директиву «—map-by node» (поведение по умолчанию — «—map-by slot»), например:
mpirun -hostfile hosts.txt -np 2 --map-by node ./exe1 : -hostfile hosts.txt -np 2 --map-by node ./exe2
где hosts.txt содержит:
node1 slots=2
node2 slots=2
что дает в моем случае (OpenMPI-4.0.4)
EXE1 from processor node1, rank 0 out of 4 processors
EXE1 from processor node2, rank 1 out of 4 processors
EXE2 from processor node1, rank 2 out of 4 processors
EXE2 from processor node2, rank 3 out of 4 processors
Также потенциально можно использовать ранговые файлы (если вы используете OpenMPI) для более явной привязки задач к конкретному процессору, но это может быть немного громоздко...
добавлен пример файла хоста и ссылки на часто задаваемые вопросы по OpenMPI
Спасибо! - Но не могли бы вы привести пример того, как в этом случае будет выглядеть hostfile