Я новичок в 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 и т. Д.
Я не понимаю. Пожалуйста, помогите!