2

クラスがあるふりをします:

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

この task_group にスケジューラを割り当てるにはどうすればよいですか? コードの他の場所でも parallel_for を使用しているため、デフォルトのスケジューラは使用したくありません。

task_group には、時間に応じてすべてのコアまたはコアのサブセットを使用するように、スケジューラを介して設定された maxconcurrency のレベルがあります。アプリケーションは何時間も実行される可能性があるため、maxconcurrency を変更する必要があります。

PPL でこれを行う良い方法が見つかりません。.NET では、これは非常に簡単です。MaxDegreeOfParallelism を設定するだけです。

何か案は?

4

1 に答える 1

2

いくつかの解決策があります。

  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();
    
于 2012-11-02T15:45:18.183 に答える