Барьер после MPI неблокирующий звонок, без бухгалтерии?

Я делаю кучу 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?

4

Решение

Это зависит от того, как конкретно вы не хотите «отслеживать объекты запроса». Как правило, ничто не гарантирует, что вызовы выполняются, кроме ожидания запросов. Однако то, как вы это делаете, не самый простой способ. Вместо этого используйте MPI_WAITALL,

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

Это будет ожидать одновременного завершения всех запросов, и когда вы закончите, вы будете знать, что все ваши сокращения завершены. Если вы хотите получить более подробную информацию о том, как они прошли, вы можете заменить MPI_STATUSES_IGNORE с массивом MPI_STATUS объекты.

3

Другие решения


По вопросам рекламы [email protected]