c - 如何使用 MPI_Abort() 终止其他处理器

标签 c parallel-processing mpi

在 MPI 中,MPI_Abort() 主要用于中止异常行为。在下面的程序中,每次迭代时,ROOT 进程都会检查一个条件,而其余处理器则在 MPI_Barrier 处等待接收下一次迭代的数据。因此,如果满足阈值,我希望根终止整个循环并且其他处理器也应该离开循环并终止。我的问题是:使用 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_IBcastMPI_Waitany。使用一个MPI_IBcast,您将广播您的cluster_centroids,而使用另一个,您将广播终止标志。每次您将检查广播是否已完成,并基于此,每个进程将决定继续或停止。

关于c - 如何使用 MPI_Abort() 终止其他处理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39560629/

相关文章:

algorithm - 使用 PRAM 算法合并包含重复元素的数组

algorithm - 并行矩阵乘积

c - 遇到文件 I/O 和字符串数组的问题

C:组合 while 和 if 语句

c - 当涉及 fork 时,如何在两个进程之间共享变量

multithreading - 并行和并发编程(Haskell)方面的开销是多少?

c - 使用最大有符号 int 值时,项目 euler 的函数出错

multithreading - Condition 的哪些实现不需要当前线程持有锁?

c++ - 可以在 Internet 上而不是在 LAN 集群内分发 MPI (C++) 程序吗?

c++ - 在 32 位和 64 位处理器上运行混合 mpi 可执行文件