为啥 boost::mpi::request.test() 返回无效的统计信息

Posted

技术标签:

【中文标题】为啥 boost::mpi::request.test() 返回无效的统计信息【英文标题】:Why is boost::mpi::request.test() returning an invalid statistic为什么 boost::mpi::request.test() 返回无效的统计信息 【发布时间】:2021-03-26 22:14:06 【问题描述】:

我在使用 boost-mpi 交换时遇到了内存问题。 由于应用程序的需要,交换在发送端是异步的,在接收端是同步的,以前在基本的 mpi 代码中工作过。

#include <iostream>
#include <boost/mpi/environment.hpp>
#include <boost/mpi/communicator.hpp>

int main()

  boost::mpi::environment env;
  boost::mpi::communicator world;
  size_t irank=world.rank();
  if (irank == 0) 
    std::vector<int> V(100, 0);
    boost::mpi::request req = world.isend(1, 37, V);
    while(true) 
      boost::optional<boost::mpi::status> stat = req.test();
      if (stat) 
        if (stat->error() != 0) 
          std::cerr << "Rank 0: Non-zero error in stat\n";
          char error_string[10000];
          int length_of_error_string;
          MPI_Error_string(stat->error(), error_string, &length_of_error_string);
          fprintf(stderr, "err: %s\n", error_string);
          return 1;
        
        break;
      
    
   else 
    while(true) 
      boost::optional<boost::mpi::status> prob = world.iprobe();
      if (prob) 
        if (prob->tag() == 37) 
          std::vector<int> V;
          world.recv(prob->source(), prob->tag(), V);
          std::cerr << "Rank 1: Correct receiving of the vector\n";
          break;
        
      
    
  

消息正确接收,但是mpirun -np 2 ./CTYP_debug的错误是

Rank 0: Non-zero error in stat
Invalid error code (14263904) (error ring index 27 invalid)
Invalid error code (14263904) (error ring index 27 invalid)
err: Unknown error class, error stack:
(unknown)(): MPI_Info_create failed
Rank 1: Correct receiving of the vector

对我来说,这表明存在一些内存问题,但我找不到问题所在。 DDT 没有显示任何明显的错误。

【问题讨论】:

如果您实际指定您正在使用的 MPI 实现,这可能会有所帮助。 boost::mpi 的问题在于它在幕后做了很多事情,因此可能会掩盖问题的真正根源。 该错误发生在多种实现中:Macintosh 上的 OpenMPI 4.0.5,Linux 上的 mpich 3.3。据我了解,这是一种竞争条件,因此在某些情况下可能会发生,但在其他情况下不会发生。 在没有这些诊断的情况下一切正常。 Ubuntu 18.04 上的 GCC + openmpi + Boost MPI 1.74.0。 (除了关于缺少高速网卡的警告) 用 C-API 重新编码并得到同样的错误后,我明白了问题所在。 test() 的底层函数是MPI_Test。事实证明,在这种情况下,状态字段中没有设置错误字段。参见例如mpich.org/static/docs/v3.2/www3/MPI_Test.html 【参考方案1】:

它似乎与依赖于 MPI_Test.test() 一起发生。 事实证明,MPI_Status 结构的错误字段未在 MPI_Test 调用中设置。详情请见https://www.mpich.org/static/docs/v3.2/www3/MPI_Test.html。

【讨论】:

以上是关于为啥 boost::mpi::request.test() 返回无效的统计信息的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?