Я использую 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 (фактически эквивалентно работе без Rank файла) работает нормально. Как ни странно, распечатка информации о ранге и имени хоста, работающей с файлом рангов, по-прежнему показывает, что node01 имеет нулевой ранг... Другое странное поведение заключается в том, что изменение рангового файла на:
node03
node01
Полностью завершается с ошибкой SLURM с сообщением «Запрошенная конфигурация узла недоступна», однако запуск с параметром -N3 и использование всех трех узлов работает без проблем (узел 03 является допустимым узлом в пуле отладки).
Это проблема конфигурации? Я использую флаги неправильно или неправильные флаги? Кажется, OpenMPI лучше поддерживает присвоение рангов, чем MPICH, но настройка SLURM и MPICH не была тривиальной из-за настройки кластера, поэтому я не решаюсь начать с OpenMPI.
libvirt
(для использования с гостями KVM). Сетевой IP-адрес задается в файле конфигурации по умолчанию и будет одинаковым на всех узлах. - person Hristo Iliev   schedule 02.03.2017