4

また、プロセッサ コアを 100% で 12 秒間実行する必要がある場合、そうするのが良い考えでしょうか? システムにスレッドの処理方法を決定させると、パフォーマンスが向上しますか?

私が必要としているのは高速な実行であり、システムがすべてのコアを使用する前に数秒かかるのではないかと心配していますが、ブースト スレッドでこれを行う方法が見つかりませんでした。

4

4 に答える 4

6

オペレーティング システムのスケジューラは、秒単位ではなく、ミリ秒単位でこれを処理する必要があります。詳細は実行している OS によって異なりますが、一般的なアプローチの 1 つは、スケジューラーがアイドル状態の CPU で実行されている場合、スレッドが多すぎる別の CPU からスレッドを盗むことができるかどうかを確認することです。これにより、すべての CPU でスレッドのバランスが迅速に調整されます。

原則として、CPU アフィニティを設定する必要がある場合は、非常に特殊で異常なユース ケースがあるか、オペレーティング システムにバグがあります。

于 2012-11-11T21:35:30.063 に答える
6

非常に高性能なシステムでは、キャッシュの影響を受けやすいメモリ フットプリントの少ないタスクを特定のコアに割り当て、コアがほとんどこのタスクのみを実行すると、パフォーマンスが向上します。その効果は、キャッシュのヒット率を改善することであり、大きな違いを生む可能性があります。そうでない場合は、OS のスケジューラーに任せます。これは (前述のように) かなり特殊な状況ですが、発生した場合は、プロセッサ アフィニティを調べる価値があります。

于 2012-11-12T19:46:20.100 に答える
4

最初にメンバー関数を呼び出してget_native_handleから、取得したハンドルをプラットフォーム固有の関数に渡して、スレッドの CPU アフィニティを設定する必要があります (つまり、pthread_setaffinity_np/SetThreadAffinityMask/...)。

それが良いアイデアかどうかについては、プロフィールを作成して調べてください...

于 2012-11-12T20:13:32.370 に答える
0

アフィニティ セットの理由はもう 1 つあります。一部の最新システム (ARM ベースの SOC など) では、省電力テクノロジがスケジューラに大きな影響を与えます。システムは、可能な限り最小の CPU コアで実行されます。現在のすべてのタスクが 1 つのコアで実行できる場合、他のコアのみがスリープ状態になります。負荷が突然上昇した場合 (新しい重いタスクの実行中)、1 つまたは複数のコアを起動する必要があります。このプロセスは比較的遅いため、スケジューラーがより多くのコアの負荷を分散している間、タスクの CPU が不足する可能性があります。手動アフィニティをいくつかのスレッド/プロセスに設定すると、すべてのコアを実行し続けることができます (そして、突然の負荷の上昇に常に備えることができます)。疑似リアルタイムタスクには良さそうです。

于 2015-09-16T08:12:07.257 に答える