在matlab中使用parfor进行嵌套循环

时间:2013-10-05 03:07:10

标签: matlab

我想为每个block1和parallerlize外循环并行化block2。

上一个代码:

    for i=rangei
        <block1>
        for j=rangej
            <block2> dependent on <block1>
        end
    end

更改了代码:

    parfor i=rangei
        <block1>
        parfor j=rangej
            <block2> dependent on <block1>
        end
    end

这可以获得多少效率,改变后的代码会做正确的事情吗? 更改后的代码是否符合我的要求?

4 个答案:

答案 0 :(得分:5)

在MATLAB中,parfor不能嵌套。这意味着,在您的代码中,您应该用parfor替换一个for(外部循环最有可能)。更一般地说,我建议你看看tutorial on parfor

答案 1 :(得分:4)

parfor无法嵌套。在嵌套的parfor语句中,只对parfor的最外层调用进行了并列化,这意味着对parfor的内部调用只会增加不必要的开销。

为了使parfor获得高效率,迭代次数应远远高于工作者数量(或者每次迭代需要相同时间时的精确倍数),并且您希望进行单次迭代超过几毫秒,以避免感受到并列化的开销。

parfor i=rangei
    <block1>
    for j=rangej
        <block2> dependent on <block1>
    end
end

实际上可能符合该描述,具体取决于rangei的大小。或者,您可能希望尝试将嵌套循环展开到单个循环中,在此循环中迭代线性索引。

答案 2 :(得分:1)

以下代码使用单个parfor循环来隐式管理两个嵌套循环。 loop1_indexloop2_index是范围,loop1_counterloop2_counter是实际的循环迭代器。此外,迭代器按相反的顺序排列,以便有更好的负载平衡,因为通常较高范围值的负载大于较小值的负载。

loop1_index = [1:5]
loop2_index = [1:4]

parfor temp_label_parfor = 1 : numel(loop1_index) * numel(loop2_index)
    [loop1_counter, loop2_counter] = ind2sub([numel(loop1_index), numel(loop2_index)], temp_label_parfor)
    loop1_counter = numel(loop1_index) - loop1_counter + 1;
    loop2_counter = numel(loop2_index) - loop2_counter + 1;
end

答案 3 :(得分:0)

您不能使用嵌套parfor,从您的问题看来,您正在处理矩阵(使用参数i,j), 尝试使用 blockproc ,请在blockproc

后查看此链接