Работа MPI_Request в нескольких неблокирующих соединениях отправки-получения - PullRequest
0 голосов
/ 13 октября 2018

Я новичок в MPI, и мне трудно понять этот фрагмент кода для кода по следующей ссылке - https://github.com/ignatij/knn-mpi/blob/master/mpi_version_1/main.cpp

MPI_Request и массив MPI_Status объявлен следующим образом:

MPI_Request requests[(world_size - 1) * 3];
MPI_Status statuses[(world_size - 1) * 3];

и MPI_Isend выглядит следующим образом:

int index = 1;
for (int i = 1; i < test_instances.size(); i++) {
    double r = test_instances[i].getR(); 
    MPI_Isend(&r, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD, requests + index);
    index++;
    double g = test_instances[i].getG();
    MPI_Isend(&g, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD, requests + index);
    index++;
    double b = test_instances[i].getB();
    MPI_Isend(&b, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD, requests + index);
    index++;
}

MPI_Irecv выглядит следующим образом:

MPI_Irecv(&r, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, requests + rank + 1);
MPI_Irecv(&g, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, requests + rank + 2);
MPI_Irecv(&b, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, requests + rank + 3);

MPI_Wait(requests + rank + 1, statuses + rank + 1);
MPI_Wait(requests + rank + 2, statuses + rank + 2);
MPI_Wait(requests + rank + 3, statuses + rank + 3);    

Теперь рассмотрим 4 процесса, поэтому массивом запросов будут запросы MPI_Request [(4-1) * 3], то есть запросы [9] согласно коду:
Так для MPI_ISend:
Процесс 1 имеет обработчики запросов как: запросы + 1, запросы + 2, запросы + 3,
Процесс 2 имеет обработчики запросов как: запросы + 4, запросы + 5, запрос + 6,
Процесс 3 имеетзапрос обрабатывается как: запросы + 7, запросы + 8, запросы + 9
(но массив всего от 0 до 8)
.

Тогда как он принимает (запрос +9)

Аналогично для MPI_IRecv, почему обработчик (запрос + ранг + 1) для r и т. Д.

Я не понимаю. Пожалуйста, помогите!

1 Ответ

0 голосов
/ 14 октября 2018

Очевидно, что код, который вы просматриваете, плохо запрограммирован.

Тот факт, что MPI_Request requests[(world_size - 1) * 3]; и

for (int i = 1; i < test_instances.size(); i++) {
    double r = test_instances[i].getR(); 
    MPI_Isend(&r, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD, requests + index);
}

без связи между world_size и test_instances.size(), является серьезной проблемой.

По поводу вашего конкретного вопроса этоэто точно такая же проблема.

Со своей стороны я не понимаю цели этой программы и того, была ли она протестирована.(например, с файлом training.txt, содержащим миллионы строк)

...