如何实现MATLAB和单独的C++应用程序之间的通信

How to implement a communication between MATLAB and a separate C++ application?

本文关键字:单独 C++ 应用程序 通信 之间 MATLAB 何实现 实现      更新时间:2023-10-16

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

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

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

如果您试图通过TCP/IP实现这一点,则需要使用网络堆栈的API在一个应用程序中串行化数据,并在另一个应用中重新构建数据。这可能会变得一团糟。

你可以尝试一个内存映射文件。这基本上是在进程之间共享内存。速度极快,很普通。你只需要为每个系统找到一个例子,c++和MATLAB,并从中学习。

小学,亲爱的Watson

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

  • 每当进程接触文件[SERIAL]-时,旋转驱动器上的访问延迟预计为+/-12[ms]
  • 每当进程接触文件CCD_ 2时,添加+几个[us]用于文件IO开销,由于不止一个进程试图控制何时以及要读取/写入什么内容(MPI进程越多地试图获得帽子和指令,成为孤立访问的概率就越低;这些开销自然只会越来越大)——MPI节点越多地尝试执行(同上)">轮询文件以获取更改",开销会增长得越大——对于提高性能的尝试来说,这确实是一个非常糟糕的想法——持续积累越来越多的数十到数百到数千毫秒是最昂贵的方法
  • 每当进程接触RAM[SERIAL]-ly时,在经典DDR-x DRAM上预计访问延迟为+~80-100[ns]。重新读取可能会被缓存层次结构屏蔽,成本仅为几[ns]
  • 每当进程接触RAM时,[CONCURRENT]-都会添加+几个[ns],因为大多数CPU都是无序执行型硬件,可以自动检测并尝试重新安排内存访问模式,并隐藏部分附加延迟,尽管代价是失去一些缓存命中的机会,无论是由于时间冲突还是容量冲突(因此,一旦缓存的LRU部件被逐出,就必须支付+~80-100[ns]的费用才能从DRAM中重新获取

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

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

什么会导致问题:

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

如果MPI分布式进程将尝试从一些公共源读取,无论是文件还是内存,所有高级技巧都可能失去它们的理由,因为非本地主机MPI节点可能会遇到仅本地主机实现模型中没有的问题,类似MEMMAP的技巧自然会退出游戏。

如果性能最重要:

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