高效使用 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
.
中处理这些数据
我有一个包含 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
.