MPI_Request在多个收发非阻塞通信中的工作

时间:2018-10-13 11:42:31

标签: mpi

我是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)

我不明白。请帮忙!

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_sizetest_instances.size()之间没有链接是一个主要问题。

关于您的特定问题,这是完全相同的问题。

就我而言,我不了解该程序的目标以及是否已通过测试。 (例如,包含包含数百万行的“ training.txt”)