2014-11-29 8 views
11

TParallel.For() имеет аргумент AStride. В моем случае это 2 расставив ноги:В чем смысл AStride в TParallel.For?

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

Я не могу понять техническое значение «» здесь верхом. AStride = 2 означает, что первый поток будет обрабатывать два последовательных числа в диапазоне [1..10], второй поток будет обрабатывать следующие порядковые номера и т. Д.?

** Английский - это не мой родной язык, и я переводим «Stride» на «длинный шаг» или «темп».

ответ

12

Можно было бы подумать, что, что ответ может быть найден в documentation:

верхом: Целое число, которое представляет приращение итерации цикла.

Я бы прочитал это как подразумевающее, что значения переменной цикла равны 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 - это еще одна работа. И так далее. Сгруппировав несколько индексов в одну часть работы, количество времени, затрачиваемого на накладные расходы синхронизации, уменьшается.

+0

Я надеюсь, что параметр, который вы ожидали от этого, будет описан и назван как шаг итерации или шаг шага (если они когда-либо его вводят). Из любопытства они используют API пула потоков на платформе Windows? – TLama

+2

@TLama Я сомневаюсь, что они добавят такой параметр, так как программисту это легко сделать. Другие параллельные. Для реализаций выработка «шага» я считаю. Пул потоков является родным для Delphi RTL. Так что не пул системных потоков. –

+0

Кроме того, шаг «самонастраивается». То есть когда начальное значение не задано, оно периодически увеличивается. Я думаю, что это делается для противодействия ложному совместному использованию в длинных циклах. – iamjoosy

 Смежные вопросы

  • Нет связанных вопросов^_^