Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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
C 可笑的简单MPI发送/接收问题我不知道';我不明白_C_Mpi - Fatal编程技术网

C 可笑的简单MPI发送/接收问题我不知道';我不明白

C 可笑的简单MPI发送/接收问题我不知道';我不明白,c,mpi,C,Mpi,我有两个不同算法的函数。在第一个函数中,我实现了非阻塞通信(MPI_Irecv、MPI_Isend),程序运行时没有任何错误。即使我将非阻塞通信更改为阻塞通信,一切都很好。没有僵局。 但是如果我用基本的阻塞通信实现第二个函数,就像这样(将算法简化为问题): 因此,进程1应该从进程0接收值a。但我得到了一个错误: MPI_Recv中的致命错误:消息 截断,错误堆栈: MPI_Recv(187): MPI_Recv(buf=0xbfbef2a8,计数=1, MPI_双精度,src=0,tag=0,

我有两个不同算法的函数。在第一个函数中,我实现了非阻塞通信(MPI_Irecv、MPI_Isend),程序运行时没有任何错误。即使我将非阻塞通信更改为阻塞通信,一切都很好。没有僵局。 但是如果我用基本的阻塞通信实现第二个函数,就像这样(将算法简化为问题):

因此,进程1应该从进程0接收值a。但我得到了一个错误:

MPI_Recv中的致命错误:消息 截断,错误堆栈: MPI_Recv(187): MPI_Recv(buf=0xbfbef2a8,计数=1, MPI_双精度,src=0,tag=0, MPI_通信世界,状态=0xbfbef294) 失败 MPIDI CH3U请求打开包装(600): 消息被截断;接收到32字节 但缓冲区大小是8,在作业39中排名2 布拉布拉引起的集体冲突 所有列组的中止退出状态 等级2:被信号9杀死


如果我只使用这两个函数中的一个来运行程序,那么它们就可以正常工作。但这两种情况一起会导致上面的错误消息。我确实理解错误消息,但我不知道我能做些什么来防止它。有人能告诉我在哪里可以找到错误吗?因为第一个函数没有死锁,所以我假设第一个函数不会有未接收到的发送导致第二个函数出错。

因此,这里是第一个函数:

MPI_Type_vector(m,1,m,MPI_DOUBLE, &column_mpi_t ) ;
MPI_Type_commit(&column_mpi_t) ;

T = (double**)malloc(m*sizeof(double*)) ;
T_data = (double*)malloc(m*m*sizeof(double)) ;


for(i=0;i<m;i++)
{
  T[i] = &(T_data[i*m]) ;
}

if(my_rank==0)
{
  s = &(T[0][0]) ;
  for(i=1;i<p;i++)
  {
    MPI_Send(s,1,column_mpi_t,i,0,MPI_COMM_WORLD) ;
  }
}
for(k=0;k<m-1;k++)
{
  if(k%p != my_rank)
  {
    rbuffer = &(T[0][k]) ;
    MPI_Recv(rbuffer,1,column_mpi_t,k%p,0,MPI_COMM_WORLD,&status) ;
  }

  for(j=k+1;j<n;j++)
  {
    if(j%p==my_rank)
    {
      if(j==k+1 && j!=n-1)
      {
        sbuffer = &(T[0][k+1]) ;
        for(i=0;i<p;i++)
        {
          if(i!= (k+1)%p )
            MPI_Send(sbuffer,1,column_mpi_t,i,0,MPI_COMM_WORLD) ;
        }
      }         
    }
  }
}
MPI类型向量(m,1,m,MPI-DOUBLE,&column-MPI-t);
MPI\u类型\u提交(&column\u MPI\u t);
T=(双**)malloc(m*sizeof(双*);
T_data=(双*)malloc(m*m*sizeof(双));

对于(i=0;问题不是Recv vs Irecv,当然也不是死锁。问题是,从任务0接收单个MPI_双精度的秩2的Recv()与从大小为32字节的秩0发送的匹配(可能是4双精度?)。因此,消息被截断了。因此,我们需要查看更多代码以了解发生了什么。我知道。第二个函数仅包含send/recv操作。它肯定位于第一个函数中,因为(取决于用户输入)这正是通信阵列的大小。但这怎么可能?所有发送/接收操作都必须完成,否则会导致死锁。或者我完全错了吗?整个代码大约有600行。必须简化它…可能需要一段时间。这里的
m
p
是什么?现在,看起来像是ely表示发送和接收的数据不匹配。
MPI_Type_vector(m,1,m,MPI_DOUBLE, &column_mpi_t ) ;
MPI_Type_commit(&column_mpi_t) ;

T = (double**)malloc(m*sizeof(double*)) ;
T_data = (double*)malloc(m*m*sizeof(double)) ;


for(i=0;i<m;i++)
{
  T[i] = &(T_data[i*m]) ;
}

if(my_rank==0)
{
  s = &(T[0][0]) ;
  for(i=1;i<p;i++)
  {
    MPI_Send(s,1,column_mpi_t,i,0,MPI_COMM_WORLD) ;
  }
}
for(k=0;k<m-1;k++)
{
  if(k%p != my_rank)
  {
    rbuffer = &(T[0][k]) ;
    MPI_Recv(rbuffer,1,column_mpi_t,k%p,0,MPI_COMM_WORLD,&status) ;
  }

  for(j=k+1;j<n;j++)
  {
    if(j%p==my_rank)
    {
      if(j==k+1 && j!=n-1)
      {
        sbuffer = &(T[0][k+1]) ;
        for(i=0;i<p;i++)
        {
          if(i!= (k+1)%p )
            MPI_Send(sbuffer,1,column_mpi_t,i,0,MPI_COMM_WORLD) ;
        }
      }         
    }
  }
}