0

次のコードでは、このエラー メッセージが表示されます。

'boost::exception_detail::clone_impl'
what(): MPI_Test: MPI_ERR_TRUNCATE: message truncatedのインスタンスをスローした後に呼び出された終了

この問題は、この投稿で説明されている boost::mpi のバグに関連している可能性があります。エラーの理由を確認したい。

1 回だけループする場合 ( for (int z=0; z<1; ++z))、コードは機能しz<2ますが、前述のエラー メッセージが表示されます。

#include <boost/mpi.hpp>

class MyClass
{
    std::vector<double> vec;

    public:

    void send_data(const boost::mpi::communicator& world, boost::mpi::request& req)
    {
        if (world.rank() == 0)
        {
            vec.resize(1000);
            req = world.isend(1, 0, vec);
        }
    }

    void recv_data(const boost::mpi::communicator& world)
    {
        if (world.rank() == 1)
        {
            while (true)
            {
                boost::mpi::request req = world.irecv(boost::mpi::any_source, 0, vec);
                if (!req.test())
                {
                    req.cancel();
                    //req.wait(); <-- hangs the program.
                    break;
                }
            }
        }
    }
};

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

    MyClass myclass;

    for (int z=0; z<2; ++z) // works if loop only once.
    {
        boost::mpi::request req;

        myclass.send_data(world, req);
        world.barrier();
        myclass.recv_data(world);
        world.barrier();
        if (world.rank() == 0)
            req.wait();
    }

    return 0;
}
4

1 に答える 1