2013-02-23 117 views
0

我对MPI很新颖。我试图在p进程上使用MPI_Sendrecv运行以下程序。每个进程有4个数组(A,B,C,D),长度为n,任何类型的值都是double。现在,这是我想要做for i=0,...,p-1简单的MPI_Sendrecv程序给出信号11(段错误)

过程我发送B到A在方法(i + 1)%P

过程我发送C到d在方法(Ⅰ-1)%P

过程i接收B,从第(i-1)%p为A

过程i接收C来自第(i + 1)%p为d

我有以下代码:

#include<stdio.h> 
#include<mpi.h> 
#include<math.h> 

main(int argc, char *argv[]){ 

/*Initialize the MPI environment   */ 
/******************************************/ 
MPI_Init(&argc, &argv); 

/*variables that will be used for sending*/ 
/*and receiving messages.    */ 
/*****************************************/ 
int n=3; 
int p; 
int myRank; 
int comm; 

double A[n]; 
double C[n]; 
double B[n]; 
double D[n]; 

/*Get the number of processors and their */ 
/*rank.         */ 
/******************************************/ 
comm = MPI_COMM_WORLD; 
MPI_Comm_size(comm, &p); 
MPI_Comm_rank(comm, &myRank); 

/*Initialize the arrays with the given */ 
/*initial values.       */ 
/******************************************/ 
for(int i=0; i<n; i++){ 
    A[i]=0;  D[i]=0; 
    B[i]=-myRank; C[i]=myRank; 
} 

int left = myRank-1; int right = myRank+1; 

if(left<0){ 
    left = p-1; 
} 

if(right==p){ 
    right = 0; 
} 

MPI_Sendrecv(&B,n,MPI_DOUBLE,right,1231, 
      &A,n,MPI_DOUBLE,left,1231, 
      comm,MPI_STATUS_IGNORE); 
MPI_Sendrecv(&C,n,MPI_DOUBLE,left,1232, 
      &D,n,MPI_DOUBLE,right,1232, 
      comm,MPI_STATUS_IGNORE); 


/*Close the MPI environment.    */ 
/******************************************/ 
MPI_Finalize(); 

/*Print the updated values.    */ 
for(int i=0; i<p; i++){ 
    printf("\n"); 
    for(int j=0; j<n; j++){ 
    if(myRank==i){ 
     printf("rank= %d, Updated Values = A[%d]= %f, B[%d]= %f, 
       C[%d]= %f, D[%d]= %f\n", myRank,j,A[j],j,B[j],j,C[j],j,D[j]);     
    } 
    } 
} 

} 

但是,每当我运行此代码,我得到以下几点:

vincent% mpicc -o hmw2Prob1 hmw2Prob1.c 
vincent% mpirun -np 4 hmw2Prob1 
2: signal 11 received, exiting.. 
2: Signal sent from unknown source. 
3: signal 11 received, exiting.. 
3: Signal sent from unknown source. 
0: signal 11 received, exiting.. 
0: Signal sent from unknown source. 
1: signal 11 received, exiting.. 
1: Signal sent from unknown source. 
vincent% 

我在这里读了几岗位,并试图一些想法存在,但到目前为止没有奏效。我会感谢您提供的任何帮助。

回答

0

删除地址(&),而在所有情况下使用像MPI_Sendrecv(B ...B是阵列/缓冲区的地址,&B是保存阵列/缓冲区的地址的变量的地址。当使用MPI(和一般的C)时,理解指针很重要 - 不幸的是我没有很好的材料解释这一点,但我相信你会发现很多。

+0

感谢您的回复。不幸的是,我确实尝试过,正如我在其他一些帖子中看到的,对于一些有类似问题的人来说,它已经修复了它。但问题是他们开始指向一个指针。在我的情况下,我在开始时声明所有的数组,而不仅仅是地址。我一直坚持这一两天,除了用普通send和recv做这些之外,我的想法并不多,但整个过程就是用MPI Sendrecv命令来完成它。 – breheme 2013-02-25 17:10:57

+0

请发布您的更新程序以及您获得的精确错误,您的实施和系统配置。该程序适用于我,如果你删除了不正确的'&'。此外,我强烈建议您在C中更多地关注指针,数组和内存位置。您应该从不**只是猜测或尝试'x''&x'' * x'是否工作。 – Zulan 2013-02-26 10:51:43

0

感谢那些花时间阅读我的问题的人。在到底是什么错我的代码是在SENDRECV:

MPI_Sendrecv(&B,n,MPI_DOUBLE,right,1231, 
     &A,n,MPI_DOUBLE,left,1231, 
     comm,MPI_STATUS_IGNORE); 
MPI_Sendrecv(&C,n,MPI_DOUBLE,left,1232, 
     &D,n,MPI_DOUBLE,right,1232, 
     comm,MPI_STATUS_IGNORE); 

不能使用MPI_STATUS_IGNORE,我还没有想通了MPI的所有内部工作但是从我已阅读系统需要MPI_Status *状态才能解析消息传递顺序。

无论如何,如果有人有进一步的学习MPI的建议,请让我知道。

相关问题