【问题标题】:Why is the Matlab parfor scheduler leaving workers idle?为什么 Matlab parfor 调度程序让工作人员闲置?
【发布时间】:2017-06-02 02:22:29
【问题描述】:

我有一个运行时间相当长的 parfor 循环(比如说 100,000 次迭代,每次迭代大约需要一分钟),我正在运行 36 个内核。我注意到在工作接近尾声时,大量内核处于空闲状态,而少数内核完成了我认为每个工作人员必须进行多次迭代的工作。这会导致浪费大量计算时间来等待一名工作人员完成几项工作,而其他工作人员则处于空闲状态。

以下脚本显示了该问题(使用文件交换实用程序Par.m):

% Set up parallel pool
nLoop = 480;
p1 = gcp;

% Run a loop 
pclock = Par(nLoop);
parfor iLoop = 1:nLoop
  Par.tic;
  pause(0.1);
  pclock(iLoop) = Par.toc;  
end
stop(pclock);
plot(pclock);

% Process the timing info: 
runs = [[pclock.Worker]' [pclock.ItStart]' [pclock.ItStop]'];
nRuns = arrayfun(@(x) sum(runs(:,1) == x), 1:max(runs));
starts = nan(max(nRuns), p1.NumWorkers);
ends = nan(max(nRuns), p1.NumWorkers);
for iS = 1:p1.NumWorkers
  starts(1:nRuns(iS), iS) = sort(runs(runs(:, 1) == iS, 2));
  ends(1:nRuns(iS), iS) = sort(runs(runs(:, 1) == iS, 3));
end

firstWorkerStops = min(max(ends));
badRuns = starts > firstWorkerStops;
nBadRuns = sum(sum(badRuns)) - (p1.NumWorkers-1);

fprintf('At least %d (%3.1f%%) iterations run inefficiently.\n', ...
  nBadRuns, nBadRuns/nLoop * 100);

在我看来,每个工作人员都应该一直忙到队列为空,之后所有工作人员都处于空闲状态。但在这里看起来这并没有发生 - 在 480 次迭代中,在另一个工作人员闲置了一个完整的周期之后,我在工作人员上开始了 6 到 20 次迭代。这个数字似乎与循环迭代次数呈线性关系,接近总数的 2%。通过有限的测试,这似乎在 Matlab 2016b 和 2014b 中是一致的。

是否有任何理由认为这是预期的行为,或者这只是 parfor 实现中编写不佳的调度程序?如果是这样,我该如何构建它,这样我就不会和闲置的工人坐在一起这么久?

【问题讨论】:

    标签: matlab parallel-processing parfor


    【解决方案1】:

    我认为这可以解释您所观察到的情况。

    如果迭代次数多于worker,则一些worker执行不止一次循环迭代;在这种情况下,worker 可能会一次接收多个迭代以减少通信时间。 (来自“When to Use parfor”)

    在循环结束时,两个工作人员可能会同时完成他们的迭代。如果只剩下一组迭代要分配,那么一个工作人员将获得所有迭代,而另一个工作人员将保持空闲状态。这听起来像是预期的行为,这可能是因为底层实现试图降低与工作池相关的通信成本。我浏览了网络和 Matlab 设置,似乎没有办法调整沟通策略。

    【讨论】:

      【解决方案2】:

      parfor 调度程序尝试对迭代不花费统一时间量的循环进行负载平衡。不幸的是,正如您所观察到的,这可能导致工作人员在循环结束时变得空闲。使用parfor,你无法控制分工;但是您可以使用parfeval 将您的工作分成均匀的块——这可能会给您更好的利用。或者,您甚至可以将spmdfor-drange 循环结合使用。

      【讨论】:

      • 您将如何使用spmd 进行显式调度?我想我写了一个例子,但它似乎遇到了和parfor一样的问题。
      • for-drange 构造只是将循环迭代分成大小相等的块,这就是我的意思。如果每次迭代花费相同的时间,这很好。
      猜你喜欢
      • 2016-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-01
      • 2019-04-22
      • 1970-01-01
      相关资源
      最近更新 更多