スレッドの優先度を設定することは、スタックオーバーフローのタブーの対象になることは知っていますが、私のアプリケーションは優先度を上げるための良い候補であると確信しています。それを正当化するために、私は以下の文脈を説明しました。問題は、それを効果的に行う方法です。
アプリケーションは、約5時間の実行時間で複雑なアルゴリズムを実行する.NET 4(C#)コンソールアプリケーションです。このアルゴリズムは、メモリを大量に消費するのではなく、プロセッサを集中的に使用するだけです。数値計算を実行し、ディスクI / O、データベース接続、ネットワーク接続などを実行しません。アプリケーションの出力は、最後にコンソールに書き込む1つの数値です。つまり、アルゴリズムは完全に自己完結型であり、依存関係はありません。
このアプリケーションは、必要以上の空きRAM(8GB)を備えたWindowsServerを実行する専用の16コア64ビットマシンで実行されます。専用とは、このアプリケーションを排他的に実行するためにサーバーが調達されたことを意味します。
広範囲にわたるプロファイリング、派手な数学のショートカット、ちょっとしたハックを使って、コードを可能な限り最適化しました。
擬似コードの全体的な構造は次のとおりです。
public static void Main ()
{
Process.GetCurrentProcess().PriorityBoostEnabled = true;
Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime;
// Of course this only affects the main thread rather than child threads.
Thread.CurrentThread.Priority = ThreadPriority.Highest;
BigInteger seed = SomeExtremelyLargeNumber; // Millions of digits.
// The following loop takes [seed] and processes some numbers.
result1 = Parallel.For(/* With thread-static variables. */);
while (true) // Main loop that cannot be parallelized.
{
// Processes result1.
result2 = Parallel.For(/* With thread-static variables. */);
// Processes result2.
result1 = Parallel.For(/* With thread-static variables. */);
if (result1 == criteria)
break;
// Note: This loop does not need to sleep or care about system responsiveness.
}
}
SOに関するスレッドの優先度に関連する質問に基づいて、ThreadPoolを使用するものは優先度の点で混乱してはならないことを収集します。したがって、手動スレッドに切り替える必要がある場合は、そうしてください。
質問:
- スレッドの優先度を上げる(スレッドプールなどを使用しない)ために、上記のコードを手動スレッドに変更するにはどうすればよいですか?
- すべての子スレッドで優先度を最高に設定することも役立ちますか?つまり、子スレッドは互いに戦っているだけなのか、それとも外部OSタスクよりも優位に立つのでしょうか。
- 16コアがあることを考えると、16スレッドまたは15スレッドを実行する必要がありますか?これに対する一般的なガイドラインはありますか?
- プロセスの優先順位をリアルタイムのヘルプにも設定しますか?