为啥 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,为啥它受到保护?