gpt4 book ai didi

c++ - 加速 Matlab 引擎调用

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:38 29 4
gpt4 key购买 nike

我正在使用 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 帧的速度运行,包括设置矩阵(数据),而 C 代码仅以每秒 24 帧的速度运行。我使用 tic/toc 来测量 MATLAB 中的执行时间,而我自己的计时器实现用于 C/C++ 端。

在分析应用程序时,我注意到 MATLAB 引擎调用是瓶颈。我知道 Linux MATLAB 引擎实现使用命名管道与 MATLAB 接口(interface),我想知道是否有办法加快 MATLAB 与其引擎的通信?

最佳答案

首先,这样衡量 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;
}

关于c++ - 加速 Matlab 引擎调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26460652/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com