在C中使用MPI的分段错误错误?

所以我需要在C中使用MPI并行实现向量加法函数。不幸的是,当我运行它时,它打印了许多内存位置的痕迹,然后是这条消息:

================================================================================== = BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES = PID 2419 RUNNING AT hbaum-pc = EXIT CODE: 6 = CLEANING UP REMAINING PROCESSES = YOU CAN IGNORE THE BELOW CLEANUP MESSAGES =================================================================================== YOUR APPLICATION TERMINATED WITH THE EXIT STRING: Aborted (signal 6) This typically refers to a problem with your application. Please see the FAQ page for debugging suggestions 

这是我的function代码:

 double* vector_vector_addition_parallel(double* a, double* b, int length) { int rank, size, error; double* result = (double*)malloc(sizeof(double)*length); error = MPI_Init(NULL,NULL); error = MPI_Comm_size(MPI_COMM_WORLD,&size); error = MPI_Comm_rank(MPI_COMM_WORLD,&rank); int sublist_length = (int)(length/size); double* sub_a = (double*)malloc(sizeof(double) * sublist_length); double* sub_b = (double*)malloc(sizeof(double) * sublist_length); error = MPI_Scatter(a, sublist_length, MPI_DOUBLE, sub_a, sublist_length, MPI_DOUBLE, 0, MPI_COMM_WORLD); error = MPI_Scatter(b, sublist_length, MPI_DOUBLE, sub_b, sublist_length, MPI_DOUBLE, 0, MPI_COMM_WORLD); double* buffer = (double*)malloc(sizeof(double)*sublist_length); for(int i = 0; i < sublist_length; i++) { buffer[i] = sub_a[i] + sub_b[i]; } error = MPI_Gather(buffer,sublist_length,MPI_DOUBLE,result,length,MPI_DOUBLE,0,MPI_COMM_WORLD); error = MPI_Finalize(); return result; } 

以下是调用它的代码:

 int main(int argc, char** argv) { double a[8] = {1.0,3.0,5.0,7.0,9.0,11.0,13.0,15.0}; double b[8] = {2.0,4.0,6.0,8.0,10.0,12.0,14.0,16.0}; double* vec = vector_vector_addition_parallel(a,b,8); return 0; } 

我用它编译它

 mpicc  

并运行它

 mpiexec -n 4  

我也尝试使用gdb来调试代码,但根据gdb,没有问题,这绝对没问题。 当我使用printf输出向量时,它甚至在我通过gdb运行程序时打印正确的向量。

我认为我使用MPI_Gather的方式有问题,因为当我发表评论时,代码将在没有分段错误的情况下运行,尽管显然不是正确答案,因为我需要使用MPI_Gather才能获得结果。

如何才能改进代码以避免出现分段错误?

的确,你的MPI_Gather就是问题所在。 接收计数参数应该是从任何单个进程接收的元素数。 因此,您应该为recvcount传递sublist_length而不是length ,即:

 MPI_Gather(buffer,sublist_length,MPI_DOUBLE,result,sublist_length,MPI_DOUBLE,0,MPI_COMM_WORLD);