PPL: инициализация пула потоков

Есть ли стандартный способ предварительной инициализации пула потоков PPL? Проблема в том, что PPL создает свой пул потоков во время выполнения, когда, например. выполняется parallel_for(). Это снижает производительность при первом запуске из-за создания дополнительных потоков.

Для пояснения проблемы приведу пример:

#pragma once

#include <vector>
#include <ppl.h>

using namespace std;
using namespace Concurrency;

// Use this define for experiments.
#define PPL_INIT_METHOD 2

int main()
{
#if (PPL_INIT_METHOD == 0)    // experiment 1: initialize default scheduler

  CurrentScheduler::Create(SchedulerPolicy());
  // After this call only one additional thread is created

#elif (PPL_INIT_METHOD == 1)  // experiment 2: initialize custom scheduler

  SchedulerPolicy my_policy(3,
                            MinConcurrency, 12,
                            MaxConcurrency, 12,
                            ContextPriority, THREAD_PRIORITY_NORMAL);
  Scheduler* my_scheduler = Scheduler::Create(my_policy);
  // After this call only one additional thread is created
  my_scheduler->Attach();
  assert(my_scheduler->GetNumberOfVirtualProcessors() == 12);
  // Still same number of threads (= 2)

  // cleanup stuff ...

#else      // experiment 3: execute dummy parallel_for()

  std::vector<int> v(1024*1024, 42);
  parallel_for(0u, v.size(), [&v](size_t i) { v[i] += 1; }, static_partitioner());
  // After this call all 12 threads are created and ready for more work!

#endif

  // Do real work now!!!

  return 0;
}

person mem64k    schedule 08.08.2013    source источник


Ответы (1)


Вы можете инициализировать пул потоков ppl вызовами Concurrency::Scheduler::Create в concrt.h.

person Rick    schedule 08.08.2013
comment
Нет, это не работает! Я пробовал: { SchedulerPolicy my_policy(3, MinConcurrency, 12, MaxConcurrency, 12, ContextPriority, THREAD_PRIORITY_NORMAL); Scheduler* my_scheduler = Scheduler::Create(my_policy); }. - person mem64k; 08.08.2013
comment
Как только вы создадите планировщик, вы должны прикрепить() его к текущему контексту, иначе он не будет использоваться. - person Edward KMETT; 14.08.2016