高效使用 parfor

Using parfor efficiently

我有一个包含 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 将使用多个 worker 分别填充数组 doing_smth,这将导致比平时更快地填充该数组。 然后该数组将用于对主循环中的某些内容进行操作。

这样安排会不会更快出结果?

我可能会让你的外循环成为 parfor 这样每个工人都有一个相对较长的工作到 运行 而且你会花更少的时间等待其他工人完成。

将它放在内部,每次循环都必须等待所有 worker 完成。

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 ,您将充分利用所有工人。您 do 想要确保内部循环的内部花费相当多的时间来减少通信开销。否则,您将需要手动将数据分割成块并在 parfor.

中处理这些数据