【问题标题】:Fatal Error in MPI_WaitMPI_Wait 中的致命错误
【发布时间】:2011-05-18 04:41:11
【问题描述】:

下面是源代码实现的输出。我不确定这意味着什么以及我应该如何修复代码。

 aborting job:
 Fatal error in MPI_Wait: Invalid MPI_Request, error stack:
 MPI_Wait(139): MPI_Wait(request=0xffffd6a4, status0xffffd690) failed
 MPI_Wait(75) : Invalid MPI_Request
 rank 0 in job 1 <processor #) caused collective abort of all ranks
 exit status of rank 0: return code 13

源代码:

 #define Rows 48 
 ...

  double *northedge1 = new double[Rows];
  double *northofnorthedge3 = new double[Rows];
  ...
  ...

  int main (int argc, char *argv[])
  {
  ....
  ....

  MPI_Request send_request, recv_request;
  ...
  ...


  if ((my_rank) == 1)
  {
  MPI_Isend(northedge1, Rows, MPI_DOUBLE, my_rank+2, 0, MPI_COMM_WORLD, &send_request); 
  }

  if ((my_rank) == 3)
  {
  MPI_Irecv(northofnorthedge3, Rows, MPI_DOUBLE, my_rank-2, MPI_ANY_TAG, MPI_COMM_WORLD,   
  &send_request);
  }


  MPI_Wait(&send_request, &status);
  .....
  MPI_Finalize ()

【问题讨论】:

    标签: c++ mpi


    【解决方案1】:

    看起来您甚至从 rank 0 开始调用 MPI_Wait(),即使您只在 rank 1 和 3 中进行非阻塞通信。因此在 rank 0 中没有有效的 send_request,因此 MPI_Wait 无效。在上面,看起来你应该有

     if ( (my_rank == 1) || (my_rank == 3))   
          MPI_Wait(&send_request, &status);
    

    【讨论】:

    • 乔纳森:谢谢。我解决了这个问题,但我注意到当我在一个带有 MPI_Wait 的“if”语句中执行多个 MPI_Isend 和 MPI_Irecv 时,似乎只有最后一个 MPI_Irecv 执行正常。我的问题是,我是否必须查看发送/接收命令的顺序,或者每个 MPI_Recv 应该跟一个 MPI_Wait 命令?谢谢!
    • 是的,您不能继续接收(或发送,或两者)到同一个请求中;请求就像待处理通信的跟踪号,您不想覆盖任何内容。如果您要处理多个待处理请求,最好将多个 MPI_Requests 和状态放在一个数组中(例如,MPI_Request reqs[5]; MPI_Status stats[5];),然后一次使用一个(MPI_Isend(...,reqs[0]); MPI_Irecv(...,reqs[1]); ...),然后使用@987654325 @) 等待所有人。如果您也想一次循环处理一个,还有一个 Wait_any。
    • Jonathan:我尝试了您的建议并包含了查询链接。我无法在此处发布代码摘录 stackoverflow.com/questions/6052486/…>。我注意到并非所有我希望的信息都通过了。我只是想确保我没有忽略语法或代码设置方式中的某些内容。您的意见将不胜感激。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 2015-07-24
    • 2013-09-09
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多