【问题标题】:How to implement a communication between MATLAB and a separate C++ application?如何实现 MATLAB 和单独的 C++ 应用程序之间的通信?
【发布时间】:2017-11-03 07:20:29
【问题描述】:

我读到我可以使用 TCP/IP 在两个应用程序之间发送数据,但我想知道这是否比使用二进制文件和轮询文件以进行更改更快?我没有时间同时实现方法和基准测试,所以如果有人知道这一点,我会很感激您的意见。

我需要来回发送两个缓冲区,一个非常小(几 KB),另一个可能是 0.1 - 1 MB。 p>

我还应该提到,C++ 应用程序在集群上运行并与 MPI 并行化,因此每个进程都需要读取整个缓冲区。在读取二进制文件时,它们可以同时并行执行,所以这不是问题。我不确定这是否可以通过 TCP/IP 完成。

【问题讨论】:

  • 好吧,恕我直言,先生,读取文件永远不可能以 [PARALLEL] 方式完成,因为无论是 O/S fileIO 服务还是设备原则上,可以同时在 BoF 和 EoF 以及任何其他 fileSeek() 位置读取。 O/S fileIO 服务可能会产生一种“just”-[CONCURRENT] fileIO 的错误错觉,但一旦经过技术检查,它就是[SERIAL]-一系列操作的时间表。一旦您最初的想法必须处理一对文件(+添加所有其他许多 fileIO 操作,这些操作将在 O/S 内部进行)
  • 我不知道,谢谢。那么你会说读取 0 级的文件然后将该数据发送到其他 rank 会更快,而不是每个 rank 都读取文件吗? (假设我最终使用文件 I/O 进行通信)
  • 我总是会说,避免使用 fileIO 是一种方法。鉴于初始文件更改是由某个进程“产生”的,即使该进程端也可以避免支付这些初始且昂贵的数百 [ms],并且可能更明确地将新数据通告给 { all |相关的}-分布式计算代理通过非阻塞、低延迟工具,其中 许多数量级 -- CMP 数千 [ms] >> 数十 [us] -- 被保存。这也节省了 parallel-computing 优势 - 较少的开销减少了破坏 - 因为它遵守开销严格的阿姆达尔定律重新制定

标签: c++ matlab parallel-processing buffer ipc


【解决方案1】:

如果您尝试通过 TCP/IP 执行此操作,则需要使用网络堆栈的 API 在一个应用程序中序列化数据并在另一个应用程序中重建数据。这可能会变得一团糟。

您可以尝试的一件事是内存映射文件。这基本上是在进程之间共享内存。超级快而且很常见。您应该为每个系统、c++ 和 MATLAB 找到一个示例,然后从那里获取。

【讨论】:

【解决方案2】:

小学,亲爱的华生……

这是流程必须支付的费用:

  • 每当一个进程接触到一个文件[SERIAL]-ly,预计 + ~12-15 [ms] 访问延迟在旋转驱动器上
  • 每当一个进程接触一个文件[CONCURRENT]-ly 添加+几个 [us] 用于 fileIO 开销,因为不止一个进程试图控制何时以及打算读取/写入什么(越多的 MPI 进程试图获得帽子和指令,被隔离访问的可能性就越低,这些开销自然只会变得更大)——更多的 MPI 节点试图做 (cit.) em>“轮询文件以进行更改”,更大的开销会增长 - 对于尝试提高性能来说确实是一个非常糟糕的主意 - 不断累积越来越多,数十到数百到数千 [ms]最昂贵的方式。
  • 每当一个进程接触 RAM [SERIAL]-ly,预计 + ~80-100 [ns] 访问延迟在经典 DDR-x DRAM 上。重读可能会被缓存层次结构掩盖,成本仅为 + 几个 [ns]
  • 每当一个进程接触 RAM 时,[CONCURRENT]-ly 添加 + 几个 [ns] 因为大多数 CPU 是乱序执行类型的硬件部件,可以自动检测并尝试重新- 安排一点内存访问模式并隐藏此附加延迟的一部分,尽管代价是失去一些缓存命中的机会,无论是由于时间或容量引起的冲突(因此必须支付那些 + ~80-一旦缓存的 LRU 部分被驱逐,需要 100 [ns] 从 DRAM 重新获取。

接下来是通过有限带宽传输大量数据的成本:

  • 从文件中读取需要花费大量时间——对于最大流量,请参阅 SATA-x、NAS 等规范,了解移动 1 MB 需要多少秒。然而,实际上期望更低的吞吐量/更长的时间,因为并非所有驱动器都具有其接口匹配性能(接口性能并不意味着设备的内部部件与通往外部世界的“电缆”一样快 - 这就是为什么有时会被驱动器内控制器的嵌入式缓存上的“缓冲”存储所掩盖)
  • 从内存中读取速度更快
  • 从缓存中读取速度最快(对于 1MB,整个 circus 可能很容易放入 localhost CPU(s) L3-cache 中)

什么会导致问题:

提到您的代码被设计为使用 MPI 工具进行分发,所有数据操作都超出了您的缓存/延迟屏蔽控制。

如果 MPI 分布式进程将尝试从某个公共源读取,无论是文件还是内存,所有高级技巧都可能会失去其基础,因为非本地 MPI 节点可能会遇到未见的问题仅限本地主机的实现模型和类似 MEMMAP 的技巧自然而然地退出了游戏。

如果性能最重要:

可以使用轻量级、高性能、异步智能消息传递/信令工具包,如 ZeroMQ,也移植到 MATLAB 和几乎所有其他语言(参考文档)。采用这种方式,您的设计可以避免轮询更改,而是对受影响的对等处理节点的每个和任何相关更改实施显式信号分配,这比尝试重新读取文件更智能、更轻量级,甚至可以工作在 LAN/(WAN) 分布式集群中但成本不超过几个 [us] -- 是的,比 fileIO 便宜数千倍,但能够在广泛的范围内提供服务分布式非 localhost-only 计算集群。

【讨论】:

  • 感谢您的回答。我不是 linux 专家,所以如果我错了请纠正我,但是查看 ZeroMQ 的安装页面(及其依赖项)似乎他们需要 sudo 权限,而我没有。
  • 最好向系统管理员寻求帮助,以按照适当的程序安装软件包。
猜你喜欢
  • 1970-01-01
  • 2015-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多