使用 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(&var, ...)
,但 var
通常是标量整数或浮点变量。如果var
是一个静态数组,&var
也可以工作,但如果var
是一个指针,它就不起作用,因为&var
然后给出了指针本身的位置,而不是它指向的地址。
简而言之:
MPI_Somecall(&var, ...)
当var
是:
int var;
全局/静态或结构的自动实例,例如struct foo var;
否则:
MPI_Somecall(var, ...)
当var
是:
int var[10];
指向堆变量或数组的指针,例如int *var = malloc(...);
一般的指针,例如int *var = &some_int_var;
指针类型的函数参数,例如void func(..., int *var, ...);
将代码中的所有&array
实例替换为array
。
【讨论】:
【参考方案2】:除了@HristoLLiev 报告的 & 错误之外,您的代码在内存管理方面存在缺陷,除非您修复它,否则将无法正常工作。
确实,在开始时,数组变量对于所有涉及的进程都是 NULL,但在调用 create_random_array() 时仅由排名为零的进程分配。所有其他进程不分配内存。因此,您会遇到分段错误。为了让您的代码正常工作,每个进程都必须正确分配数组。
【讨论】:
以上是关于使用 MPI_Bcast 时出现 MPI 分段错误的主要内容,如果未能解决你的问题,请参考以下文章