如何实现MATLAB和单独的C++应用程序之间的通信
How to implement a communication between MATLAB and a separate C++ application?
我读到我可以使用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便宜数千倍,但能够在广泛分布的非本地主机计算集群上提供服务。
- 如何在C++中从两个单独的for循环中添加两个数组
- 用C++在单独的头文件中完成函数体
- 类模板的成员功能的定义在单独的TU中完全专业化
- 如何使用单独文件中的派生类访问友元函数对象
- CoInitialize()在单独的线程上崩溃而不返回
- avrogencpp能为模式中的每种类型生成单独的头文件吗
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- 单独定义模板化嵌套类方法的正确语法
- 如何将 2 个类分成单独的 .h 文件并正确设置它们
- C++ 链接到单独的.cpp文件说"multiple definitions"
- 从单独的文件中读取树
- 将字符串拆分为标记,并将标记拆分为两个单独的数组
- C++计算器,不能单独除以 0
- 自 Windows 10 20H1 以来,具有单独线程的多个窗口停止工作
- 当结构位于单独的头文件中时'unregistered datatype'在 QML 中出现Q_GADGET错误
- 通过单独的 tcp 流建立 http 连接
- Cmake:为 C 设置警告级别,并为 MSVC 单独设置C++代码(Visual C++)
- 如何将字符串和整数读取到两个单独的动态数组中的程序编写?
- 如何从单独的线程控制 SFML 窗口?
- C++泛型类,单独实现?