我正在使用此处的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库都正确配置了,则应工作正常。