如何使用 MPI_Abort() 终止其他处理器
How to use MPI_Abort() to terminate other processors
在 MPI 中,MPI_Abort()
主要用于中止异常行为。在我下面的程序中,在每次迭代中,ROOT 进程检查一个条件,而其余处理器在 MPI_Barrier
等待接收下一次迭代的数据。因此,如果达到阈值,我希望 root 终止整个循环 并且其他处理器也应该离开循环并终止 。我的问题是:使用 MPI_Abort()
让在屏障中等待的处理器终止是否有意义?
void kmeans() {
do{
// Step1: ROOT Broadcast the K centroids.
MPI_Bcast(&cluster_centroids, N, MPI_FLOAT, ROOT, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
// Step2: Calculate the distances.
points_assignment(data, cluster_center);
// Step3: Update cluster centroid (Locally at each processor)
update_centroids_locally();
if(Rank == ROOT){
// Step4: ROOT checks the threshold
Flag = check_threshold(cluster_center);
if(Flag == 1){
// MPI_Abort(MPI_COMM_WORLD,0);
break;
}else{
continue;
}
}
} while(1);
}
为了避免使用MPI_Abort
,我可以想到两个终止选项:
1) 简单的:每次广播一个终止标志,每个进程将根据该标志继续或停止。
2) 您可以使用两个 MPI_IBcast
和 MPI_Waitany
。使用一个 MPI_IBcast
你将广播你的 cluster_centroids
而另一个你将广播一个终止标志。每次您检查广播是否已完成并基于此,每个进程将决定继续或停止。
在 MPI 中,MPI_Abort()
主要用于中止异常行为。在我下面的程序中,在每次迭代中,ROOT 进程检查一个条件,而其余处理器在 MPI_Barrier
等待接收下一次迭代的数据。因此,如果达到阈值,我希望 root 终止整个循环 并且其他处理器也应该离开循环并终止 。我的问题是:使用 MPI_Abort()
让在屏障中等待的处理器终止是否有意义?
void kmeans() {
do{
// Step1: ROOT Broadcast the K centroids.
MPI_Bcast(&cluster_centroids, N, MPI_FLOAT, ROOT, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
// Step2: Calculate the distances.
points_assignment(data, cluster_center);
// Step3: Update cluster centroid (Locally at each processor)
update_centroids_locally();
if(Rank == ROOT){
// Step4: ROOT checks the threshold
Flag = check_threshold(cluster_center);
if(Flag == 1){
// MPI_Abort(MPI_COMM_WORLD,0);
break;
}else{
continue;
}
}
} while(1);
}
为了避免使用MPI_Abort
,我可以想到两个终止选项:
1) 简单的:每次广播一个终止标志,每个进程将根据该标志继续或停止。
2) 您可以使用两个 MPI_IBcast
和 MPI_Waitany
。使用一个 MPI_IBcast
你将广播你的 cluster_centroids
而另一个你将广播一个终止标志。每次您检查广播是否已完成并基于此,每个进程将决定继续或停止。