MATLAB: 多线程与多核之间的区别
在这段内容中,作者提到了在MATLAB中使用多线程和多核的区别,并解释了为什么有些用户无法获得预期的性能提升。还有一种解决方法,以及一些建议来优化代码的并行性能。
在这段内容中,作者首先提到了他的电脑配置是i5处理器,有2个核心和4个线程。然后,作者分享了如何通过编辑"local"配置文件来解决并行计算过程中的问题。具体步骤如下:
1. 进入"Parallel->Manage Cluster Profiles"。
2. 需要验证"local"配置文件(根据MATLAB版本不同,可能需要进行验证)。
3. 点击"edit"并修改"NumWorkers"变量以适应自己的需求。
然后,作者提到可以使用以下命令来启动"matlabpool":
matlabpool local
作者还指出,他从未在使用"parfor"时获得过性能提升,因为MATLAB的开销总是超过了性能提升的好处。作者建议在使用并行计算之前先对代码进行基准测试,然后再决定是否使用"parfor"或其他并行计算方法。
接下来,作者提到在双核处理器上并没有看到很大的性能提升,但可能需要将更多的任务放在循环内部。而在8核工作站上,每次迭代需要约1分钟的处理任务可以实现线性加速。作者还提到,较新的i7处理器的开销要低得多。
作者提到,如果任务是I/O绑定的,超线程技术可以显著提高性能。也可以使用"matlabpool 4"快速打开一个带有4个工作线程的线程池。
最后,其他用户对这个问题进行了讨论。其中一位用户提到,在他的旧Core2笔记本电脑上,该命令曾经起作用,但在他的机器上,如果想要超过默认的2个线程,就需要修改配置文件来允许使用4个线程。另一位用户提到,他在大多数CPU密集型算法中确实获得了性能提升,但性能提升从未达到2倍。还有一些用户提到了关于超线程和线程池数量的问题,并得到了其他用户的解答。
,这段内容讨论了MATLAB中多线程和多核的区别,提供了解决方法和优化建议,以及其他用户的讨论和反馈。
我的台式电脑配备有一颗i7-2600处理器,操作系统是最新的Linux Mint。我测试了MATLAB 2012b的并行计算功能,默认情况下NumWorker是4(即i7-2600的核心数),我修改了本地集群配置文件,将NumWorker的值设为8,然后进行了4个和8个工作线程的比较(正如我之前发布的帖子)。
结果显示,在串行模式下,耗时约为429秒,而在并行模式下(打开4个matlabpool),耗时约为254秒和218秒,即提升了40.79%和49.18%。
我进一步仔细研究了我的代码,发现在并行体内部也实现了MATLAB的向量化优化,即需要额外的CPU资源来实现这种提升,因此对于NumWorkers为8的情况(即启用超线程),它没有足够的空闲CPU资源来提升向量化,在某种程度上是CPU资源竞争,这降低了并行效率。这也是为什么NumWorkers为4时几乎具有相等的提升效率的原因。
结论是,在MATLAB中进行并行计算非常有帮助且简单易实现,但需要谨慎使用,这是我个人的观点。
在使用MATLAB进行并行配置时,当请求的工作进程数超过默认值时,会出现以下错误信息:
默认情况下,本地集群的NumWorkers
属性值等于本地计算机上的核心数。要在更多的工作进程上运行通信作业,需要增加集群的NumWorkers
属性值。
可以通过修改'local'
配置文件集群属性来解决此问题。从PCT R2013a文档中可以了解到,以下代码可以实现该目的:
myCluster = parcluster('local'); myCluster.NumWorkers = 4; % 'Modified'属性现在为TRUE saveProfile(myCluster); % 'local'配置文件现在已更新, % 'Modified'属性现在为FALSE
然后,matlabpool open
命令将给出默认的工作进程数,而matlabpool(n)
命令将给出n
个工作进程,最多不超过上述设置的最大值/默认值(n<=4
)。可以使用以下命令来检查当前打开的工作进程数:
matlabpool('size')
或者从桌面右下角的指示器图标中查看,例如:。