代码之家  ›  专栏  ›  技术社区  ›  Elliot Woods

当通过UDP发送数据时,是否可以将数据流式传输到ZeroMQ消息中?

  •  2
  • Elliot Woods  · 技术社区  · 8 年前

    我们正在使用一个延迟关键型应用程序 30fps ,管道中有多个阶段(例如压缩、网络发送、图像处理、3D计算、纹理共享等)。

    通常,我们可以实现这样的多个阶段:

    [Process 1][Process 2][Process 3]
    
    ---------------time------------->
    

    然而,如果我们可以堆叠这些进程,那么有可能 [Process 1] 正在处理数据,它不断地将结果传递给 [Process 2] 。这类似于 iostream 在c++中工作,即“流”。使用线程,这可以减少延迟:

    [Process 1]
        [Process 2]
            [Process 3]
    <------time------->
    

    让我们假设一下 [流程2] 是我们的 UDP 通信(即。 [流程1] 在计算机A上,并且 [Process 3] 在计算机B上)。

    的输出 [流程1] 大约为 3 MB (即,通常每个9 KB的巨型数据包大于300个),因此我们可以假设当我们调用 ZeroMQ 的:

    socket->send(message); // message size is 3 MB
    

    然后,在库或操作系统中的某个地方,数据被分成按顺序发送的数据包。此函数假定消息已完全形成。

    在发送大量数据时,是否有一种方法(例如API)使消息的部分“正在构建”或“按需构建” UDP公司 ? 这在接收端是否也是可能的(即,允许在消息开始时采取行动,因为消息的其余部分仍在传入)。或者……是我们自己手动将数据分割成更小的块的唯一方法吗?

    Note:
    网络连接是计算机a和B之间的直线GigE连接。

    2 回复  |  直到 8 年前
        1
  •  3
  •   hobbs    8 年前

    不,你不能现实地去做。API没有提供,ZeroMQ承诺接收者将获得完整的消息(包括多部分消息)或根本没有消息,这意味着在消息完全传输之前,它不会向接收者呈现消息。在这里,将数据自己拆分为可单独操作的块,这些块作为单独的ZeroMQ消息发送是正确的做法。

        2
  •  3
  •   user3666197    7 年前

    TLDR;-简单的答案是否定的,ZeroMQ SLOC不会帮助您的项目获胜。该项目是可行的,但需要另一个设计视图。

    陈述了一组最少的事实:
    - 30fps ,
    - 3MB/frame ,
    -三级处理管线,
    -专用主机-主机GigE互连,

    没有进一步的细节,没有多少可决定的。

    当然,有一个大约 33.333 [ms] 用于管道端到端处理(当您计划丢失一些 30 [ms] 直接通过 networkIO )剩下的交给设计师。哎哟

    延迟控制设计不得跳过实时 I/O 设计阶段

    ZeroMQ 是一匹马力马,但这并不意味着,它可以拯救一个糟糕的设计。

    如果你在时间限制上花了一些时间,局域网 网络IO 在你看来,延迟是最糟糕的敌人。

    裁判。: Latency numbers everyone should know

    1 ) 设计 处理阶段
    2 ) 基准 每个阶段的实施模型
    3 ) 平行,平行 无论什么地方 Amdahl's Law says 在可能的情况下,这是有意义的

    如果您的代码允许并行处理,您的计划将更好地使用“渐进式”流水线处理 零MQ -副本/(几乎) -等待时间/ -可实现的阻塞 inproc: 传输类和您的代码可能支持在多个处理阶段之间进行“渐进式”流水线。

    记住,这不是一句话,不要指望 SLOC 以控制“渐进式”流水线制造。

    [ns] 课题 ,仔细阅读数据处理微基准测试中的数据。
    他们确实决定了你的成功。
    在这里,您可能会看到,仅仅改变颜色表示就“浪费”了多少时间,而这是您的代码在对象检测、3D场景处理和纹理后处理中所需要的。因此,要为相当高的标准级别设置设计标准。

    检查 左下车窗 numbers 在这个实时管道中大约损失了毫秒。

    ATC LKPR-RWY

    如果您的代码的处理要求不符合您的 33,000,000 [ns] 时间预算 { quad | hexa | octa }-core CPU资源以及数字处理是否可以从中受益 many-core GPU资源,可能是这样的 Amdahl's Law may well justify 对于一些异步多GPU内核处理方法 +21,000 ~ 23,000 [ns] 在初始/终端数据传输中丢失 +350 ~ 700 [ns] 由介绍 GPU.gloMEM -> GPU.SM.REG 延迟掩蔽(这很好 在图像处理的情况下,足够的准并行线程深度,即使对于预期的普通GPU内核的低计算密度)
    Ref.:
    GPU/CPU latencies one shall validate initial design against: