我想为每个 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
这能提高多少效率,更改后的代码会做正确的事吗?更改后的代码对我的要求有效吗?
我想为每个 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
这能提高多少效率,更改后的代码会做正确的事吗?更改后的代码对我的要求有效吗?
在 MATLAB 中,parfor
不能嵌套。这意味着,在您的代码中,您应该用 a 替换一个parfor
(for
最有可能是外循环)。更一般地说,我建议您查看有关 parfor 的本教程。
parfor
不能嵌套。在嵌套parfor
语句中,只有最外层的调用parfor
是并行化的,这意味着内部调用parfor
只会增加不必要的开销。
为了获得高效率parfor
,迭代次数应远高于工作人员的数量(或精确倍数,以防每次迭代花费相同的时间),并且您希望单次迭代花费的时间超过几毫秒以避免感受并行化带来的开销。
parfor i=rangei
<block1>
for j=rangej
<block2> dependent on <block1>
end
end
实际上可能符合该描述,具体取决于rangei
. 或者,您可能想尝试将嵌套循环展开为单个循环,在其中迭代线性索引。
以下代码使用单个parfor
循环隐式管理两个嵌套循环。loop1_index
andloop2_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
您不能使用嵌套 parfor,从您的问题看来,您正在处理矩阵(带有参数 i,j),尝试使用blockproc,通过此链接一次blockproc