MPI - Как узнать, когда больше сообщений не поступит в MPI_Irecv - PullRequest
0 голосов
/ 13 октября 2019

Я создаю программу MPI на C, имитирующую сеть Wi-Fi. В этом сетевом узле ранжированный 0 является базовой станцией, в то время как узлы с 1 по 20 являются устройствами Wi-Fi. Каждый узел с рангом 1 и выше отправляет случайное число некоторым другим конкретным ненулевым узлам. Затем принимающие узлы сравнивают эти числа и, если они равны, отправляют сообщение на узел 0. Моя цель - получить все сообщения на узле 0 и сразу записать их в текстовый файл, но я не знаю, как я могуубедитесь, что больше сообщений не будет получено, чтобы мой процесс записи не прерывался или не происходило никаких состязаний. Я пытался установить MPI_Barrier после всех приемов в моем коде, но это не работает. Вот псевдокод моей программы:

MPI_Init

While some expression is true {
    if rank > 0 {

        for loop {

            send random numbers to specific non-zero ranks using MPI_Isend
        }

        for loop {
            receive random numbers from specific non-zero ranks using MPI_Irecv
        }

        wait for all send and receives to complete using MPI_Waitall

        if numbers received are equal {

            send the number to rank 0 using MPI_Isend

            wait for send to complete using MPI_Wait
        }

        MPI_Barrier(MPI_COMM_WORLD);

    } else {

        Receive numbers from any source that sends data with MPI_Irecv and MPI_ANY_SOURCE

        Wait to receive messages using MPI_Wait

        MPI_Barrier(MPI_COMM_WORLD);

        *AFTER ALL MESSAGES ARE RECEIVED WRITE MESSAGES TO A TEXT FILE*
    }


}

MPI_Finalize
...