2

次のように、PPL を使用してタスクを作成し、[おそらく] 他のスレッドにディスパッチし始めています。

Concurrency::task_group  tasks;
auto simpleTask = Concurrency::make_task(&simpleFunction);
tasks.run(simpleTask);

毎秒タスクを作成する小さなアプリケーションを試してみました。タスクは 5 秒間重い計算を実行し、その後停止します。

PPL が自分のマシンで作成するスレッドの数と、マシンの負荷がスレッドの数またはスレッドに割り当てられるタスクに影響するかどうかを知りたいと思っていました。12 コア マシンでアプリケーションの 1 つ以上のインスタンスを実行すると、次のことに気付きます。

  • 1 つのアプリケーションを実行すると、6 つのスレッドが作成されます。合計 CPU 使用率は 50% です。
  • 2 つのアプリケーションを実行すると、どちらも 6 つのスレッドを作成します。合計 CPU 使用率は 100% ですが、マシンの応答性は良好です。
  • 3 つのアプリケーションを実行すると、すべてのアプリケーションで 6 つのスレッドが作成されます (合計で既に 18 スレッド)。合計 CPU 使用率は 100% です。
  • 4 つのアプリケーションを実行すると、合計 24 のスレッドが既に存在します。

Process Explorer を使用して実行中のアプリケーションを調査したところ、4 つのアプリケーションですべて 6 つ (場合によっては 12) のスレッドがあり、すべてができるだけ多くの CPU を消費しようとしていることが明確にわかりました。

PPL では、次のようにデフォルトのスケジューラを構成することで、スレッドの数を制限できます。

Concurrency::SchedulerPolicy policy(1, Concurrency::MaxConcurrency,2);
Concurrency::Scheduler::SetDefaultSchedulerPolicy(policy);

これにより、スレッドの数を静的に制限します (この場合は 2)。24 コアのサーバーに 10 人の同時ユーザーがいることが事前にわかっていれば便利ですが (したがって、すべてのアプリケーションを 2 スレッドに制限できます)、10 人のユーザーのうちの 1 人が遅くまで作業している場合でも、彼は 2 つのスレッドしか使用しません。マシンの残りの部分がアイドリングしている間。

私の質問: PPL を構成して、マシンの負荷に基づいて作成する (または維持するかアクティブにする) スレッドの数を動的に決定する方法はありますか? または、PPL は既にデフォルトでこれを行っており、私の観察は正しくありません。

編集:テストアプリケーションのインスタンスをさらに開始しようとしましたが、マシンは非常に応答性が高いままですが(元の質問では間違っていました)、アプリケーションが同時アクションの数を減らしているのを確認できません。

4

1 に答える 1

2

あなたの質問に対する短い答えは「いいえ」です。デフォルトの PPL スケジューラとリソース マネージャは、プロセス ローカル情報のみを使用して、スレッドをいつ作成/破棄するかを決定します。MSDN の Patterns and Practices 記事に記載されているとおり:

リソース マネージャーは、1 つのプロセス全体で機能するシングルトンです。複数のオペレーティング システム プロセス間でプロセッサ リソースを調整することはありません。アプリケーションで複数の同時プロセスを使用する場合、効率を最適化するために、各プロセスの同時実行レベルを下げる必要がある場合があります。

複雑さを受け入れたい場合は、カスタム スケジューラ/リソース マネージャーを実装して、システム レベルのパフォーマンスを単純に読み取る (例: PDH 関数を使用する) ことで、目的を達成できる場合があります。

于 2015-01-24T21:25:56.493 に答える