MATLAB中的并行化问题

tim*_*tim 4 parallel-processing matlab

我无法在下面的简短脚本中找出问题,该脚本应该将单个CPU计算与有关计算时间的并行化进行比较.

PARFOR 链接到完整图像: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循环.第二个问题是,如果有任何命令总是将工人大小设置为物理核心数我有我的电脑吗?(如果还有额外的好处,还可以使用超线程?)

非常感谢!

Jon*_*nas 5

当你想要运行一个并行作业时,你应该记住,有太多的快速迭代是不好的,而且迭代速度太慢也是不好的.如果你进行一百万次迭代,每次迭代需要几毫秒,并行化的开销将破坏任何可能的增益.如果你进行九次迭代,每次花费一个小时,并且你在8个并行处理器上运行,七个处理器将空闲一小时等待迭代#9完成.

因此,你的例子是用于测试并行化的影响非常糟糕,因为这两个magicrank是太快了.

    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可能不是完全多线程的,但它们可能会调用多线程例程.

  • 正确.例如,`rank`使用`svd`,这是多线程的. (2认同)