MPI Ring Communication тупик - PullRequest
       9

MPI Ring Communication тупик

0 голосов
/ 02 января 2019

Во время экспериментов для школьного проекта MPI написал это и удивился, почему он не работает: я хочу просто передать все точки в пунктах следующему процессу (процессу с рангом processId + 1) и получить их отпредыдущий.Затем сделайте то же самое, получив от отправляющей на предыдущей итерации и отправив на следующую (processId + 2 и т. Д.).Хотя он выполняется аккуратно для 2 процессов, когда я запускаю его с 4,8, .. процессами, он блокируется после первой итерации.

if(processId!=noProcesses-1)
    sending_to=processId+1;
else
    sending_to=0;

if(processId!=0)
    receiving_from=processId-1;
else
    receiving_from=noProcesses-1;

for(l=1;l<noProcesses;l++)
// ring communication with non-blocking methods
{
    printf("PROCESS %d: Iteration %d: sending_to=%d/receiving_from=%d\n",processId,l,sending_to,receiving_from);

    MPI_Isend(points, size*DIMS, MPI_FLOAT, sending_to, 0, MPI_COMM_WORLD, &req);
    MPI_Request_free(&req);

    MPI_Recv(query_points, size*DIMS, MPI_FLOAT, receiving_from, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

    receiving_from=sending_to;

    if(sending_to==noProcesses-1) {
        sending_to=0;
    } else {
        sending_to++;
    }
}

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Извините, ребята, пришлось опубликовать это, чтобы выяснить, что не так сразу после этого.Идентификаторы процессов в receive_from и sent_to смешиваются со второй итерации.

0 голосов
/ 02 января 2019

Вы создаете новое сообщение отправки, освобождаете его до его завершения, а затем получаете вызов:

MPI_Isend(points, size*DIMS, MPI_FLOAT, sending_to, 0, MPI_COMM_WORLD, &req);
MPI_Request_free(&req);

MPI_Recv(query_points, size*DIMS, MPI_FLOAT, receiving_from, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

Вы должны освободить запрос после отправки сообщения:

MPI_Isend(points, size*DIMS, MPI_FLOAT, sending_to, 0, MPI_COMM_WORLD, &req);
MPI_Recv(query_points, size*DIMS, MPI_FLOAT, receiving_from, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
MPI_Wait(&req);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...