Подтвердить что ты не робот

В чем смысл AStride в TParallel.For?

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" на "длинный шаг" или "темп".

4b9b3361

Ответ 1

Можно подумать, что ответ можно найти в документации :

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.

Фактически параметр шага позволяет вам настроить производительность. Параллельный цикл использует пул потоков для планирования работы. Если рабочие пакеты очень малы, тогда служебные данные синхронизации в пуле потоков могут доминировать над производительностью. Способ обойти это - убедиться, что рабочие пакеты достаточно велики, чтобы доминировать накладные расходы синхронизации.

Этот шаг позволяет достичь этого. В вашем примере значения индекса цикла 1 и 2 выполняются как одна часть работы. Значения индексов 3 и 4 - это еще одна работа. И так далее. Сгруппировав несколько индексов в одну часть работы, количество времени, затрачиваемого на накладные расходы синхронизации, уменьшается.