c++ - 当 C++ mex 文件完成并将数据传回 MATLAB 时是否有开销?

标签 c++ mex

我使用 C++ 编写了一个 mex 文件来提高 MATLAB 中慢速“for 循环”的速度。我写了两个版本,一个没有 openMP,一个有。取得的成果非常好,但是在测试时序时我注意到,由于多线程,出现了意想不到的结果:mex 文件传回 MATLAB 时出现时间滞后。

我通过 MATLAB 中的主文件运行程序,它调用两个版本的 mex 文件并使用 tic-toc 对它们计时;它还会自己计算循环。每个 mex 文件完成后,时间将显示在 MATLAB 命令窗口中,作为下一个计算的进行。此外,当多线程 mex 文件启动时,从观察 CPU 使用情况可以明显看出,因为两个 CPU 都达到 100%。代码格式为

Initial data generation for inputs....;  
tic;  
[Output] = mex_unthreaded(inputs...);  
Time_unthreaded = toc  
tic;  
[Output_threaded] = mex_threaded(inputs...);  
Time_threaded = toc  
tic;  
MATLAB loops...;  
Time_MATALB = toc

从非 openMP mex 文件中,C++ 返回到 MATLAB 时并不明显,因为 CPU 使用率没有明确的变化。但是,当 openMP mex 文件运行时,C++ 代码返回到 MATLAB 时有一个明显的终点:CPU 使用率下降。这意味着我可以粗略地通过观察 CPU 使用情况来计算 C++ 时间。从 CPU 使用率下降到 MATLAB 计时出现的时间似乎有大约 20% 的滞后。例如,通过观察 CPU 使用情况,我发现 CPU 处于 100% 时大约需要 300 秒,然后是额外的大约 75 秒,直到 MATLAB 从 tic-toc 计时记录到大约 377 秒。

我只能认为这是将数据传回 MATLAB 的某种开销,因为随着输出的数据变大,滞后时间也会增加。我对这个结果不满意的原因是我认为数据是在 C++ 中通过指向 MATLAB mxArrays 的指针在 MATLAB 内存中处理的。因此,不应回传任何信息。

我想到的第二种可能性是,一旦 mex 文件结束,MATLAB 可能会对数据进行某种形式的分析,例如最大最小值等

如果有人能对此事有所了解,我们将不胜感激。

非常感谢

最佳答案

我能够在我的系统上调用一个 mex 函数(它也使用 OpenMP),根据 tic/toc,这意味着 MatLab 在我的案例中所做的任何后处理都非常少。

您要返回什么类型的数据(实矩阵或复矩阵、元胞数组、结构数组或其他)以及多少数据?

请记住,OpenMP 可能无法并行化您的所有代码,最后通常需要一个缩减步骤,或者计算的拆分可能不均匀,因此一个 CPU 需要更长的时间,或者您可能在没有 OpenMP 的情况下进行大量处理编译指示。但我认为返回 MatLab 不会导致您看到的延迟。

关于c++ - 当 C++ mex 文件完成并将数据传回 MATLAB 时是否有开销?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7462595/

相关文章:

c++ - 无法将 Const Char[21] 转换为 Char?

C++14 operator << 用于流插入和枚举类

c++ - 使用返回结构的第三方 mexFunction 运行 fmincon 时出现问题

c - Matlab:调试C库,可能吗?

C++ 11 实现接口(interface)的方法不可用。为什么?

c++ - move 语义和复制构造函数

c - 编译时 mex mxGetDoubles() 函数的问题

c# - 多个绑定(bind)的 WCF Mex 端点

c++ - fstream 产生非常奇怪的行为

matlab - 使用 OpenCV 官方 Matlab 绑定(bind) cv.calcHist