1

タスク並列ライブラリを使用する場合、その時点でプロセッサごとに1つのタスクしか実行していないことを確認できますか?もしそうでなければ、C#でこれを行う最良の方法は何ですか?C#のタスク並列ライブラリを使用してプロセッサごとに1つの並列タスクを実行

注:これは、パフォーマンスを向上させるためではなく、各タスクのタイミングをより信頼できるものにするためです。詳細については、この質問を参照してください:Timing of parallel actions using the Task Parallel Library in C#

答えて

1

最大並列性を指定するには、ParallelOptionsを使用できます。ただし、これは上限です。コアごとに1つのスレッドを強制しません。他の制約はコアの使用量が少ないことを意味します。

var list = new List<int>(); 
var options = new ParallelOptions(); 
options.MaxDegreeOfParallelism = 4; 

Parallel.ForEach(list, options); 
5

まず、確実にタイミングを守りたい場合は、Windowsと.Netを使用するのが適切ではありません。 Windowsではreal-time OSではないため、システムで発生している他の事柄に基づいて、コードに異なるタイミングを選択することができます。 .Netはガベージコレクタのおかげで非決定的なタイミングを持つため、良い選択ではありません。

ただし、タイミングをある程度信頼性を高めたい場合は、できることがいくつかあります。

独自のプロセッサで各スレッドを実行する場合は、Threadを手動で作成し、各スレッドに対してProcessThread.ProcessorAffinityを設定します(getting the ProcessThread for a Thread is not that simple)。

ThreadPoolで現在実行中の他のタスクに関係なく、すべてのタスクがすぐに開始されるようにしたい場合は、独自のThreadも作成する必要があります。

しかし、あなたが望むすべては、プロセッサあたりで最もつのタスクがあることを確認することですちょうどEnvironment.ProcessorCountMaxDegreeOfParallelismを設定した場合。

関連する問題