使用带有MPI的protobuf获得新的数据类型?

时间:2018-09-08 13:03:17

标签: mpi protocol-buffers

通常,必须定义一个新类型并将其注册到MPI才能使用。我想知道是否使用protobuf序列化对象并使用MPI作为字节流将其发送出去。我有两个问题: (1)您预见此方法有任何问题吗? (2)我是否需要通过单独的MPI_Send()发送长度信息,还是可以探测和使用MPI_Get_count(&status, MPI_BYTE, &count)

一个例子是:

        // sender 
        MyObj myobj; 
        ...
        size_t size = myobj.ByteSizeLong();
        void *buf = malloc(size);
        myobj.SerializePartialToArray(buf, size);
        MPI_Isend(buf, size, MPI_BYTE, ... )
        ...

        // receiver
        MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &flag, &status);
        if (flag) {
            MPI_Get_count(&status, MPI_BYTE, &size);
            MPI_Recv(buf, size, MPI_BYTE, ... , &status);
            MyObject obj;
            obj.ParseFromArray(buf, size);
            ...

        }

1 个答案:

答案 0 :(得分:1)

通常,您可以这样做。您的代码草图看起来也不错(除了在接收方省略的buf分配之外)。正如Gilles指出的,请确保对实际的status.MPI_SOURCE使用status.MPI_TAGMPI_Recv,而不是MPI_*_ANY

但是,存在一些性能限制。

  1. Protobuf速度不是很快,特别是由于编码/解码。这在很大程度上取决于您对性能的期望。如果您在高性能网络上运行,则将产生重大影响。这是some basic benchmarks

  2. 不知道前面的消息大小,因此总是在发送之后发布接收消息也会影响性能。这意味着实际的传输可能会在以后开始,这可能会或可能不会对发件人造成影响,因为您正在使用非阻塞发送。在某些情况下,您会遇到一些有关意外消息数量的实际限制。这不是一般的正确性问题,但可能需要进行一些配置调整。

如果继续使用该方法,请记住对实现进行一些性能分析。使用支持MPI的性能分析工具来确保您的方法不会引入严重的瓶颈。