有效地使用parfor

时间:2016-05-18 15:41:34

标签: matlab parfor

我有一个包含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,这将导致比平时更快地填充该数组。 然后,该数组将用于处理主循环中的某些内容。

这种安排能否更快地产生结果?

1 个答案:

答案 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内处理这些数据。