我想为每个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
这可以获得多少效率,改变后的代码会做正确的事情吗? 更改后的代码是否符合我的要求?
答案 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_index
和loop2_index
是范围,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
答案 3 :(得分:0)
您不能使用嵌套parfor,从您的问题看来,您正在处理矩阵(使用参数i,j), 尝试使用 blockproc ,请在blockproc
后查看此链接