プロセスのプロセッサ アフィニティを次のように設定した場合:
var me = Process.GetCurrentProcess();
me.ProcessorAffinity = (IntPtr) processorAffinityMask;
...、TPL はそのすべての作業に対してそれを尊重しますか? つまり、デフォルトのスケジューラを使用して、特定のマスクで許可されていないプロセッサに作業をプッシュするようなものはありますか? これを証明するテストはありますか?
プロセスのプロセッサ アフィニティを次のように設定した場合:
var me = Process.GetCurrentProcess();
me.ProcessorAffinity = (IntPtr) processorAffinityMask;
...、TPL はそのすべての作業に対してそれを尊重しますか? つまり、デフォルトのスケジューラを使用して、特定のマスクで許可されていないプロセッサに作業をプッシュするようなものはありますか? これを証明するテストはありますか?
はい、TPL は指定したアフィニティ マスクを尊重します。
それを尊重できない唯一の方法は、アフィニティを明示的に変更することですが、それは行いません。
TPL で考えられるすべてのコード パスを実行するテストを作成することは非常に現実的ではありませんが、利用可能な多くのコアを活用するテストをセットアップし、アフィニティ マスクを 1 CPU に設定し、タスク マネージャーでアフィニティが変化することはなく、CPU 使用率が 1/N を超えることはありません。ここで、N は存在するコアの数です。
M コアのアフィニティを持つようにそのテストを拡張し、CPU 使用率 <= M/N を観察することもできます。また、タスク マネージャーでアフィニティが変化しないことを直接観察することもできます。
適切なテストは、反復ごとにかなりの時間を必要とし、多くの独立した作業単位を提供するものです。たとえば、N が大きい場合に最初の素数 > N を計算し、ターゲット素数の配列で Parallel.Foreach を使用します。アレイのサイズは、存在するコアの数よりも大幅に大きくする必要があります。
余談ですが、CPU アフィニティを明示的に設定することはほとんど良い考えではありません。あなたのユースケースが何であるか興味があります。