我對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%
我在這裏讀了幾崗位,並試圖一些想法存在,但到目前爲止沒有奏效。我會感謝您提供的任何幫助。
感謝您的回覆。不幸的是,我確實嘗試過,正如我在其他一些帖子中看到的,對於一些有類似問題的人來說,它已經修復了它。但問題是他們開始指向一個指針。在我的情況下,我在開始時聲明所有的數組,而不僅僅是地址。我一直堅持這一兩天,除了用普通send和recv做這些之外,我的想法並不多,但整個過程就是用MPI Sendrecv命令來完成它。 – breheme 2013-02-25 17:10:57
請發佈您的更新程序以及您獲得的精確錯誤,您的實施和系統配置。該程序適用於我,如果你刪除了不正確的'&'。此外,我強烈建議您在C中更多地關注指針,數組和內存位置。您應該從不**只是猜測或嘗試'x''&x'' * x'是否工作。 – Zulan 2013-02-26 10:51:43