matlab maxnumcompthreads,Matlab:-maxNumCompThreads,超线程和parpool

首先,进行一些快速测试以确认我们的理解:

> 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报告的屏幕截图:

ef1d373e5a62413777fe0f14bd71da31.png

希望能回答你的问题:)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值