gpt4 book ai didi

c - 具有集体功能的 MPI 死锁

转载 作者:行者123 更新时间:2023-12-01 08:12:01 29 4
gpt4 key购买 nike

我正在使用 MPI 库用 C 语言编写一个简单的程序。该程序的目的如下:

我有一组执行迭代循环的进程,在这个循环结束时,通信器中的所有进程必须调用两个集体函数(MPI_AllreduceMPI_Bcast) .第一个发送生成了 num.val 变量最小值的进程的 id,第二个从源 num_min.idx_v 广播到所有进程在通信器 MPI_COMM_WORLD 中。

问题是在调用集体函数之前不知道第i个进程是否完成。所有进程都有 1/10 的概率终止。这模拟了我正在实现的真实程序的行为。当第一个进程终止时,其他进程会导致死锁。

这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>

typedef struct double_int{
double val;
int idx_v;
}double_int;

int main(int argc, char **argv)
{
int n = 10;
int max_it = 4000;
int proc_id, n_proc;double *x = (double *)malloc(n*sizeof(double));

MPI_Init(&argc, &argv);

MPI_Comm_size(MPI_COMM_WORLD, &n_proc);
MPI_Comm_rank(MPI_COMM_WORLD, &proc_id);

srand(proc_id);

double_int num_min;
double_int num;

int k;
for(k = 0; k < max_it; k++){

num.idx_v = proc_id;
num.val = rand()/(double)RAND_MAX;

if((rand() % 10) == 0){

printf("iter %d: proc %d terminato\n", k, proc_id);

MPI_Finalize();
exit(EXIT_SUCCESS);
}

MPI_Allreduce(&num, &num_min, 1, MPI_DOUBLE_INT, MPI_MINLOC, MPI_COMM_WORLD);
MPI_Bcast(x, n, MPI_DOUBLE, num_min.idx_v, MPI_COMM_WORLD);
}

MPI_Finalize();
exit(EXIT_SUCCESS);
}

也许我应该在 if 语句中调用 MPI_Finalize 函数之前创建一个新的组和一个新的通信器?我该如何解决?

最佳答案

如果您在进程终止之前控制了它,您应该将非阻塞标志发送到不能提前终止的等级(我们称之为根等级)。然后,您可以使用它们的值从所有级别发送到根级别,而不是使用阻塞 all_reduce。

根等级可以为可能的标志和值发布非阻塞接收。所有队伍都必须派出一个或另一个。一旦考虑了所有等级,您就可以减少根等级,从通信中删除退出的等级并广播它。

如果你的队伍在没有通知的情况下退出,我不确定你有什么选择。

关于c - 具有集体功能的 MPI 死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30479817/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com