0

我面临一个巨大的问题。我使用 Matlab 引擎(engOpen() 等...)调用了嵌入的 Matlab 函数,构建了一个复杂的 C 应用程序。会发生以下情况:

  • 我在一台机器上生成了这个应用程序的多个实例,每个核心一个
  • 然而!...然后应用程序减速到停止。事实上,在我的 16 核机器上,应用程序的速度大约降低了 16 倍。
  • 现在我意识到这是因为每台机器只启动了一个单一的 matlab 引擎,并且我所有的 16 个实例共享同一个 matlab 副本!
  • 我试图用 matlab GUI 复制它,它也有同样的问题。我在 GUI 中运行一个程序需要 14 秒,然后我同时在两个 GUI 中运行它,需要 28 秒

这对我来说是一个大问题,因为如果我必须在没有 matlab 的情况下重新编写整个 c 应用程序,我将错过最后期限。我知道 matlab 有用于并行编程的命令,但我的 matlab 调用嵌入在 C 应用程序中,我想运行 C 应用程序的多个实例。同样,我不能重构我的整个 c 应用程序,因为我会错过最后期限。

任何人都可以让我知道是否有解决方案(例如,在同一台机器上真正启动多个 matlab 进程)。我愿意为额外的许可证付费。我目前在所有机器上都安装了完全 lincensed matlab。

非常感谢你!

编辑

感谢本·沃伊特的帮助。我发现一个 Matlab 实例已经在使用多个内核。事实上,运行一个实例显示我充分利用了 4 个内核。如果我运行两个 Matlab 副本,我可以充分利用 8 个内核。因此它实际上是并行运行的。但是,即使 2 个实例似乎占用了两倍的处理能力,我仍然会减速 2*。因此,2 个实例似乎获得了两倍的结果,总计算能力为 4*。为什么会这样?

4

2 回答 2

1

您的减速不是由于将所有 N 个实例填充到单个内核上的单个 MatLab 实例中,而是由于每个实例不再有 16 个内核可供使用。即使没有明确的并行结构,许多 MATLAB 向量运算也使用并行计算,因此每个实例需要多个内核才能获得最佳效率。

于 2014-02-16T18:39:29.130 回答
0

MATLAB 库不是线程安全的。如果您创建多线程应用程序,请确保只有一个线程访问引擎应用程序。

我认为matlab引擎是错误的技术。对于 Windows 平台,您可以尝试使用 com 自动化服务器,它具有.Single为您打开的每个 com 客户端启动一个 matlab 实例的选项。

替代方案是:

  • 为函数生成 C++ 代码。
  • 创建一个 .NET 库。(NE 建设者)
  • 通过命令行运行matlab。
于 2014-02-16T17:55:29.393 回答