Я использую пример hello world из Здесь , в котором каждый процесс печатает имя своего процесса вместе с идентификатором ранга MPI_COMM_WORLD и размером коммуникатора.
#include <mpi.h>
#include <stdio.h>
int main(int argc, char** argv) {
// Initialize the MPI environment
MPI_Init(NULL, NULL);
// Get the number of processes
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
// Get the rank of the process
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
// Get the name of the processor
char processor_name[MPI_MAX_PROCESSOR_NAME];
int name_len;
MPI_Get_processor_name(processor_name, &name_len);
// Print off a hello world message
printf("Hello world from processor %s, rank %d out of %d processors\n",
processor_name, world_rank, world_size);
// Finalize the MPI environment.
MPI_Finalize();
}
Я работаюэтот пример двумя разными способами для slurm, один раз с srun и один раз с sbatch.
Точнее:
(1)
srun -N 2 -n 2 mpirun ./a.out
(2)
sbatch testsimple.job
С файлом testsimple.job, содержащим:
#!/bin/bash
#SBATCH -N 2
#SBATCH -n 2
mpirun ./a.out
Проблема в том, что я не понимаю разницу в выходных данных, с конфигурациями, которые похожи, по крайней мере, из моего понимания.
Выходные данные:
(1)
Hello world from processor node1, rank 0 out of 2 processors
Hello world from processor node2, rank 1 out of 2 processors
Hello world from processor node2, rank 1 out of 2 processors
Hello world from processor node1, rank 0 out of 2 processors
(2)
Hello world from processor node1, rank 0 out of 2 processors
Hello world from processor node2, rank 1 out of 2 processors
Выход (2), как я ожидаю, но невывод (1) с использованием srun.Здесь srun, похоже, точно выполняет mpirun на каждом узле, и оба запуска не выполняются в одном приложении MPI, поэтому коммуникатор MPI_COMM_WORLD не одинаков на обоих узлах.В то время как sbatch удается это сделать.
Я не думаю, что это предназначено, поэтому я предполагаю, что что-то не так с моим пониманием слерма или с тем, как я его использую.
Iдумаю, что мне нужно использовать srun для моего приложения, потому что у него опция низкого уровня --cpu_bind
, а у sbatch его нет.Я думаю, что мне нужно использовать эту опцию, чтобы сделать неоднородное распределение заданий вручную, версия слерма ниже 17.11, следуя этому руководству.
Мой вопрос:
Видите ли вы очевидную ошибку в моем использовании slurm или в моем понимании того, что обе команды должны делать?Или вы думаете, что это может быть связано с настройкой slurm (о которой я ничего не знаю и не являюсь администратором)?
Если проблема не очевидна, у вас есть другое предложение?использование sbatch для разнородных заданий?
Спасибо за чтение и любую помощь, которую вы можете оказать!