我在Linux群集中的节点上运行Matlab R2014a,该群集具有20个内核并启用了超线程。我知道这已经讨论过了,但我正在寻找一些澄清。以下是我对Matlab中线程与核心问题的理解:
但是,我还读过使用(不推荐使用的)函数maxNumCompThreads(),您可以减少或增加Matlab或其中一个工作人员将生成的线程数。这在以下几种情况下非常有用:
编辑:更明确地阐述我的问题:
注意:我之前在Matlab的答案中发布了这个,但没有收到任何反馈。
Edit2:看起来(1)中的问题是我使用的测试代码的问题。
答案 0 :(得分:1)
这是一个相当长的问题,但我认为直截了当的答案是肯定的,正如我所理解的那样,MATLAB工作者以-singleCompThread
开始。
答案 1 :(得分:1)
首先,进行一些快速测试以确认我们的理解:
>> 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
覆盖它。
>> 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));
maxNumCompThreads(1)
。正如预期的那样,计算只使用了1个线程。-singleCompThread
选项启动MATLAB,再次只使用1个线程。parpool
)我使用了以下代码:parpool(2); spmd, eig(rand(500)); end
。在下面的两种情况下,MATLAB正常启动
maxNumCompThreads(2)
覆盖worker上的设置时,每个worker将使用2个线程以下是VTune报告的屏幕截图:
希望能回答你的问题:)
答案 2 :(得分:1)
我错误地认为maxNumCompThreads
没有为parpool工作者工作。看起来问题是我正在使用的代码:
parfor j = 1:2
tic
maxNumCompThreads(2);
workersCompThreads(j) = maxNumCompThreads;
i = 1;
while toc < 200
a = randn(10^i)*randn(10^i);
i = i + 1;
end
end
在检查CPU利用率时,使用了大量内存,瓶颈是I / O,额外的线程已经关闭。当我做以下事情时:
parfor j = 1:2
tic
maxNumCompThreads(2);
workersCompThreads(j) = maxNumCompThreads;
i = 4;
while toc < 200
a = randn(10^i)*randn(10^i);
end
end
额外的线程开始并继续运行。
至于第二个问题,我从Mathworks得到一个确认,即父级Matlab进程不会启动比物理核心数更多的线程,即使你明确提高了超出限制的数量。所以在documentation中,句子是:
&#34;目前,最大计算线程数等于计算机上的计算核心数。&#34;
应该说:
&#34;目前,计算线程的最大数量等于计算机上物理核心的数量。&#34;