MPI无阻塞通话后的障碍,没有簿记?

时间:2015-06-03 21:24:48

标签: c++ parallel-processing mpi cluster-computing hpc

我正在做一堆MPI_Iallreduce非阻塞通信。我已将这些Iallreduce调用添加到我的代码中的几个不同位置。我经常会暂停并等待所有Iallreduce来电完成。

版本1,MPI_Request簿记 - 这有效:

MPI_Request requests[];
MPI_Iallreduce(..., requests[0]);
...
MPI_Iallreduce(..., requests[n-1]);
for(int i=0; i<n; i++){
    MPI_Wait(requests[i], ...);
}

但是,我正在使用相当大的代码库,而我宁愿不编写额外的代码来跟踪所有这些MPI_Request对象。我想做以下事情:

没有MPI_Request簿记的第2版 - 这个段错误:

MPI_Iallreduce(..., requests[0]);
...
MPI_Iallreduce(..., requests[n-1]);
MPI_Barrier(...); //wait for Iallreduces to finish, without MPI_Request bookkeeping

但是,MPI_Barrier版本段错误

有没有办法做一堆非阻塞的MPI调用,然后等待调用完成,而不跟踪MPI_Request对象?

1 个答案:

答案 0 :(得分:3)

这取决于您不希望“跟踪请求对象”的具体情况。通常,除了等待请求之外,没有任何东西可以保证调用完成。但是,你这样做的方式并不是最简单的方法。相反,请使用MPI_WAITALL

MPI_Iallreduce(..., requests[0]);
...
MPI_Iallreduce(..., requests[n-1]);
MPI_Waitall(n, requests, MPI_STATUSES_IGNORE);

这将等待所有请求立即完成,当您完成后,您知道所有减少都已完成。如果您想获得更详细的信息,可以将MPI_STATUSES_IGNORE替换为MPI_STATUS个对象。