使用 MPI_Bcast 时出现 MPI 分段错误

Posted

技术标签:

【中文标题】使用 MPI_Bcast 时出现 MPI 分段错误【英文标题】:MPI Segmentation fault when using MPI_Bcast 【发布时间】:2014-05-31 05:04:08 【问题描述】:

我正在尝试计算使用 MPI_Bcast 和通常的 MPI_send 和 MPI_Recv 向所有进程广播 100 万个整数数组的加速和效率之间的差异。但我不明白为什么会出现这种分段错误,任何帮助将不胜感激。这是我的代码:

#define num_of_ints 1000000
int *create_random_array(int);
int main(int argc, char *argv[])
int size=0, my_rank =0, i=0;
int tag =99;
double start, end;
int *array = NULL;
srand(time(NULL));

MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);

if(my_rank ==0)
    array = create_random_array(size*num_of_ints);
MPI_Barrier(MPI_COMM_WORLD);
start = MPI_Wtime();
MPI_Bcast(&array, num_of_ints, MPI_INT, 0, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
end = MPI_Wtime();
printf("time of broadcast using Bcast is %f seconds", end - start);

MPI_Barrier(MPI_COMM_WORLD);
start = MPI_Wtime();
if (my_rank == 0)
    for (i = 1; i < size; i++)
        MPI_Send(&array, num_of_ints, MPI_INT, i,tag, MPI_COMM_WORLD);
else
    MPI_Recv(&array, num_of_ints, MPI_INT, 0,tag,MPI_COMM_WORLD, &status);

MPI_Barrier(MPI_COMM_WORLD);
end = MPI_Wtime();

printf("time of broadcast using send/recv is %f seconds", end - start);
MPI_Finalize();
return 0;

 int *create_random_array(int size)
int i=0;
int *random_arr = (int*)malloc(size*sizeof(int));
for(i=0;i<size;i++)
    random_arr[i] = (rand()/(int)RAND_MAX);
return random_arr;
 

【问题讨论】:

使用调试器,找出它的段错误,你不能指望我们为你做这件事。正确缩进你的代码。不要投malloc和朋友的回报。 【参考方案1】:

您的代码中有一个非常常见的错误,它与 MPI 本身无关,而是与 C/C++ 中指针的正确使用有关。 C 中的所有 MPI 通信调用都需要一个指向数据的指针,大多数示例显示为 MPI_Somecall(&amp;var, ...),但 var 通常是标量整数或浮点变量。如果var 是一个静态数组,&amp;var 也可以工作,但如果var 是一个指针,它就不起作用,因为&amp;var 然后给出了指针本身的位置,而不是它指向的地址。

简而言之:

MPI_Somecall(&var, ...)

var 是:

标量全局/静态或自动变量,例如int var; 全局/静态或结构的自动实例,例如struct foo var;

否则:

MPI_Somecall(var, ...)

var 是:

静态数组,例如int var[10]; 指向堆变量或数组的指针,例如int *var = malloc(...); 一般的指针,例如int *var = &amp;some_int_var; 指针类型的函数参数,例如void func(..., int *var, ...);

将代码中的所有&amp;array 实例替换为array

【讨论】:

【参考方案2】:

除了@HristoLLiev 报告的 & 错误之外,您的代码在内存管理方面存在缺陷,除非您修复它,否则将无法正常工作。

确实,在开始时,数组变量对于所有涉及的进程都是 NULL,但在调用 create_random_array() 时仅由排名为零的进程分配。所有其他进程不分配内存。因此,您会遇到分段错误。为了让您的代码正常工作,每个进程都必须正确分配数组。

【讨论】:

以上是关于使用 MPI_Bcast 时出现 MPI 分段错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 MPI_Bcast 进行 MPI 通信

使用 MPI (C) 交换光环/重影单元时出现未知错误

MPI_Bcast对应的接收程序

探测 MPI_Bcast 或 MPI_Send

MPI_Bcast 动态二维数组

在 C++ 中使用向量时出现分段错误