我有一个i7-M620处理器,每个核心有2个物理内核和2个线程(多线程CPU)(总共4个线程)。当我使用MATLAB并行计算工具箱时,我只能打开2个池而不是4.这是代码:
matlabpool(2)
parfor i = 1:20
Test(i) = i^2;
end
matlabpool close
答案 0 :(得分:5)
我通过编辑并行计算的“本地”配置来解决这个问题(使用我的核心i5,包含2个内核和4个线程):
Parallel->Manage Cluster Profiles
Validate
local
个人资料。edit
并更改NumWorkers
变量以满足您的需求。然后你可以像这样开始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图标,例如。
答案 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中的并行计算是有用的,只是为了实现,但应该谨慎使用,这是我个人的意见。