我有一个包含parfor循环的主循环。
我想确保我从使用parfor中受益。
以下从概念上解释了我在做什么:
% parameters
iterate = [1e0 1e2 1e3 1e4 1e5];
% main loop
for k=1:5
% parfor
parfor j=1:iterate(k)
*calculations*
m(j)= *calculations*
end
%using the result of parfor in the main loop
vector(k)= m/iterate(k);
end
我假设matlab将使用一些工作人员分别填充数组doing_smth
,这将导致比平时更快地填充该数组。
然后,该数组将用于处理主循环中的某些内容。
这种安排能否更快地产生结果?
答案 0 :(得分:1)
我可能会让你的外部循环成为parfor
,这样每个工人的工作时间都相对较长,而且你会花更少的时间等待其他工人完成。
将它放在里面你必须等待所有工人每次完成循环。
for main = 1:N
doing_smth = zeros(N1,1);
parfor pal = 1:2N
%// This task may not be very long-running
doing_smth(pal) = whatever;
end
%// Have to wait for all runners to complete before we can continue
%// Obviously we have to do this waiting N times (each time through the loop)
act(main)= doing_smth/2
end
如果将其移动到外部循环,发送给工作人员的作业将花费更长的时间来执行(由于与工作人员的来回流量较低而效率更高)并且您不等待所有工作人员完成< em>在循环中。
parfor main = 1:N
doing_smth = zeros(N1, 1);
for pal = 1:2N
doing_smth(pal) = whatever;
end
%// No waiting anymore!
act(main) = doing_smth / 2;
end
%// Now wait here for all workers to finish
<强>更新强>
根据您提供给代码的更新,我实际上认为最好在内部循环上使用parfor
,假设该循环内部的计算需要足够长的时间。这样可以更好地利用工人,因为如果你的外循环是parfor
,因为你只有4个工人和5个外循环迭代,那么它将比你有5个工人要长2倍,因为4工人将完成4次迭代,然后3名工人将闲置,而1名工人完成第五次迭代。在内部使用parfor
,您将充分利用所有工作人员。你做想要确保内部循环的内部需要相当长的时间来减少通信开销。否则,您需要手动将数据刻录到块中,然后在parfor
内处理这些数据。