我有一个 i7-M620 处理器,每个内核有 2 个物理内核和 2 个线程(多线程 CPU)(总共 4 个线程)。当我使用 MATLAB Parallel Computing Toolbox 时,我只能打开 2 个池而不是 4 个。这是代码:
matlabpool(2)
parfor i = 1:20
Test(i) = i^2;
end
matlabpool close
- 有人可以解释为什么吗?
- 我在这里做多线程还是多核计算?
- 是否可以同时使用 MATLAB?
我有一个 i7-M620 处理器,每个内核有 2 个物理内核和 2 个线程(多线程 CPU)(总共 4 个线程)。当我使用 MATLAB Parallel Computing Toolbox 时,我只能打开 2 个池而不是 4 个。这是代码:
matlabpool(2)
parfor i = 1:20
Test(i) = i^2;
end
matlabpool close
我通过编辑并行计算的“本地”配置解决了这个问题(我的核心 i5 有 2 个核心和 4 个线程):
Parallel->Manage Cluster Profiles
Validate
在local
更改任何内容之前查看配置文件。edit
并更改NumWorkers
变量以满足您的需要。然后你可以matlabpool
这样开始:
matlabpool local
请注意,我从未使用parfor
. Matlab 的开销总是大于收益。我要说的是:首先对您的代码进行基准测试,然后确定parfor
(或其他并行的东西)是否适合您。
对于并行配置,这是在请求比默认值更多的工作人员时引发的错误:
本地集群的默认值
NumWorkers
是本地机器上的核心数。要在比这更多的工作人员上运行通信作业,请增加集群的 NumWorkers 属性的值。
您可以通过修改'local'
配置文件集群属性来解决这个问题,从而有效地控制默认数量。来自PCT R2013a 文档:
myCluster = parcluster('local');
myCluster.NumWorkers = 4; % 'Modified' property now TRUE
saveProfile(myCluster); % 'local' profile now updated,
% 'Modified' property now FALSE
然后matlabpool open
会给你(默认)数字。工人,而matlabpool(n)
会给你n
工人,直到上面设置的最大值/默认值(n<=4
)。您可以通过以下方式检查当前开放工作人员的数量:
matlabpool('size')
或从桌面右下角的指示器图标,例如。
我的桌面站有一个 i7-2600 CPU,操作系统是最新的Linux Mint。我测试了MATLAB 2012b的并行计算,默认NumWorker为4(i7-2600的核心数),我修改本地集群配置文件为NumWorker值的8,然后和workers设置对比是 4 和 8(就像@rubenvb 发布的那样)。
结果表明,在串行模式下,耗时约为429秒,而在并行模式下(matlabpool open 4) ,8个worker耗时分别为254秒和218秒,分别提升了40.79%和49.18%, 分别。
我进一步仔细研究了我的代码,发现并行体内部也实现了MATLAB矢量化优化,即这种提升需要额外的CPU资源,因此对于8情况下的NumWorkers(即启用超线程),它没有足够的空闲CPU资源来促进向量化,在某种程度上是CPU资源竞争,降低了并行效率。这也是当 NumWorkers 为 4 时几乎具有同等提升效率的原因。
结论是 MATLAB 中的并行计算很有帮助,实现起来很简单,但应该谨慎使用,这都是我个人的看法。