1

タスク並列ライブラリを使用する場合、一度にプロセッサごとに 1 つのタスクだけを実行するようにすることはできますか? そうでない場合、C# でこれを行う最善の方法は何ですか?

注: これは、パフォーマンスを向上させるためではなく、各タスクのタイミングの信頼性を高めるために行っています。詳細については、この質問を参照してください: C# のタスク並列ライブラリを使用した並列アクションのタイミング

4

2 に答える 2

5

まず、完全に信頼できるタイミングが必要な場合、Windows と .Net を使用するのは適切な選択ではありません。Windows はリアルタイム OS ではなく、システムで発生している他の事柄に基づいてコードの異なるタイミングを選択できるためです。.Net は、ガベージ コレクターのおかげでタイミングが非決定的であるため、適切な選択ではありません。

しかし、タイミングをもう少し確実にしたいだけなら、できることがいくつかあります。

各スレッドを独自のプロセッサで実行したい場合は、手動で を作成してからスレッドごとThreadに設定できますが、 aの を取得するのはそれほど簡単ではありませんProcessThread.ProcessorAffinityProcessThreadThread

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

ただし、プロセッサごとに最大でMaxDegreeOfParallelism1 つのタスクがあることを確認することだけが必要な場合は、 に設定してEnvironment.ProcessorCountください。

于 2012-05-10T11:20:56.183 に答える
1

ParallelOptionsを使用して最大並列処理を指定できます。ただし、これは上限であり、コアごとに 1 つのスレッドを強制するものではありません。他の制約により、使用されるコアが少なくなる場合があります。

例えば

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

Parallel.ForEach(list, options);
于 2012-05-10T11:13:00.460 に答える