我是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的请求句柄为:requests + 1,requests + 2,requests + 3,
进程2的请求句柄为:requests + 4,requests + 5,request + 6,
进程3的请求句柄为:requests + 7,requests + 8, requests + 9
(但数组仅为0到8)。
然后它如何接受(request + 9)?
与MPI_IRecv类似,为什么对r来说处理程序是(request + rank + 1)。
我不明白。请帮忙!
答案 0 :(得分:0)
很显然,您正在查看的代码编程不正确。
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”)