MPI非阻塞调用后的障碍,没有簿记?

Barrier after MPI non-blocking call, without bookkeeping?

我正在做一堆 MPI_Iallreduce 非阻塞通信。我已将这些 Iallreduce 调用添加到代码中的几个不同位置。每隔一段时间,我想暂停并等待所有 Iallreduce 调用完成。


带有 MPI_Request 簿记功能的版本 1 - 这有效:

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 对象。我想执行以下操作:

版本 2 没有 MPI_Request 簿记——这个段错误:

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

但是,MPI_Barrier 版本 segfaults


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

这取决于您不想 "track request objects" 的具体程度。通常,除了等待请求外,没有什么能保证调用完成。但是,您这样做的方式并不是最简单的方式。相反,使用 MPI_WAITALL.

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

这将等待所有请求立即完成,当您完成时,您就知道所有减少都已完成。如果您想获得有关它们如何进行的更细粒度的信息,您可以将 MPI_STATUSES_IGNORE 替换为 MPI_STATUS 个对象的数组。