gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:32:42 25 4
gpt4 key购买 nike

我使用 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/

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