タスク並列ライブラリを使用する場合、一度にプロセッサごとに 1 つのタスクだけを実行するようにすることはできますか? そうでない場合、C# でこれを行う最善の方法は何ですか?
注: これは、パフォーマンスを向上させるためではなく、各タスクのタイミングの信頼性を高めるために行っています。詳細については、この質問を参照してください: C# のタスク並列ライブラリを使用した並列アクションのタイミング
タスク並列ライブラリを使用する場合、一度にプロセッサごとに 1 つのタスクだけを実行するようにすることはできますか? そうでない場合、C# でこれを行う最善の方法は何ですか?
注: これは、パフォーマンスを向上させるためではなく、各タスクのタイミングの信頼性を高めるために行っています。詳細については、この質問を参照してください: C# のタスク並列ライブラリを使用した並列アクションのタイミング
まず、完全に信頼できるタイミングが必要な場合、Windows と .Net を使用するのは適切な選択ではありません。Windows はリアルタイム OS ではなく、システムで発生している他の事柄に基づいてコードの異なるタイミングを選択できるためです。.Net は、ガベージ コレクターのおかげでタイミングが非決定的であるため、適切な選択ではありません。
しかし、タイミングをもう少し確実にしたいだけなら、できることがいくつかあります。
各スレッドを独自のプロセッサで実行したい場合は、手動で を作成してからスレッドごとThread
に設定できますが、 aの を取得するのはそれほど簡単ではありません。ProcessThread.ProcessorAffinity
ProcessThread
Thread
すべてのタスクがすぐに開始されるようにしたい場合 ( で現在実行中の他のタスクに関係なくThreadPool
)、独自の も作成する必要がありますThread
。
ただし、プロセッサごとに最大でMaxDegreeOfParallelism
1 つのタスクがあることを確認することだけが必要な場合は、 に設定してEnvironment.ProcessorCount
ください。
ParallelOptionsを使用して最大並列処理を指定できます。ただし、これは上限であり、コアごとに 1 つのスレッドを強制するものではありません。他の制約により、使用されるコアが少なくなる場合があります。
例えば
var list = new List<int>();
var options = new ParallelOptions();
options.MaxDegreeOfParallelism = 4;
Parallel.ForEach(list, options);