C++ PPL:线程池的初始化
有没有标准的方法来预初始化PPL线程池?问题是:PPL在运行时创建它的线程池,例如在执行parallel_for()时。由于创建了额外的线程,因此在第一次运行期间会损失一些性能 为了澄清问题,以下是一个示例:C++ PPL:线程池的初始化,c++,visual-c++,visual-studio-2012,tbb,ppl,C++,Visual C++,Visual Studio 2012,Tbb,Ppl,有没有标准的方法来预初始化PPL线程池?问题是:PPL在运行时创建它的线程池,例如在执行parallel_for()时。由于创建了额外的线程,因此在第一次运行期间会损失一些性能 为了澄清问题,以下是一个示例: #pragma once #include <vector> #include <ppl.h> using namespace std; using namespace Concurrency; // Use this define for experimen
#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;
}
#pragma一次
#包括
#包括
使用名称空间std;
使用名称空间并发;
//将此定义用于实验。
#定义PPL_INIT_方法2
int main()
{
#if(PPL_INIT_METHOD==0)//实验1:初始化默认调度程序
CurrentScheduler::创建(SchedulerPolicy());
//在这个调用之后,只创建一个额外的线程
#elif(PPL_INIT_METHOD==1)//实验2:初始化自定义调度程序
计划政策我的政策(3,
Miny,12,
MaxConcurrency,12,
ContextPriority,线程优先级(正常);
调度程序*my_调度程序=调度程序::创建(my_策略);
//在这个调用之后,只创建一个额外的线程
我的计划程序->附加();
断言(my_scheduler->GetNumberOfVirtualProcessors()==12);
//线程数仍然相同(=2)
//清理工作。。。
#else//实验3:为()执行虚拟并行_
向量v(1024*1024,42);
(0u,v.size(),[&v](size_ti){v[i]+=1;},static_partitioner())的并行_;
//在这个调用之后,所有12个线程都被创建并准备好进行更多的工作!
#恩迪夫
//现在就做真正的工作!!!
返回0;
}
您可以通过在concrt.h中调用Concurrency::Scheduler::Create来初始化ppl线程池。不,这不起作用!我尝试过:{SchedulerPolicy my_policy(3,MinConcurrency,12,MaxConcurrency,12,ContextPriority,THREAD_PRIORITY,THREAD_NORMAL);Scheduler*my_Scheduler=Scheduler::Create(my_policy);}。一旦创建了调度器,就必须将它附加到当前上下文,否则它将无法使用。