4

我想为每个 block1 并行化 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

4 回答 4

5

在 MATLAB 中,parfor不能嵌套。这意味着,在您的代码中,您应该用 a 替换一个parforfor最有可能是外循环)。更一般地说,我建议您查看有关 parfor 的本教程

于 2013-10-05T03:31:13.017 回答
4

parfor不能嵌套。在嵌套parfor语句中,只有最外层的调用parfor是并行化的,这意味着内部调用parfor只会增加不必要的开销。

为了获得高效率parfor,迭代次数应远高于工作人员的数量(或精确倍数,以防每次迭代花费相同的时间),并且您希望单次迭代花费的时间超过几毫秒以避免感受并行化带来的开销。

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

实际上可能符合该描述,具体取决于rangei. 或者,您可能想尝试将嵌套循环展开为单个循环,在其中迭代线性索引。

于 2013-10-05T07:15:14.710 回答
1

以下代码使用单个parfor循环隐式管理两个嵌套循环。loop1_indexandloop2_index是范围,and是loop1_counter实际loop2_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
于 2014-06-26T16:34:36.833 回答
0

您不能使用嵌套 parfor,从您的问题看来,您正在处理矩阵(带有参数 i,j),尝试使用blockproc,通过此链接一次blockproc

于 2013-10-05T06:00:19.247 回答