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」の技術的な意味が理解できません。最初のスレッドが範囲内の2つの連続した数字を処理し、2番目のスレッドが次の連続した数字などを処理するAStride = 2ことを意味しますか?[1..10]

** 英語は私の母国語ではなく、「Stride」を「長いステップ」または「ペース」に訳しています。

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 個の数値を出力し10ます。

実際、stride パラメータを使用すると、パフォーマンスを調整できます。並列 for ループは、スレッド プールを使用して作業をスケジュールします。作業パケットが非常に小さい場合、スレッド プール内の同期オーバーヘッドがパフォーマンスを支配する可能性があります。これを回避する方法は、作業パケットが同期オーバーヘッドを支配するのに十分な大きさであることを確認することです。

歩幅はこれを達成することを可能にします。あなたの例では、ループ インデックス値 1 と 2 が 1 つの作業として実行されます。インデックス値 3 と 4 は別の作業です。等々。複数のインデックスを 1 つの作業にグループ化することで、同期のオーバーヘッドに費やされる時間が削減されます。

于 2014-11-29T20:16:31.847 に答える