【发布时间】:2012-01-24 12:00:00
【问题描述】:
我正在尝试将 NxN 矩阵的分区发送到不同的进程。我使用 MPI_Scatterv 成功了,正如您在下面的代码中看到的那样,但如果我尝试使用 MPI_Send 和 MPI_Recv 代替,结果是段错误.为什么? 我看到了与此类似的不同问题,例如MPI Matrix Multiplication with Dynamic Allocation: Seg. Fault,但没有任何变化...
n = N/nprocs;
n0 = n + N - n*nprocs;
int counts[nprocs], displs[nprocs];
counts[0] = n0*N;
displs[0] = 0;
for(i=1;i<nprocs;i++){
counts[i]=n*N;
displs[i]=(n0+(i-1)*n)*N;
}
double * weights = (double *)calloc(N*N, (sizeof(double)));
if(myid == 0){
n = n0;
for(i=0; i<N; i++){
for(j=i; j<N; j++){
if(i==j) *(weights+i*N+j) = 0;
else {
*(weights+i*N+j) = rand() / (RAND_MAX+1.0);
*(weights+j*N+i) = *(weights+i*N+j);
}
}
}
}
double * partition = (double *)calloc(n*N, (sizeof(double)));
MPI_Scatterv(weights, counts, displs, MPI_DOUBLE, partition, n*N, MPI_DOUBLE, 0, COMM);
改为使用 send 和 recv 原语:
if(myid==0){
for(i=0; i<nprocs; i++)
MPI_Send(weights+displs[i], counts[i], MPI_DOUBLE, i, 0, COMM);
}
MPI_Recv(partition, counts[myid], MPI_DOUBLE, 0, 0, COMM, status);
怎么了?先感谢您... p.s.:对不起我的英语!
【问题讨论】: