2013-08-08 3 views
1

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

Для выяснения этой проблемы, вот пример:

#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; 
} 

ответ

0

Вы можете инициализировать Закон о госзакупках ThreadPool с вызовами параллельности :: Планировщик :: Создание в concrt.h.

+0

Нет, это не сработает! Я пробовал: {SchedulerPolicy my_policy (3, MinConcurrency, 12, MaxConcurrency, 12, ContextPriority, THREAD_PRIORITY_NORMAL); Планировщик * my_scheduler = Планировщик :: Создать (my_policy); }. – mem64k

+0

Создав планировщик, вы должны привязать его к текущему контексту или не использовать. –