MPI завершает программу Broadcast, когда какой-то процесс находит решение
У меня проблемы с завершением программы с использованием MS-MPI.
Все возвращаемые значения кажутся хорошими, но мне нужно нажать Ctrl + C в cmd, чтобы завершить его (не похоже, что он все еще вычисляет, поэтому условие выхода выглядит нормально).
Я хочу запустить программу, используя N процессов. Когда один из них находит решение, он должен установить флаг как false, отправить его всем остальным, а затем на следующей итерации все они остановятся и программа завершится.
Программа на самом деле делает более сложные вычисления, и я работаю над упрощенной версией для ясности. Я просто хотел убедиться, что связь работает.
int main(int argc, char* argv[])
{
MPI_Init(&argc, &argv);
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
//sets as 0 -> (N-1) depending on number of processes running
int c = world_rank;
bool flag = true;
while (flag) {
std::cout << "process: " << world_rank << " value: " << c << std::endl;
c += world_size;
//dummy condition just to test stop
if (c == 13) {
flag = false;
}
MPI_Barrier(MPI_COMM_WORLD);
//I have also tried using MPI_Bcast without that if
if(!flag) MPI_Bcast(&flag, 1, MPI_C_BOOL, world_rank, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
} //end of while
MPI_Finalize();
return 0;
}
Как я думаю, это работает: он начинается с каждого процесса, определяющего его c и флаг, затем на каждом проходе (while) он увеличивает свой c на фиксированное число. Затем, когда он достигает условия остановки, он устанавливает флаг как ложный и отправляет его всем остальным процессам. Что я получаю, когда запускаю его с 4 процессами:
процесс: 0 значение: 0
процесс: 2 значение: 2
процесс: 1 значение: 1
процесс: 3 значение: 3
процесс: 1 значение: 5
процесс: 3 значение: 7
процесс: 0 значение: 4
процесс: 2 значение: 6
процесс: 3 значение: 11
процесс: 1 значение: 9
процесс: 2 значение: 10
процесс: 0 значение: 8
процесс: 3 значение: 15
процесс: 2 значение: 14
процесс: 0 значение: 12
(Я в порядке с этими несколькими дополнительными значениями)
Но после этого я должен вручную завершить его с помощью Ctrl + C. При запуске на 1 процессе он плавно переходит от 1 до 12 и выходит.
1 ответ
MPI_Bcast()
является коллективной операцией, и все ранги коммуникатора должны использовать одно и то же значение для root
аргумент (в вашей программе все они используют разные значения).
Действительный подход (хотя вряд ли оптимальный) состоит в том, чтобы отправить сообщение завершения для ранга 0
, Обновить flag
соответственно и все звания зовут MPI_Bcast(..., root=0, ...)
,