Matlab池的线程数与核心数

7

我有一台笔记本电脑,运行着 Ubuntu 操作系统,并搭载了 Intel(R) Core(TM) i5-2410M CPU @ 2.30GHz 处理器。 根据 Intel 网站上对于该处理器的介绍(在这里),该处理器有两个物理核心和四个逻辑核心,可以同时运行4个线程。

当我启动 matlabpool 时,它以 local 配置启动,并显示已连接到2个实例。我猜这意味着它可以同时运行2个线程。那么它是否不知道该CPU实际上可以并行运行4个线程?


如果您认为我的回答解决了问题,请点击旁边的勾号。否则,如果您在评论中告诉我缺少什么,我可以尝试改进它。干杯。 - Colin T Bowers
@ColinTBowers:完成了!感谢您的答案,并根据评论中学到的内容进行更新。 - abhinavkulkarni
1个回答

9
根据我的经验,matlabpoollocal 配置默认使用机器拥有的物理核心数而非逻辑核心数。因此,在你的计算机上,matlabpool 只连接两个实验室。
然而,这只是一个设置,可以通过以下命令覆盖该设置:
matlabpool poolsize n

其中n是介于1到12之间的整数,表示您想要Matlab使用的实验室数量。

现在我们进入了我比较擅长回答的有趣部分,这要归功于@RodyOldenhuis在评论中给我的快速课程。

超线程意味着一个物理核心可以同时运行两个线程。当然,它们不能真正同时被处理。这个想法更像是这样的:如果其中一个线程在将任务分配给核心方面效率低下,那么核心可能会表现出一些"停机时间"。第二个线程可以利用这个"停机时间"来完成一些工作。

根据我的经验,Matlab通常有效地分配线程到核心,因此通过一个Matlab线程(即一个实验室)运行,核心可能几乎没有"停机时间",因此超线程几乎没有什么优势。我的桌面电脑是一台带有4个物理核心但8个逻辑核心的core-i7。但是,我注意到在使用4个实验室与8个实验室运行parfor循环时几乎没有什么区别。实际上,由于初始化额外实验室的启动成本,8个实验室通常更慢。

当然,这可能会受到其他外部因素的干扰,例如您可能同时运行的其他程序。

总之,我的猜测是,即使您强制Matlab初始化4个实验室(甚至12个实验室),与2个实验室相比,您不会看到太大的加速,因为Matlab通常相当有效地将任务分配给处理器。


7
你仍然受制于物理核心数的限制。Hyperthreading更像是多线程程序的更高效调度器。性能变化强烈依赖于正在运行的进程类型。对于许多算法,将会有显著的改进(最大约为35%左右),而对于其他许多算法则不会有任何显著变化。无论如何,拥有4个物理核心总是比拥有2个物理核心和2个“虚假”核心要好。 - Rody Oldenhuis
换句话说,如果算法在分配线程到物理核心的方式上特别高效,那么超线程就不会有太多好处。但是,如果算法以某种方式分配线程,使得核心遇到“停机时间”,那么分配给同一核心的第二个线程可以利用这个“停机时间”来完成一些工作。这个解释合理吗?顺便说一句,感谢您的评论 - 如果我的解释正确,我会更新答案。 - Colin T Bowers
据我理解,是的,那是一个很好的解释。当然还有更多内容,但对于这个问题的背景来说,这已经足够了。超线程的优点比缺点多,所以通常最好保持开启状态。但它确实是“穷人版的多核心”,所以不要指望HT能将任何算法的运行时间减半 :) - Rody Oldenhuis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接