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