2 разных экземпляра task_group не выполняют задачи параллельно - PullRequest
1 голос
/ 06 декабря 2011

Я хотел заменить использование обычных потоков классом task_group из ppl, но столкнулся со следующей проблемой:

  • У меня есть класс A с членом task_group,

  • создать 2 разных экземпляра класса A,

  • запустить задачу в группе задач первого экземпляра A (с помощью run),

  • через несколько секунд запустите задачу в task_group второго экземпляра A.

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

Это происходит только в моем приложении, где задачи запускаются из статической функции.Я сделал такой же сценарий в тестовом приложении, и задачи выполнялись правильно параллельно.

Потратив несколько часов, пытаясь выяснить это, я переключился на обычные потоки.

Кто-нибудь знает, почемутакое поведение во время параллелизма или как я могу избежать этого?

EDIT Проблема заключалась в том, что он работал на одноядерном процессоре, а среда выполнения параллелизма смотрела на пропускную способность,Интересно, имеет ли библиотека параллельных шаблонов Microsoft концепцию активного объекта или что-то в строках, чтобы вы могли указать, что задача, которую вы собираетесь запустить, должна выполняться параллельно с потоком, из которого вы ее запускаете ...

1 Ответ

0 голосов
/ 13 декабря 2011

Ответ можно найти здесь: http://social.msdn.microsoft.com/Forums/en/parallelcppnative/thread/85a84373-4c3d-4862-bff3-9a21ffe82493

Для одного ядра машины это ожидаемое поведение по умолчанию.Это можно изменить.

По умолчанию число задач, которые могут выполняться параллельно, = количество аппаратных потоков (количество ядер).Это улучшает сырой поток и эффективность выполнения задач.

Однако существует ряд ситуаций, когда разработчик хотел бы, чтобы многие задачи выполнялись параллельно, независимо от количества ядер.В этом случае у вас есть два варианта:

  1. Переоценка локально.

В приведенном выше примере вы должны использовать

void lengthyTask()

{

    Context::Oversubscribe(true)

         ...do a lengthy task  (//OR a blocking task)

    Context::Oversubscribe(false)

}
  1. Переподписать планировщик при запуске приложения.

    Политика SchedulerPolicy (1, MaxConcurrency, GetProcessorCount () * 2);

    SetDefaultSchedulerPolicy (policy);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...