Я делаю кучу 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
объекты. Я хотел бы сделать следующее:
Версия 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 ошибку сегментации.
Есть ли способ сделать кучу неблокирующих вызовов MPI, а затем дождаться завершения вызовов, не отслеживая объекты MPI_Request?
Это зависит от того, как конкретно вы не хотите «отслеживать объекты запроса». Как правило, ничто не гарантирует, что вызовы выполняются, кроме ожидания запросов. Однако то, как вы это делаете, не самый простой способ. Вместо этого используйте MPI_WAITALL
,
MPI_Iallreduce(..., requests[0]);
...
MPI_Iallreduce(..., requests[n-1]);
MPI_Waitall(n, requests, MPI_STATUSES_IGNORE);
Это будет ожидать одновременного завершения всех запросов, и когда вы закончите, вы будете знать, что все ваши сокращения завершены. Если вы хотите получить более подробную информацию о том, как они прошли, вы можете заменить MPI_STATUSES_IGNORE
с массивом MPI_STATUS
объекты.