【问题标题】:What is the meaning of AStride in TParallel.For?TParallel.For中的ASTride是什么意思?
【发布时间】:2014-11-29 19:28:20
【问题描述】:

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

【问题讨论】:

    标签: multithreading delphi delphi-xe7 parallel-for


    【解决方案1】:

    有人可能会认为答案可以在documentation:

    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 是另一项工作。等等。通过将多个索引分组到单个工作中,可以减少花在同步开销上的时间。

    【讨论】:

    • 我希望您所期望的参数将被描述并命名为迭代步骤或反步骤(如果他们曾经介绍过)。出于好奇,他们是否使用了 Windows 平台上的线程池 API?
    • @TLama 我怀疑他们会添加这样的参数,因为程序员很容易这样做。我认为其他 Parallel.For 实现自己制定了“步幅”。线程池是 Delphi RTL 原生的。所以不是系统线程池。
    • 另外,步幅是“自调”。 IE。当没有给出起始值时,它会定期递增。我认为,这样做是为了抵消长时间运行循环中的错误共享。
    猜你喜欢
    • 1970-01-01
    • 2011-08-12
    • 2017-06-11
    • 2018-03-05
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 2011-04-18
    相关资源
    最近更新 更多