将protobuf与MPI一起用于新数据类型?

将protobuf与MPI一起用于新数据类型?,mpi,protocol-buffers,Mpi,Protocol Buffers,通常,必须定义一个新类型并向MPI注册才能使用它。我想知道是否使用protobuf序列化一个对象,并使用MPI作为字节流发送它。我有两个问题: 1您认为这种方法会有任何问题吗? 2我是否需要通过单独的MPI_发送发送发送长度信息,或者我是否可以探测并使用MPI_Get_count&status、MPI_BYTE和count 例如: // sender MyObj myobj; ... size_t size = myobj.By

通常,必须定义一个新类型并向MPI注册才能使用它。我想知道是否使用protobuf序列化一个对象,并使用MPI作为字节流发送它。我有两个问题: 1您认为这种方法会有任何问题吗? 2我是否需要通过单独的MPI_发送发送发送长度信息,或者我是否可以探测并使用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);
            ...

        }

一般来说,你可以这样做。您的代码草图看起来也不错,除了在接收方忽略了buf分配。正如Gilles指出的,确保对实际的MPI_Recv使用status.MPI_SOURCE和status.MPI_标记,而不是MPI_*_ANY

但是,存在一些性能限制

Protobuf不是很快,特别是由于en-/解码。这在很大程度上取决于您的绩效预期。如果您在高性能网络上运行,则假定会产生重大影响。给你

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


如果继续使用您的方法,请记住对实现进行一些性能分析。使用MPI感知性能分析工具,确保您的方法不会引入关键瓶颈。

我非常确定MPI是面向消息的,您应该可以。混合protobuf和MPI可能会让纯粹主义者感到不安,但我不会让它阻止你!如果您在Python中开发,也可以考虑诸如BooSTMPi或MPI4Py之类的扩展。您还需要确保MPIYRCV具有先前MPIIIIONG返回的源,否则您可能会收到来自不同级别和不同大小的消息。严格来说,由于MPIYAYIAGTAG用于MPIIIICONE,我认为MPI_ANY_标签也可以在MPI_Recv中使用。其基本原理是,来自给定列组的消息按发送顺序接收。相反,对于由不同列组发送的消息,没有全局排序,因此MPI_ANY_源不能用于MPI_Recv。有道理吗?