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 循环)