Запуск mpirun с srun на нескольких узлах дает другой коммуникатор - PullRequest
0 голосов
/ 22 марта 2019

Я использую пример 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 для разнородных заданий?

Спасибо за чтение и любую помощь, которую вы можете оказать!

1 Ответ

0 голосов
/ 29 марта 2019

Запуск srun -N 2 -n 2 mpirun ./a.out приводит к тому, что Slurm выделяет две задачи на двух узлах и заставляет каждую задачу запускать mpirun ./a.out, в результате чего в итоге создаются четыре процесса.

Вы должны запустить только srun -N 2 -n 2 ./a.out,Если Slurm и ваша библиотека MPI настроены правильно, все должно работать нормально.

...