在同一台机器上生成多个matlab副本

时间:2014-02-16 17:31:47

标签: matlab parallel-processing matlab-engine

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

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

对我来说这是一个很大的问题,因为如果我不用matlab重新编程我的整个c应用程序,我将错过我的截止日期。我知道matlab有并行编程的命令,但我的matlab调用嵌入在C应用程序中,我想运行C应用程序的多个实例。同样,我无法重构我的整个c应用程序,因为我会错过截止日期。

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

非常感谢你!

修改

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

  

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

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

替代方案是:

  • 为函数生成C ++代码。
  • 创建一个.NET库。 (NE Builder)
  • 通过命令行运行matlab。