加速 Matlab 引擎调用

Posted

技术标签:

【中文标题】加速 Matlab 引擎调用【英文标题】:Speeding up Matlab Engine calls 【发布时间】:2014-10-20 07:41:37 【问题描述】:

我正在使用 MATLAB Engine API 将 MATLAB 与 C/C++ 连接。

在我的特殊情况下,MATLAB 用于计算某些东西,结果以 C 语言打印。但是,在双方的各种测试中,我注意到 C 语言的性能损失很大。

以下是 MATLAB 函数调用的示例:

tic;
data = predictIM(data);
toc;

在C端我调用类似的函数如下:

iMod::Timer_T<high_resolution_clock> t;

engPutVariable(ep, "data", dataContent);
engEvalString(ep, "[posture] = predictIM(data);");

UT_NOTIFY(LV_DEBUG,"The execution took "<<t.seconds());

我在 C++ 中的计时器实现如下所示:

template< class Clock >
class Timer_T

   typename Clock::time_point start;
   public:
      Timer_T() : start( Clock::now() ) 
      typename Clock::duration elapsed() const 
        return Clock::now() - start;
      
      double seconds() const 
        return elapsed().count() *
          ((double)Clock::period::num/Clock::period::den);
      
;

上述 MATLAB 代码以大约 180 帧/秒的速度运行,包括设置矩阵 (data),而 C 代码仅以 24 FPS 运行。我使用tic/toc 来测量 MATLAB 中的执行时间,而我自己的计时器实现用于 C/C++ 端。

在分析应用程序时,我注意到 MATLAB 引擎调用是瓶颈。 我知道 Linux MATLAB 引擎实现使用命名管道与 MATLAB 进行交互,我想知道是否有一种方法可以加快 MATLAB 与其引擎的通信?

【问题讨论】:

那不是 C,那是 C++。 是的。抱歉不清楚。我在 C 中实现了 Matlab 引擎并在 C++ 中计算了时间(我进一步使用了 Matlab 结果) @Dave:我认为你真的无能为力,引擎 API 只是另一个增加开销的层,因为所有数据来回编组......我假设你连接到 MATLAB在开始时一次,并为每个计算重用打开的连接,对吗?反复打开和关闭与 MATLAB 进程的连接可能真的很慢。 @Amro:你说得对,我正在重用 matlab 引擎。打开引擎确实很慢。我还没有实现 Windows COM API。你认为它会比 Linux 引擎实现更快吗? @Dave:老实说我不知道​​。请问您的应用程序在做什么?如果性能真的很关键,也许您可​​以使用MATLAB Coder 将您的 MATLAB 函数转换为独立的 C/C++ 代码,然后您可以将其编译为本机库,完全不依赖于 MATLAB。 【参考方案1】:

首先,这样衡量 MATLAB 引擎是不公平的。您应该只像在 MATLAB 中那样计算计算时间,如下所示:

engPutVariable(ep, "data", dataContent);                // you should not time this

iMod::Timer_T<high_resolution_clock> t;
engEvalString(ep, "[posture] = predictIM(data);");      // time this only for fair
UT_NOTIFY(LV_DEBUG,"The execution took "<<t.seconds()); 

实际上,根据我的经验,运行 MATLAB 并在 C/C++ 中调用其引擎应该具有相似的速度,因为它们实际上取决于 MATLAB 软件本身。

其次,我确实对可能的加速提出了建议。您应该只在整个 C/C++ 项目中打开一个 MATLAB 引擎,而不是为每个调用创建一个。像这样:

int main()

    // Open MATLAB engine for the whole project
    Engine *ep = engOpen(NULL);

    // Use it multiple times
    for (int i=0; i<100; ++i)
        engEvalString(ep, ...);
    

    // Close MATLAB engine
    engClose(ep);

    return 0;

【讨论】:

我包括了将变量推送到 Matlab 工作区的时间,因为它显着减慢了执行时间。在我的特殊情况下,设置一个 3x16 矩阵在使用它时需要 15 毫秒,而计算结果需要 28 毫秒。检索结果需要另外 20 毫秒。因此,测量设置/获取矩阵的时间似乎对整体性能很重要。在我的实现中,我只使用了一次 Matlab 引擎。

以上是关于加速 Matlab 引擎调用的主要内容,如果未能解决你的问题,请参考以下文章

是否可以通过在 matlab 中调用 c/c++ 代码来加速 matlab 绘图?

PHP WEB 引擎缓存加速优化

PHP 缓存加速

如何使用CUDA加速MATLAB计算速度?

在 MATLAB UIMenu 中使用 Enter 作为加速器

matlab加速度积分计算速度和位移