我正在做一堆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对象?
答案 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
个对象。