6

我目前正在使用 boost::mpi 在 openMPI 之上编写模拟,并且一切正常。但是,一旦我扩大系统规模并因此必须发送更大的 std::vectors 我就会出错。

我已将问题简化为以下问题:

#include <boost/mpi.hpp>
#include <boost/mpi/environment.hpp>
#include <boost/mpi/communicator.hpp>
#include <boost/serialization/vector.hpp>
#include <iostream>
#include <vector>
namespace mpi = boost::mpi;

int main() {
    mpi::environment env;
    mpi::communicator world;

    std::vector<char> a;
    std::vector<char> b;
    if (world.rank() == 0) {
        for (size_t i = 1; i < 1E10; i *= 2) {
            a.resize(i);
            std::cout << "a " << a.size();
            world.isend(0, 0, a);
            world.recv(0, 0, b);
            std::cout << "\tB " << b.size() << std::endl;
        }
    }
    return 0;
}

打印出来:

a 1 B 1
a 2 B 2
a 4 B 4
....
a 16384 B 16384
a 32768 B 32768
a 65536 B 65536
a 131072    B 0
a 262144    B 0
a 524288    B 0
a 1048576   B 0
a 2097152   B 0

我知道 mpi 消息大小是有限制的,但 65kB 对我来说似乎有点低。有没有办法发送更大的消息?

4

1 回答 1

4

消息大小的限制与MPI_Send:相同INT_MAX

问题是在下一次迭代中isend调整向量大小之前,您没有等待完成。a这意味着isend由于向量中的重新分配,它将读取无效数据a。请注意,缓冲区a是通过引用传递的,因此在操作完成之前boost::mpi不允许更改缓冲区。aisend

如果您使用 运行程序valgrind,一旦 i = 131072,您就会看到无效读取。

您的程序工作到 65536 字节的原因是,如果消息小于 components ,OpenMPI 将直接发送消息btl_eager_limit。对于self组件(发送到自己的进程),这恰好是128*1024字节。由于boost::serialization将 的大小添加std::vector到字节流中,因此eager_limit一旦用作128*1024 = 131072输入大小,就会超过此大小。

要修复您的代码,请保存boost::mpi::request返回值isend(),然后添加wait()到循环的末尾:

#include <boost/mpi.hpp>
#include <boost/mpi/environment.hpp>
#include <boost/mpi/communicator.hpp>
#include <boost/serialization/vector.hpp>
#include <iostream>
#include <vector>
namespace mpi = boost::mpi;

int main() {
    mpi::environment env;
    mpi::communicator world;

    std::vector<char> a;
    std::vector<char> b;
    if (world.rank() == 0) {
        for (size_t i = 1; i < 1E9; i *= 2) {
            a.resize(i);
            std::cout << "a " << a.size();
            mpi::request req = world.isend(0, 0, a);
            world.recv(0, 0, b);
            std::cout << "\tB " << b.size() << std::endl;
            req.wait();
        }
    }
    return 0;
}
于 2015-03-07T22:18:07.030 回答