Сколько потоков используется по умолчанию в TParallel::For?

Я хочу использовать TParallel::For в C++ Builder, но хотел бы знать, сколько потоков используется по умолчанию в этом цикле? Например, если у меня есть 1000 итераций, которые можно выполнять параллельно, будут ли они выполняться путем создания сразу 1000 потоков, или максимальное количество потоков в любой момент времени ограничено количеством логических процессоров?

Я хочу сказать, что я не хочу, чтобы TParallel::For создавало больше потоков одновременно, чем поддерживает ЦП. Итак, если ЦП поддерживает 8 потоков, будут ли эти итерации выполняться 8 на 8, пока не будут выполнены все 1000 итераций, или будет создано 1000 потоков одновременно?


person Tracer    schedule 29.11.2019    source источник
comment
Он использует пул потоков по умолчанию, если вы не предоставите свой собственный пул потоков. Существует, по крайней мере, в наши дни, довольно обширная документация. Я бы начал там.   -  person David Heffernan    schedule 29.11.2019


Ответы (1)


Обработчик пула по умолчанию ищет как ресурсы компьютера, так и загрузку компьютера.

Из документов (выделено мной):

RTL предоставляет библиотеку параллельного программирования (PPL), предоставляя вашим приложениям возможность выполнять задачи параллельно, используя преимущества работы на нескольких устройствах с ЦП и компьютерах. PPL включает в себя ряд расширенных функций для запуска задач, объединения задач, ожидания обработки групп задач и т. д. Для всего этого существует пул потоков, который самонастраивается автоматически (в зависимости от нагрузки на ЦП), поэтому вам не нужно заботиться о создании потоков или управлении ими для этой цели.

Если вы хотите контролировать пул, вы можете определить свой собственный пул :

Когда указан параметр APool типа TThreadPool, автор программы управляет ресурсами потока, доступными для итерируемых событий TParallel.For, с помощью его методов TThreadPool.SetMinWorkerThreads и TThreadPool.SetMaxWorkerThreads. Имейте в виду, что при вызове этих методов слишком много одновременных потоков могут генерировать накладные расходы, которые уменьшают или устраняют преимущества параллельного выполнения подпрограмм.


Пул потоков по умолчанию инициализируется со следующими ограничениями:

FMinLimitWorkerThreadCount := TThread.ProcessorCount;
FMaxLimitWorkerThreadCount := TThread.ProcessorCount * MaxThreadsPerCPU;

MaxThreadsPerCPU — это константа, равная 25. Таким образом, в зависимости от загрузки процессора используемые потоки в пуле варьируются между этими числами.

person LU RD    schedule 29.11.2019
comment
Я приму этот ответ, но я также нашел следующее в блоге Стивена Болла: Определенный в System.Threading, TThreadPool инициирует по умолчанию 25 потоков на ЦП. - person Tracer; 29.11.2019