私は 1500 のスレッドを持っています..12 のプロセッサで実行したいです
SetThreadAffinityMask(GetCurrentThread(),1<<(threadnum%numprocessors))
. ここで、numprocessors=12 です。マスクの正しい使い方ですか?スケーラブルである必要があります。つまり、11 プロセッサのみで実行する場合は
SetThreadAffinityMask(GetCurrentThread(),1<<(threadnum%numprocessors));
、numprocessors=11 になります。
質問する
481 次
2 に答える
5
そのとおりです。
しかし、パフォーマンスと効率の理由から、スレッド数が CPU 実行コアの数と等しくなるようにスレッド モデルを変更することをお勧めします。その後、それらのスレッドは、「タスク マネージャー」によって配布される 1500 タスク/作業項目で動作します。 .
独自の「タスク マネージャー」を作成したくない場合は、 OSによって管理される「スレッド プール」にタスクを割り当てるWindows ThreadPool APIを使用できます。
于 2011-03-29T06:18:03.117 に答える
2
構文的に SetThreadAffinityMask(GetCurrentThread(),1<<(GetThreadId()%numprocessors)) は正しいですが、スレッドとプロセッサが多いという理由だけでアフィニティを使用することはお勧めできません。スケジューラに干渉し、パフォーマンスが低下する可能性があります。これを一部のスレッドに使用して、キャッシュ ミスを最小限に抑えることができます。キャッシュ ミスは、スレッドがあるプロセッサから別のプロセッサに移動したときに発生します。
于 2011-03-29T05:55:07.303 に答える