Учитывает ли PPL нагрузку на систему при создании потоков или нет?

Я начинаю использовать PPL для создания задач и отправки их [возможно] другим потокам, например:

Concurrency::task_group  tasks;
auto simpleTask = Concurrency::make_task(&simpleFunction);
tasks.run(simpleTask);

Я экспериментировал с небольшим приложением, которое каждую секунду создает задачу. Задача выполняет тяжелые вычисления в течение 5 секунд, а затем останавливается.

Я хотел знать, сколько потоков PPL создает на моей машине, и влияет ли загрузка машины на количество потоков или задачи, назначенные потокам. Когда я запускаю один или несколько экземпляров своего приложения на своей 12-ядерной машине, я замечаю следующее:

  • При запуске 1 приложения создается 6 потоков. Общая загрузка ЦП составляет 50%.
  • При запуске 2 приложений оба создают по 6 потоков. Общая загрузка ЦП составляет 100%, но моя машина остается довольно отзывчивой.
  • При запуске 3 приложений все они создают 6 потоков (всего уже 18 потоков). Общая загрузка ЦП составляет 100%.
  • При запуске 4 приложений у меня всего уже 24 потока.

Я исследовал запущенные приложения с помощью Process Explorer, и с помощью 4 приложений я ясно вижу, что все они имеют 6 (иногда даже 12) потоков, которые все пытаются использовать как можно больше ЦП.

PPL позволяет ограничить количество потоков, настроив планировщик по умолчанию, например:

Concurrency::SchedulerPolicy policy(1, Concurrency::MaxConcurrency,2);
Concurrency::Scheduler::SetDefaultSchedulerPolicy(policy);

Таким образом вы статически ограничиваете количество потоков (в данном случае 2). Это может быть удобно, если вы заранее знаете, что на сервере с 24 ядрами одновременно работают 10 пользователей (так что вы можете ограничить каждое приложение двумя потоками), но если один из 10 пользователей работает поздно, он по-прежнему использует только 2 потока, в то время как остальная часть машины находится на холостом ходу.

Мой вопрос: есть ли способ настроить PPL так, чтобы он динамически решал, сколько потоков создать (или сохранить или оставить активными) в зависимости от нагрузки на машину? Или PPL уже делает это по умолчанию, и мои наблюдения неверны.

ИЗМЕНИТЬ: я попытался запустить больше экземпляров своего тестового приложения, и, хотя моя машина остается достаточно отзывчивой (я ошибся в исходном вопросе), я не вижу, чтобы приложения уменьшали количество одновременных действий.


person Patrick    schedule 28.11.2014    source источник


Ответы (1)


Краткий ответ на ваш вопрос - «Нет». Планировщик PPL и диспетчер ресурсов по умолчанию будут использовать только локальную информацию о процессе, чтобы решить, когда создавать / уничтожать потоки. Как указано в статье «Шаблоны и методы» в MSDN:

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

Если вы готовы принять сложность, вы можете реализовать настраиваемый планировщик / диспетчер ресурсов, чтобы снимать простые показания производительности на уровне системы (например, с использованием функций PDH) для достижения желаемого.

person bobbymcr    schedule 24.01.2015
comment
Спасибо. Не тот ответ, на который я надеялся, но все же очень полезный. - person Patrick; 25.01.2015