MPI 获取非终结进程数
MPI get the number of non-finalized processes
我有以下代码
int main(void) {
...
int numtasks, rank;
MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
int k = 2;
if (rank == 3) {
do {
...
} while (number_of_not_finalized_processes >= numtasks - k);
}
...
MPI_Finalize();
}
并希望使用 rank = 3
循环处理,直到 k
个过程用 MPI_Finalize()
完成。我怎样才能知道有多少进程已经完成并定义 number_of_not_finalized_processes
?或者也许我有更好的替代方法来找出有多少进程仍然存在或通过了代码的特定部分?
你可以通过单方面的沟通来解决这个问题。创建一个 window,其中每个进程在完成之前:
- 在等级 3
上获得 window 的锁
- 使用
MPI_Accumulate
增加计数器
这是一个非常异步的解决方案。如果你的进程做一些同步的事情,比如说一个他们动态决定退出循环的循环,你可以例如在同步点创建一个只有活动进程的子通信器。
我有以下代码
int main(void) {
...
int numtasks, rank;
MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
int k = 2;
if (rank == 3) {
do {
...
} while (number_of_not_finalized_processes >= numtasks - k);
}
...
MPI_Finalize();
}
并希望使用 rank = 3
循环处理,直到 k
个过程用 MPI_Finalize()
完成。我怎样才能知道有多少进程已经完成并定义 number_of_not_finalized_processes
?或者也许我有更好的替代方法来找出有多少进程仍然存在或通过了代码的特定部分?
你可以通过单方面的沟通来解决这个问题。创建一个 window,其中每个进程在完成之前:
- 在等级 3 上获得 window 的锁
- 使用
MPI_Accumulate
增加计数器
这是一个非常异步的解决方案。如果你的进程做一些同步的事情,比如说一个他们动态决定退出循环的循环,你可以例如在同步点创建一个只有活动进程的子通信器。