我有一个主循环,其中包含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,这将导致比通常更快地填充该数组。然后,该数组将用于对主循环中的某个内容进行操作。
这样的安排会否更快产生效果呢?
发布于 2016-05-18 15:45:59
我可能会让您的外部循环成为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如果将其移动到外部循环,则发送给工作人员的作业执行时间将更长(由于与工作人员之间的来回通信量减少,效率更高),并且不会等待所有工作人员在循环中完成任务。
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中处理这些块。
https://stackoverflow.com/questions/37304321
复制相似问题