【发布时间】: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
标签: c++ boost mpi distributed-system