我无法在下面的简短脚本中找出问题,该脚本应该将单个CPU计算与有关计算时间的并行化进行比较。
链接到完整图像:LINK
代码是:
n = 700;
ranksSingle = zeros(1,n);
tic
for ind = 1:n
ranksSingle(ind) = rank(magic(ind));
end
toc
matlabpool local 4
tic
ranks = zeros(1,n);
parfor (ind = 1:n)
ranks(ind) = rank(magic(ind));
end
toc
isequal(ranksSingle, ranks)
matlabpool close
我也尝试过matlabpool 2
。从流程窗口可以清楚地看到,运行并行计算时所有内核都忙于100%(标记为红色)。
当运行单CPU计算(标记为蓝色)时,4个核心比以前更繁忙。我本以为只有一个核心可以上升。我搜索了互联网,看看magic()
或rank
函数是否内置并行化,但正如你可以从这里读到的那样:http://www.walkingrandomly.com/?p=1894情况并非如此。所以这4个核心并不是很忙,但我仍然想知道为什么所有核心都会上升。
其次,我真的很想知道并行化版本的计算时间。我知道通过将作业分配到单个核心会产生某种开销,但这不应该太高,以至于最终没有任何好处:(
也许任何人都可以告诉我一些事情:(我真的坚持这个,因为我想加速我的一些for循环。第二个问题是,如果有任何命令总是将工人大小设置为数字我的计算机中有哪些物理核心?(如果这是额外的好处,还使用超线程?)
非常感谢!
答案 0 :(得分:5)
当你想要运行一个并行作业时,你应该记住,有太多的快速迭代是很糟糕的,而且迭代速度太慢是不好的。如果你进行一百万次迭代,每次迭代需要几毫秒,并行化的开销将破坏任何可能的增益。如果你进行九次迭代,每次花费一个小时,并且你在8个并行处理器上运行,七个处理器将空闲一小时等待迭代#9完成。
因此,您的示例对于测试并行化的影响非常糟糕,因为magic
和rank
都太快了。
function testParfor2
tic
for i=1:4
pause(1); %# wait for 1 second
end
toc
matlabpool open 4
tic
parfor i=1:4
pause(1); %# wait for 1 second
end
toc
Elapsed time is 4.050287 seconds.
Elapsed time is 1.534534 seconds.
请注意,我同时运行了第二个并行作业,但粗略地说,结果应该是可重现的:有一些开销(请注意,我没有计算matlabpool
使用的时间! ),但加速是有的。如果增加暂停长度,您应该看到相同的开销。此外,您应该测试您的实际循环(尝试并行化最外层循环,顺便说一句)。
关于你的第二个问题:
matlabpool open
将创建与物理核心一样多的工作人员。超线程将帮助您确保计算机在并行作业运行时保持响应。
最后,虽然magic
和rank
可能不是完全多线程的,但它们可能会调用多线程例程。