11

TParallel.For()有一个名为AStride. 在我的例子中,ASTride 是 2:

  TParallel.&For(2, 1, 10,
    procedure(index: Integer)
    begin
      TThread.Queue(nil,
        procedure
        begin
          memo1.Lines.Add(index.ToString());
        end
      );
    end
  );

我在这里无法理解“ASTride”的技术含义。是否AStride = 2意味着第一个线程将处理范围内[1..10]的两个连续数字,第二个线程将处理下一个连续数字等?

** 英语不是我的母语,我将“Stride”翻译为“long step”或“pace”。

4

1 回答 1

12

有人可能会认为答案可以在文档中找到:

AStride:表示循环迭代增量的整数。

我认为这意味着循环变量值是 1、3、5、7 和 9。但事实并非如此。这个程序:

{$APPTYPE CONSOLE}
uses
  System.Threading;

var
  Lock: TMonitor;
  LockObj: TObject;

procedure Proc(Index: Integer);
begin
  Lock.Enter(LockObj);
  Writeln(Index);
  Lock.Exit(LockObj);
end;

begin
  LockObj := TObject.Create;
  TParallel.&For(2, 1, 10, Proc);
end.

1输出从到的十个数字10

事实上,stride 参数允许您调整性能。并行 for 循环使用线程池来安排工作。如果工作包非常小,那么线程池中的同步开销会主导性能。解决这个问题的方法是确保工作包足够大以控制同步开销。

步幅允许您实现这一目标。在您的示例中,循环索引值 1 和 2 作为一项工作执行。索引值 3 和 4 是另一项工作。等等。通过将多个索引分组到单个工作中,可以减少花在同步开销上的时间。

于 2014-11-29T20:16:31.847 回答