我对MPI很新。我试图在MPI_Sendrecv
进程上使用p
运行以下程序。每个进程有4个长度为n
的数组(A,B,C,D),其值为double类型。现在这就是我想做的for i=0,...,p-1
:
进程i在进程(i + 1)%p
中将B发送给A.过程i在过程(i-1)%p
中将C发送到D.过程我从(i-1)%p接收B到A
过程i从(i + 1)%p接收C到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 :(得分:0)
删除地址(&amp;),而不是在所有情况下使用MPI_Sendrecv(B ...
。 B
是数组/缓冲区的地址,&B
保存数组/缓冲区地址的变量的地址。在使用MPI(和一般的C)时,必须对指针有一个很好的理解 - 遗憾的是我没有很好的材料来解释这一点,但我相信你会发现很多。
答案 1 :(得分: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,请告诉我。