【问题标题】:How to set number of PPL threads to one?如何将 PEOPLE 线程数设置为 1?
【发布时间】:2012-07-23 15:36:17
【问题描述】:

我有一个数字运算函数,所以我使用 PPL 将其并行化。但是由于某种原因,另一个开发人员要求此函数串行运行。我需要提供一个参数,以便他可以调用我的函数在串行模式下......我不想复制代码,所以我需要一种方法来限制 PPL 线程的数量......虽然我很难过

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

PPL 创建两个线程并并行运行我的代码...关于如何序列化 ppl 增强代码的任何建议。

【问题讨论】:

  • 如果你为函数构建一个重载/参数化它以便你可以进入串行版本,你可能会更快乐。
  • 函数重载会导致复制较低层次的函数,因为并行化在多个级别。我不愿意遵循超载..将来维护将很难处理...无论如何谢谢
  • 告诉其他开发人员从他/她的代码/数据中获取所有全局变量、静态变量等,这样就没有关系了?
  • 不!对于该开发人员而言,使用相同输入获取此函数每次运行的准确结果列表非常重要。由于这是并行化的,现在结果列表的顺序不同!并且不可能对结果列表进行排序,因为它们是复杂的数据结构。我被卡住了,很失望尝试 PPL。如果我使用的是 OpenMP,那将只是一行指令。

标签: multithreading visual-studio-2010 concurrency parallel-processing ppl


【解决方案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 ) );

【讨论】:

  • 感谢您的努力...自从我提出这个问题以来已经有一段时间了,所以我无法尝试您的建议,但它似乎在某种程度上适用。当我再次检查问题时,发现不需要重复代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
  • 2022-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多