【问题标题】:VC++ PPL, assigning a Scheduler to a task_groupVC++ PPL,将调度程序分配给 task_group
【发布时间】:2012-10-29 03:12:31
【问题描述】:

假设我们有一个班级:

class Foo
{
private:
 Concurrency::task_group _tasks;  
};

如何将调度程序分配给此 task_group?我不想使用默认调度程序,因为我还在代码的其他地方使用了 parallel_for。

task_group 将通过调度程序设置其最大并发级别,以根据小时使用所有内核或它们的子集。应用程序可能会运行数小时,因此需要更改 maxconcurrency。

我在 PPL 中找不到这样做的好方法。在 .NET 中,这非常简单 - 您只需设置 MaxDegreeOfParallelism。

有什么想法吗?

【问题讨论】:

    标签: task scheduler ppl


    【解决方案1】:

    有几种解决方案:

    1. 如果你使用 MSVS C++ 2012 比:

      _tasks.run([]()
      {
          Context::Oversubscribe(true);
          //
          // long time running task
          //
         Context::Oversubscribe(false);
      });
      
    2. 如果您的 APP 在 Win7x64 或 Windows Server 2008 R2 上运行,请尝试UMS

      Scheduler::SetDefaultSchedulerPolicy( SchedulerPolicy(1, SchedulerKind, UmsThreadDefault) );
      
    3. 最后。在创建新的繁重时间任务之前,使用新的超额订阅策略(放大 MaxConcurrency)创建新的当前调度程序。

      CurrentScheduler::Create( SchedulerPolicy(1, MaxConcurrency, 8) );
      _tasks.run([](){
          //
          // long time running task
          //
       });
      CurrentScheduler::Detach();
      

    【讨论】:

    • 我尝试了#3,它只在第一遍有效。在我运行 N 次的较大方法中,我使用了 parallel_for(设置为默认值和调度程序以使用所有内核 ==> SchedulerPolicy(1, MaxConcurrency, LogicalCoreCount))。之后,我基本上使用了#3 中的内容,但我将 MaxConcurrency 设置为 (LogicalCoreCount - 1)。我可以看到工作使用率达到 87%...但在下一次通过时它达到 100% 并忽略了我的 MaxConcurrency SchedulerPolicy。
    • 可能是第二种情况,当前调度器被其他并发任务占用,无法释放逻辑处理器,导致CPU使用率100%。尝试使用 Scheduler 类来管理调度程序实例 - link:
    • 示例:const UINT nProcessorCount = std::max(1, Concurrency::GetProcessorCount() - 1);调度程序*调度程序=调度程序::创建(调度程序策略(1,MaxConcurrency,nProcessorCount));调度程序->附加(); // 运行你的任务 CurrentScheduler::Detach();调度器->Release();
    • 一点说明:MaxConcurrency 应该是来自 Concurrency::GetProcessorCount() 的比例因子。只有在这种情况下才能预测 CPU 使用率。
    • Visual Studio 2012 的并发运行时不支持用户模式可调度 (UMS) 线程。请参阅 msdn.microsoft.com/en-us/library/dd492665(v=vs.110).aspx 我不知道他们为什么要删除它。
    猜你喜欢
    • 2023-03-15
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 2019-08-16
    • 2016-07-27
    • 1970-01-01
    相关资源
    最近更新 更多