2013-02-23 116 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的建議,請讓我知道。

相關問題