首先,进行一些快速测试以确认我们的理解:
> matlab.exe -singleCompThread
>> warning('off', 'MATLAB:maxNumCompThreads:Deprecated')
>> maxNumCompThreads
ans =
1
>> maxNumCompThreads(2)
Error using feature
MATLAB has computational multithreading disabled.
To enable multithreading please restart MATLAB without singleCompThread option.
Error in maxNumCompThreadsHelper (line 37)
Error in maxNumCompThreads (line 27)
lastn = maxNumCompThreadsHelper(varargin{:});
如上所述,当使用-singleCompThread选项启动MATLAB时,我们无法使用maxNumCompThreads覆盖它。
> matlab.exe
>> parpool(2); % local pool
>> spmd, n = maxNumCompThreads, end
Lab 1:
n =
1
Lab 2:
n =
1
我们可以看到每个worker默认限制为一个计算线程。这是一件好事,因为我们希望避免过度订阅和不必要的上下文切换,这种情况发生在尝试运行的线程数超过可用物理/逻辑核心数时。因此从理论上讲,最大化CPU利用率的最佳方法是启动尽可能多的单线程工作,就像我们拥有核心一样。
不是通过查看在后台运行的本地工作进程,我们看到每个进程都是以:启动
matlab.exe -dmlworker -noFigureWindows [...]
我相信未记录的-dmlworker选项与-singleCompThread类似,但可能有点不同。首先,我能够使用maxNumCompThreads(2)覆盖它,而不会像以前那样抛出错误。
请记住,即使MATLAB会话在单线程计算模式下运行,也不意味着计算线程仅限于一个CPU内核(线程可以在OS调度程序分配的内核之间跳转) )。如果要控制它,您必须设置工作进程的亲和力..
所以我使用英特尔VTune放大器进行了一些分析。基本上我运行了一些线性代数代码,并通过附加到MATLAB过程并在mkl.dll模块上进行过滤来执行热点分析(这是MATLAB用作优化BLAS / LAPACK实现的英特尔MKL库)。以下是我的结果:
- 串行模式
我使用了以下代码:eig(rand(500));
正常启动MATLAB,计算产生4个线程(这是我选择的默认自动值,因为我有一个四核i7 Intel CPU)。
正常启动MATLAB,但在计算之前调用maxNumCompThreads(1)。正如预期的那样,计算只使用了1个线程。
使用-singleCompThread选项启动MATLAB,再次只使用1个线程。
- 并行模式(parpool)
我使用了以下代码:parpool(2); spmd, eig(rand(500)); end。在下面的两种情况下,MATLAB正常启动
在使用默认设置的worker上运行代码时,每个worker仅限于一个计算线程
当我使用maxNumCompThreads(2)覆盖worker上的设置时,每个worker将使用2个线程
以下是VTune报告的屏幕截图:
希望能回答你的问题:)