gpt4 book ai didi

c++ - 在对齐的内存缓冲区中为 capnp FlatArrayMessageReader 接收 zmq 消息

转载 作者:行者123 更新时间:2023-12-02 10:21:18 25 4
gpt4 key购买 nike

我正在通过 ZeroMQ PUB/SUB 发送消息原型(prototype),使用 tcp://传输类 channel ,在序列化 capnp 之后使用 capnp::messageToFlatArray 发送消息.在接收方,我在 zmq_msg_t 中接收全部内容信息。但是zmq_msg_data(&message)返回不是 capnp::word 的内存位置对齐。所以FlatArrayMessageReader正在抛出内存未对齐的异常。

简化的代码如下所示:

    zmq_msg_t message;
zmq_msg_init(&message);

zmq_msg_recv(&message, socket, flags);

size_t size = zmq_msg_size(&message);
auto data = zmq_msg_data(&message);
auto pdata = kj::arrayPtr((const capnp::word*)data, size / sizeof(capnp::word));
capnp::FlatArrayMessageReader msg = capnp::FlatArrayMessageReader(pdata); // exception

什么是在不复制整个缓冲区的情况下对齐数据的好方法?或者有没有办法在没有性能损失的情况下在字对齐的内存中接收消息 - 比如在 zmq 中禁用零复制?

尝试使用 capnp 版本 0.7.0、zeromq 版本 4.3.2 和 gcc 7.4.0 的 ubuntu 18.04。

最佳答案

Q : What would be a good way to get the data aligned without copying the entire buffer?



好吧,鉴于 ZeroMQ(原样)基于自主工作的 Context() - 实例引擎,出于同样的性能动机原因,它自己 promise 零拷贝,消息的存储位置由 Context() 确定不“看到”的内部政策越不“服从” capnp -优先。

除非重构 不仅是zmq_msg_init() 本身,但 ZeroMQ 内部所有相关的以性能为动机的内部性,以便在外部“强制”和“保持”某种(此处为 capnp - 动机,导致示例性 “利益冲突” ) 更高级别的灌输内存管理(对齐分配、重用和释放策略),对于已经成熟、聪明和 slim 的人(原样)期待这种行为似乎是零机会) 和大小合适、功能恰到好处的工具,旨在提供快速、最小延迟但几乎线性可扩展的消息传递/信令工具。

Q : is there a way to receive the message in a word aligned memory without performance penalty - like disabling zero copy in zmq?



AFAIK,从来没有遇到过“跨”已发布 API 的这种配置(从 v2.+ 到 2020/Q1 的 v4.3)。

可能会尝试扫描带有注释的源代码,其中任何此类技巧似乎都已到位。

关于c++ - 在对齐的内存缓冲区中为 capnp FlatArrayMessageReader 接收 zmq 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60029411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com