Как установить количество потоков PPL равным одному?

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

Concurrency::SchedulerPolicy sp( 1, Concurrency::MaxConcurrency, 1 );
CurrentScheduler::Create(sp);

PPL создает два потока и запускает мой код параллельно... Любые предложения по сериализации расширенного кода ppl.


person Semih Ozmen    schedule 23.07.2012    source источник
comment
Вы, вероятно, будете счастливее, если создадите перегрузку функции / параметризуете ее, чтобы вы могли перейти к последовательной версии.   -  person Rick    schedule 23.07.2012
comment
перегрузка функции приведет к дублированию функции более низкой иерархии, поскольку распараллеливание осуществляется на нескольких уровнях. Я не хочу следить за перегрузкой... в будущем с обслуживанием будет сложно справиться... все равно спасибо   -  person Semih Ozmen    schedule 24.07.2012
comment
Скажите другому разработчику, чтобы он вытащил все глобальные переменные, статику и т. д. из своего кода/данных, чтобы это не имело значения?   -  person Martin James    schedule 24.07.2012
comment
Нет! для этого разработчика важно получить точный список результатов для каждого запуска этой функции с одними и теми же входными данными. Поскольку это распараллелено, теперь список результатов отличается по порядку! И невозможно отсортировать список результатов, так как это сложные структуры данных. Я застрял и так разочарован, что попробовал PPL. Если бы я использовал OpenMP, это была бы всего одна строка директивы.   -  person Semih Ozmen    schedule 24.07.2012


Ответы (1)


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

using namespace Concurrency;

std::vector< task_handle< std::function< void() > > > aTask;
aTask.push_back( make_task([](){ /*taks 1*/}) );
aTask.push_back( make_task([](){ /*taks 2*/}) );
aTask.push_back( make_task([](){ /*taks 3*/}) );

task_group tGroup;

bool bSerialMode = true; /* or false */
if (!bSerialMode)
{
    std::for_each(aTask.begin(), aTask.end(), [&](task_handle< std::function< void() > >& handle){
       tGroup.run( handle );
    });
}
else
{
    tGroup.run( [&](){
      std::for_each(aTask.begin(), aTask.end(), [&](task_handle< std::function< void() > >& handle){
       tGroup.run_and_wait( handle ); });
    });
}

Если вы все-таки решили ограничить все задачи одним виртуальным процессором, то установите и MinConcurrency.

CurrentScheduler::Create( SchedulerPolicy( 2, Concurrency::MinConcurrency, 1, Concurrency::MaxConcurrency, 1 ) );
person 23W    schedule 02.11.2012
comment
спасибо за ваши усилия ... это было когда-то с тех пор, как я задал этот вопрос, поэтому я не мог попробовать ваше предложение, но оно кажется применимым в некоторой степени. Когда я снова проверил вопрос, видно, что дублирование кода нежелательно. - person Semih Ozmen; 05.02.2014