Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ PPL:线程池的初始化_C++_Visual C++_Visual Studio 2012_Tbb_Ppl - Fatal编程技术网

C++ PPL:线程池的初始化

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

有没有标准的方法来预初始化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;
}
#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);}。一旦创建了调度器,就必须将它附加到当前上下文,否则它将无法使用。