我正在使用MPICH和SLURM,并且我正在尝试为特定节点分配排名(由于硬件差异,我希望特定节点始终为0级)。 MPICH正在使用Hydra Process Manager。检查文档我应该能够获得一个排名文件(或机器文件,不确定区别)与循环分配的主机列表。
以下是我用于测试的示例程序:
#include <stdio.h>
#include <mpi.h>
#include <unistd.h>
int main(int argc, char **argv) {
char hostname[256];
int rank;
int size;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
gethostname(hostname,255);
printf("I am rank: %d on host %s\n", rank, hostname);
if (rank == 0) {
for (int x = 1; x < size; x++) {
int recv;
MPI_Recv(&recv, 1, MPI_INT, x, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
printf("host %s : rank %d received %d\n", hostname, rank, recv);
}
} else {
printf("host %s : rank %d is sending a message\n", hostname, rank);
MPI_Send(&rank, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
}
MPI_Barrier(MPI_COMM_WORLD);
MPI_Finalize();
return 0;
}
我的排名档案内容如下:
node02
node01
因为我希望node02被分配为零。然后我运行以下内容:
salloc -N2 -c 24 -p debug mpiexec -machinefile ./rankfile.txt ./mpi_test
输出和错误失败:
I am rank: 0 on host node01
I am rank: 1 on host node02
host node02 : rank 1 is sending a message
Fatal error in MPI_Send: Unknown error class, error stack:
MPI_Send(174)..............: MPI_Send(buf=0x7fff9503155c, count=1, MPI_INT, dest=0, tag=0, MPI_COMM_WORLD) failed
MPID_nem_tcp_connpoll(1835): Communication error with rank 0: Connection refused
搜索此错误没有帮助,设置HYDRA_DEBUG不提供有关错误的其他信息。我能够很好地在两个节点之间进行SSH,在没有-f(或-machinefile)标志的情况下运行并且rankfile工作正常,并且交换等级文件中的主机顺序(相当于没有等级文件运行,有效)运行正常。奇怪的是,打印出使用rankfile运行的排名和主机名信息仍显示node01为零排名...另一个奇怪的行为是将rankfile更改为:
node03
node01
SLURM完全失败说“请求的节点配置不可用”但是,使用-N3运行并使用所有三个节点都没有问题(node03是调试池中的有效节点)。
这是配置问题吗?我使用错误的旗帜或错误的旗帜吗?似乎OpenMPI比MPICH更好地支持分配排名,但是由于集群设置,设置SLURM和MPICH并不是微不足道的,所以我对使用OpenMPI重新开始犹豫不决。