MATLAB:多线程和多核之间的区别

时间:2012-05-05 06:08:43

标签: multithreading matlab

我有一个i7-M620处理器,每个核心有2个物理内核和2个线程(多线程CPU)(总共4个线程)。当我使用MATLAB并行计算工具箱时,我只能打开2个池而不是4.这是代码:

matlabpool(2)
parfor i = 1:20
    Test(i) = i^2;
end
matlabpool close
  • 有人可以解释原因吗?
  • 我在这里做多线程或多核计算吗?
  • 可以用MATLAB做到吗?

3 个答案:

答案 0 :(得分:5)

我通过编辑并行计算的“本地”配置来解决这个问题(使用我的核心i5,包含2个内核和4个线程):

  1. 转到Parallel->Manage Cluster Profiles
  2. 根据您的Matlab版本,在更改任何内容之前,您需要Validate local个人资料。
  3. 点击edit并更改NumWorkers变量以满足您的需求。
  4. 然后你可以像这样开始matlabpool

    matlabpool local
    

    注意我从未使用parfor获得加速。 Matlab的开销总是超过了它的好处。我所说的是:首先对您的代码进行基准测试,然后确定parfor(或其他并行内容)是否适合您。

答案 1 :(得分:4)

对于并行配置,这是请求比默认值更多的工作程序时抛出的错误:

  

本地群集的默认值NumWorkers是数量   本地计算机上的核心。要在更多工作者上运行通信作业,请增加群集的NumWorkers属性值。

您可以通过修改有效控制默认号码的'local'配置文件群集属性来解决此问题。来自PCT R2013a documentation

myCluster = parcluster('local'); 
myCluster.NumWorkers = 4; % 'Modified' property now TRUE 
saveProfile(myCluster);   % 'local' profile now updated,
                          % 'Modified' property now FALSE

然后matlabpool open会给你(默认)num。工作人员matlabpool(n)将为您提供n名工作人员,最高可达上述设定的最高/默认值(n<=4)。您可以通过以下方式检查当前开放工作人员的数量:

matlabpool('size')

或来自桌面右下角的indicator图标,例如enter image description here

答案 2 :(得分:1)

我的桌面工作站有一个i7-2600 CPU,操作系统是最新的 Linux Mint 。我测试了MATLAB 2012b的并行计算,默认情况下NumWorker是4(i7-2600的核心编号),我将本地集群配置文件修改为NumWorker值的8,然后我做了与worker设置的比较是4和8(正如@rubenvb发布的那样)。

结果显示,在串行模式下,耗时约为 429 秒,而在并行模式下(使用matlabpool打开4)耗时约为 254 sec和 218 秒,分别由 40.79% 49.18%提升。

我进一步仔细研究了我的代码,发现在并行体内部,还实现了MATLAB矢量化优化,即这种类型的增强需要额外的CPU资源,因此对于8个案例的NumWorkers(即超线程)它没有足够的空闲CPU资源来提升矢量化,在某种程度上它是CPU资源竞争,这降低了并行效率。这也是当4号NumWorkers几乎具有相同提升效率的原因。

结论是MATLAB中的并行计算是有用的,只是为了实现,但应该谨慎使用,这是我个人的意见。