Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parallel processing 简单MPI_Sendrecv程序发出信号11(SEGFULT)_Parallel Processing_Mpi - Fatal编程技术网

Parallel processing 简单MPI_Sendrecv程序发出信号11(SEGFULT)

Parallel processing 简单MPI_Sendrecv程序发出信号11(SEGFULT),parallel-processing,mpi,Parallel Processing,Mpi,我对MPI很陌生。我正在尝试使用p进程上的MPI\u Sendrecv运行以下程序。每个进程有4个数组(A、B、C、D),长度n,任意值为double类型。这就是我想为I=0,…,p-1做的: 进程i将B发送到进程(i+1)%p中的A 进程i在进程(i-1)%p中向D发送C 进程i将B从(i-1)%p接收到A中 进程i将C从(i+1)%p接收到D中 我有以下代码: #include<stdio.h> #include<mpi.h> #include<math.h&g

我对MPI很陌生。我正在尝试使用
p
进程上的
MPI\u Sendrecv
运行以下程序。每个进程有4个数组(A、B、C、D),长度
n
,任意值为double类型。这就是我想为I=0,…,p-1做的

进程i将B发送到进程(i+1)%p中的A

进程i在进程(i-1)%p中向D发送C

进程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]);                   
    }
  }
 }

 }

我在这里读了好几篇文章,尝试了其中的一些想法,但到目前为止没有任何效果。我将感激你能提供的任何帮助

删除(&)的地址,而在所有情况下都使用类似于
MPI_Sendrecv(B…
B
是数组/缓冲区的地址,
&B
是保存数组/缓冲区地址的变量的地址。在使用MPI(通常是C)时对指针有很好的理解是很重要的-不幸的是,我没有很好的材料来解释这一点,但我相信你会发现很多。

感谢那些花时间阅读我的问题的人。最后,我的代码的错误是在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的建议,请让我知道。

谢谢您的回复。不幸的是,我确实尝试过,正如我在其他一些帖子中看到的那样,对于一些有类似问题的人,它确实修复了它。但问题是,他们开始指向指针。在我的情况下,我声明了开始中的所有数组ning,不仅仅是地址。我已经在这上面停留了几天,除了使用普通的发送和recv外,我没有其他想法,但整个要点是使用MPI Sendrecv命令。请发布您的更新程序和由此产生的准确错误,以及您的实现和系统配置。该程序运行正常对于我来说,如果你删除了不正确的
&
,我强烈建议你更多地了解C语言中的指针、数组和内存位置。你永远不应该只是猜测或尝试
x
&x
*x
是否有效。
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);