2015-05-27 62 views
0

我想并行化一些计算矩阵的代码段,但我得到了段错误错误。我已经调试了代码,但我无法找出问题所在。MPI_Scatter段错误(信号11)

这里是片段,我宣布矩阵的计算方法:

double **A, **B, **C, *tmp1,*tmp2,*tmp3; 
int N; 
int myrank, P, from, to; 

N = 100; 

tmp1 = (double *) malloc (sizeof(double) * N * N); 
tmp2 = (double *) malloc (sizeof(double) * N * N); 
tmp3 = (double *) malloc (sizeof(double) * N * N); 
A = (double **) malloc (sizeof(double *) * N); 
B = (double **) malloc (sizeof(double *) * N); 
C = (double **) malloc (sizeof(double *) * N); 

from = myrank * N/P; 
to = (myrank+1) * N/P; 

然后这里是我的inicialize MPI

MPI_Init (&argc, &argv); 
MPI_Comm_rank(MPI_COMM_WORLD, &myrank); 
MPI_Comm_size(MPI_COMM_WORLD, &P); 

但不知何故,我不能撒...

MPI_Bcast(B, N*N, MPI_INT, 0, MPI_COMM_WORLD); 

printf("Rank: %d\n", myrank); 

MPI_Scatter(A, N*N/P, MPI_INT, &A[from], N*N/P, MPI_INT, 0, MPI_COMM_WORLD); 

我不能在这里写所有的代码,因为我不被允许...但问题是在自我散布。我做错了什么?

+3

请考虑尽可能让别人帮助您。即不会转储看起来不相关的代码的片段。不要把你的整个程序放在这里。相反,尝试删除与问题无关的代码块,同时仍然重现错误。即试图制作一个[简短的,独立的,可编译的例子](http://sscce.org/)。然后粘贴。你在这里粘贴的是如此断开连接,大多数人甚至不会喜欢阅读它。 – ArjunShankar

+0

变量'P'在未初始化的情况下使用! –

回答

1

您不能直接发送2-D矩阵(double**)。相反,您必须传递实际数据的地址:&A[0][0]。对于接收,您还必须将地址传递到实际存储数据的位置。在你的情况下,这将是:&A[from][0]而不是&A[from]。在其他A比那些收到仍将无效

MPI_Scatter(&A[0][0], N*N/P, MPI_INT, &A[from][0], N*N/P, MPI_INT, 0, MPI_COMM_WORLD); 

在另一方面,在接收过程中的所有值:

尝试以此为散布。您可能需要考虑创建所需大小的单独接收缓冲区:

double* local_A = (double*)malloc(sizeof(double)*N*N/P); 
MPI_Scatter(&A[0][0], N*N/P, MPI_INT, local_A, N*N/P, MPI_INT, 0, MPI_COMM_WORLD); 
+0

感谢您的回答。我已经做出了改变,现在它可以工作,但只适用于1个处理器。当我使用2个或更多进程时,我仍然存在分段错误错误 – TCMSSS

相关问题