Установить приоритет групп потоков PPL

У меня есть сценарий, в котором некоторые функции должны выполняться как можно быстрее и им должны быть предоставлены вычислительные ресурсы за счет других задач (т.е.они имеют высокий приоритет). В частности, рендеринг графики и любые задачи, порождаемые для рендеринга, должны выполняться как можно быстрее, но не использовать полную мощность ЦП. Одновременно я хочу заполнить пустые циклы ЦП другой работой, которая не так критична по времени, и следить за тем, чтобы не украсть циклы у задач рендеринга.

Основная идея довольно проста, но я не могу понять, как делать то, что я хочу, через PPL. Я нашел, как установить в планировщике по умолчанию разные приоритеты, но я не хочу глобально менять приоритет. Скорее, я хочу иметь две отдельные политики планирования, в которые я могу добавлять задачи в любое время.

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

https://msdn.microsoft.com/en-us/library/dd984038.aspx

Также важно, чтобы я мог гарантировать, что любые подзадачи, порожденные потоком, наследуют приоритет родителя. В частности, я вызываю parallel_for из задач с высоким и низким приоритетом, и блоки parallel_for должны сохранять одинаковый приоритет.


person Joe    schedule 03.06.2015    source источник


Ответы (1)


Конструктор задачи (и функция create_task) может принимать параметр task_options с настраиваемым планировщиком.

https://msdn.microsoft.com/en-us/library/dn237306.aspx

person petke    schedule 15.06.2015
comment
Как вы можете создать собственный планировщик для подачи в task_options? Я не мог найти очевидного способа создать или реализовать такой планировщик. Обратите внимание, что планировщик, созданный concurrency::Scheduler::Create, не будет работать, потому что это concurrency::IScheduler, а не обязательный и явно не связанный concurrency::scheduler_interface. - person matz; 19.11.2015