问题 在TParallel.For中AStride是什么意思?


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”。


3876
2017-11-29 19:28


起源



答案:


有人可能会想到答案可以在答案中找到 文件

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

我读到这意味着循环变量值是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是另一项工作。等等。通过将多个索引分组到单个工作中,减少了在同步开销上花费的时间量。


12
2017-11-29 20:16



我希望你从这个参数中得到的参数将被描述并命名为迭代步骤或计数器步骤(如果它们引入它)。出于好奇,他们是否在Windows平台上使用线程池API? - TLama
@TLama我怀疑他们是否会添加这样的参数,因为程序员很容易这样做。其他Parallel.For实现我自己解决了“跨步”问题。线程池是Delphi RTL的原生。所以不是系统线程池。 - David Heffernan
此外,步伐是“自我调整”。即当没有给出起始值时,它会定期递增。我认为,这是为了抵消长时间运行循环中的错误共享。 - iamjoosy
提交的问题: quality.embarcadero.com/browse/RSP-11368 - Johan


答案:


有人可能会想到答案可以在答案中找到 文件

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

我读到这意味着循环变量值是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是另一项工作。等等。通过将多个索引分组到单个工作中,减少了在同步开销上花费的时间量。


12
2017-11-29 20:16



我希望你从这个参数中得到的参数将被描述并命名为迭代步骤或计数器步骤(如果它们引入它)。出于好奇,他们是否在Windows平台上使用线程池API? - TLama
@TLama我怀疑他们是否会添加这样的参数,因为程序员很容易这样做。其他Parallel.For实现我自己解决了“跨步”问题。线程池是Delphi RTL的原生。所以不是系统线程池。 - David Heffernan
此外,步伐是“自我调整”。即当没有给出起始值时,它会定期递增。我认为,这是为了抵消长时间运行循环中的错误共享。 - iamjoosy
提交的问题: quality.embarcadero.com/browse/RSP-11368 - Johan