MPI завершает программу Broadcast, когда какой-то процесс находит решение - PullRequest
0 голосов
/ 01 февраля 2019

У меня проблемы с завершением моей программы с использованием 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 и флаг, затем на каждом (пока) проходе она увеличивает свой 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 Ответ

0 голосов
/ 01 февраля 2019

MPI_Bcast() - это коллективная операция, и все ряды коммуникатора должны использовать одинаковое значение для аргумента root (в вашей программе все они используют разные значения).

Действительный подход (хотя вряд ли оптимальный) заключается в отправке сообщения завершения на ранг 0, обновлении flag соответственно и получении всех рангов MPI_Bcast(..., root=0, ...).

...