在多个节点上使用SRUN运行Mpirun会提供不同的通信器



我正在使用此处的Hello World示例,其中每个过程都将其过程名称及其MPI_COMM_WORLD等级ID和Communicator Size。

#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 processorsn",
           processor_name, world_rank, world_size);
    // Finalize the MPI environment.
    MPI_Finalize();
}

我在Slurm上以两种不同的方式运行此示例,一次与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)是我期望的,但使用SRUN不输出(1)。在这里,SRUN似乎是在每个节点上精确地执行Mpirun,并且两个运行都不是相同的MPI应用程序,因此MPI_COMM_WORLD COMBOLICATOR在两个节点上都不相同。而Sbatch设法这样做。

我不认为这是意图的,所以我唯一的猜测是我对Slurm或使用它的方式有问题。

我认为我需要将SRUN用于应用程序,因为它具有低级别的选项--cpu_bind,而Sbatch没有它。我想我需要使用此选项手动进行异质作业分配,遵循本指南的slurm版本低于17.11。

我的问题是:

  • 您在使用我的slurm中看到一个明显的错误,还是我对这两个命令应该做什么的理解?或者您认为它可能与slurm配置有关(我对此一无所知,而我不是管理员)?

  • 如果问题不明显,您是否有其他建议使用Sbatch进行异质作业?

感谢您的阅读以及您提供的任何帮助!

运行srun -N 2 -n 2 mpirun ./a.out导致slurm在两个节点上分配两个任务,并使每个任务运行mpirun ./a.out,导致最终创建了四个过程。

您只能运行srun -N 2 -n 2 ./a.out。如果slurm和您的MPI库都正确配置了,则应工作正常。

最新更新