Matlab在使用codegen和parfor时啥时候选择线程

Posted

技术标签:

【中文标题】Matlab在使用codegen和parfor时啥时候选择线程【英文标题】:When does Matlab choose to thread when using codegen and parforMatlab在使用codegen和parfor时什么时候选择线程 【发布时间】:2013-09-10 23:11:53 【问题描述】:

我似乎是少数使用 Matlab 编码器(codegen 命令)来获得加速的人之一,从网上讨论或帮助如此之少的事实来看。在某些情况下,我从中获得了令人难以置信的加速。我从未见过它记录在案,但是当我使用带有 parfor 循环的 Matlab 脚本中的 codegen 制作 MEX 文件时,它通常会将生成的 MEX 线程化。函数中的 Parfor 会产生多个进程,这通常比线程效率低(我通过在 linux 中观察 top 并在 Matlab 函数中看到多个 100% 进程来推断所有这些,但在运行转换后的 MEX 时只有一个,例如 1000% 进程)。我现在正在研究一个我可以真正使用加速的案例,但我没有看到 MEX 中使用了多个线程的证据,即使 parfor 在基本函数中工作。任何人都知道挂断可能是什么,或者编码人员如何选择何时线程?

【问题讨论】:

MALTAB 中的 parfor 在后台工作进程上运行。 MATLAB Coder 将使用 OpenMP 将parfor-loops 转换为多线程 C/C++ 代码(在生成的代码中搜索#pragma omp):mathworks.com/help/coder/ref/parfor.html、mathworks.com/help/coder/ug/… 您可以使用NumThreads 输入到parfor 指定最大线程数。但是,据我所知,没有记录如何选择达到该最大值的线程数。也许@Edric 会知道,如果他在听? @SamRoberts:您可以使用环境变量来控制最大线程数。在运行编译的 MEX 函数之前尝试设置 setenv('OMP_NUM_THREADS','8')。请注意,这可能会影响其他也是多线程的内置函数(我认为提供 BLAS/LAPACK/FFT 例程的英特尔 MKL 会受到影响) 【参考方案1】:

它只会线程化 parfor 循环本身,编码器猜测会很危险,并且无法计算出合适的并行度。

如果我是你,我会尽量用 parfor 代替 Matlab 代码中的任何地方。

现在如何确定一个循环是否可以并行化:

    它是否使用了之前计算的任何结果,如果是,那么不要尝试,认真的,只会让情况变得更糟

    它是否以任何形式使用 IO,如果是,则不要,它会减慢它的速度并从代码中删除任何确定性

    是否有一个循环供 parfor 替换?如果没有,那么您将不得不处理性能问题,因为可能没有需要并行化。

【讨论】:

以上是关于Matlab在使用codegen和parfor时啥时候选择线程的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 parfor (MATLAB) 上在工作人员之间发送和接收数据吗?

如何让两个嵌套的 Parfors 在 Matlab 中迭代两个巨大的数组?

具有并行工具箱的 Matlab 独立应用程序(已部署应用程序中的 parfor 循环)

高性能Matlab的并行计算之parfor

MATLAB教程案例92基于parfor的matlab并行运行机制

Matlab如何在解微分方程并将数值代入时使用parfor