tim*_*tim 4 parallel-processing matlab
我无法在下面的简短脚本中找出问题,该脚本应该将单个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
Run Code Online (Sandbox Code Playgroud)
我也试过了matlabpool 2.从流程窗口中可以清楚地看到,运行并行计算时所有内核都忙于100%(标记为红色).
当运行单CPU计算(标记为蓝色)时,4个核心比以前更繁忙.我本以为只有一个核心可以上升.我搜索了互联网,看看,或许这个magic()或rank功能是内置并行化的,但你可以从这里读到:http://www.walkingrandomly.com/?p = 1894但事实并非如此.所以这4个核心并不是很忙,但我仍然想知道为什么所有核心都会上升.
其次,我真的很想知道并行化版本的计算时间.我知道通过将作业分配到单个核心会产生某种开销,但这不应该太高以至于最终没有任何好处:(
也许任何人都可以告诉我一些事情:(我真的很困惑,因为我想加速我的一些for循环.第二个问题是,如果有任何命令总是将工人大小设置为物理核心数我有我的电脑吗?(如果还有额外的好处,还可以使用超线程?)
非常感谢!
当你想要运行一个并行作业时,你应该记住,有太多的快速迭代是不好的,而且迭代速度太慢也是不好的.如果你进行一百万次迭代,每次迭代需要几毫秒,并行化的开销将破坏任何可能的增益.如果你进行九次迭代,每次花费一个小时,并且你在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.
Run Code Online (Sandbox Code Playgroud)
请注意,我同时运行了第二个并行作业,但粗略地说,结果应该是可重现的:有一些开销(注意我没有计算使用的时间matlabpool!),但加速是那里.如果增加暂停长度,您应该看到相同的开销.此外,您应该测试您的实际循环(尝试并行化最外层循环,顺便说一句).
对于你的第二个问题:
matlabpool open
Run Code Online (Sandbox Code Playgroud)
将创建与物理核心一样多的工作人员.超线程将帮助您确保计算机在并行作业运行时保持响应.
最后,虽然magic并且rank可能不是完全多线程的,但它们可能会调用多线程例程.
| 归档时间: |
|
| 查看次数: |
1341 次 |
| 最近记录: |