私の推奨事項は、マシンごとのスレッド数を割り当てるための構成およびコマンドライン スイッチを提供することです。ユーザー/管理者がアプリケーションを別の方法で明示的に構成していない場合は、こちらの他の回答で示されているように、Runtime.getRuntime().availableProcessors() に基づくヒューリスティックを使用します。いくつかの理由から、排他的なヒューリスティックベースのスレッドからコアへの推測を強くお勧めします。
最新のハードウェアのほとんどは、ますますあいまいなタイプの「ハードウェア スレッド」に向かっています。Intel のハイパースレッディングや AMD の計算モジュールなどの SMT モデルは式を複雑にし (詳細は以下を参照)、実行時にこの情報を照会することは困難な場合があります。
最新のハードウェアのほとんどには、アクティブなコアと周囲温度に基づいて速度をスケーリングするターボ機能があります。ターボ技術が向上するにつれて、速度 (ghz) の範囲が広がります。一部の最近の Intel および AMD チップは 2.6ghz (すべてのコアがアクティブ) から 3.6ghz (シングル/デュアル コアがアクティブ) の範囲であり、SMT と組み合わせると、前の設計で各スレッドが効果的な 1.6ghz ~ 2.0ghz のスループットを得ることができます。現在、実行時にこの情報を照会する方法はありません。
アプリケーションがターゲット システム上で実行される唯一のプロセスであるという強い保証がない場合、やみくもにすべての CPU リソースを消費することは、ユーザーまたはサーバー管理者を喜ばせない可能性があります (ソフトウェアがユーザー アプリかサーバー アプリかによって異なります)。 .
オペレーティング システム全体を自前のマルチタスク カーネルに置き換えることなく、実行時にマシンの残りの部分で何が起こっているかを知る確実な方法はありません。ソフトウェアは、プロセスにクエリを実行したり、CPU 負荷を調べたりすることで、知識に基づいた推測を試みることができますが、それを行うのは複雑であり、有用性は特定の種類のアプリケーション (あなたのアプリケーションが該当する可能性があります) に限定され、通常は昇格または特権の恩恵を受けるか、または必要とします。アクセス レベル。
最新のウイルス スキャナーは、最新のオペレーティング システムによって提供される特別な優先度フラグを設定することで機能します。「システムがアイドル状態」のときにOSに通知させます。OS は、CPU 負荷だけでなく、ユーザー入力や、ムービー プレーヤーなどによって設定された可能性のあるマルチメディア フラグも考慮して決定を下します。これは、ほとんどアイドル状態のタスクでは問題ありませんが、あなたの。
分散型ホーム コンピューティング アプリ (BOINC、Folding@Home など) は、実行中のプロセスとシステムの CPU 負荷を定期的に (1 秒または 0.5 秒ごとに) 照会することによって機能します。アプリに属さないプロセスで負荷が連続して複数のクエリで検出された場合、アプリは計算を中断します。いくつかのクエリで負荷が低くなると、再開します。CPU 負荷の読み取り値は短時間のスパイクで悪名高いため、複数のクエリが必要です。まだ注意事項があります: 1. ユーザーは、BOINC を自分のマシンの仕様に合わせて手動で再構成することをお勧めします。2. 管理者権限なしで BOINC を実行すると、他のユーザーによって開始されたプロセス (一部のサービス プロセスを含む) が認識されないため、CPU リソースをめぐって不当に競合する可能性があります。
SMT (ハイパースレッディング、計算モジュール) について:
最近では、ほとんどの SMT がハードウェア コアまたはスレッドとしてレポートされますが、SMT システムのすべてのコアにわたってスケーリングされたときに最適に実行されるアプリケーションはほとんどないため、通常は適切ではありません。さらに悪いことに、コアが共有 (SMT) であるか専用であるかを照会しても、多くの場合、期待される結果が得られません。場合によっては、OS 自体が単に認識していないことがあります (たとえば、Windows 7 は AMD Bulldozer の共有コア設計を認識していません)。信頼できる SMT カウントを取得できる場合、経験則として、各 SMT を CPU 集中型タスクの半分のスレッドとしてカウントし、ほとんどアイドル状態のタスクの完全なスレッドとしてカウントします。しかし実際には、SMT の重みは、SMT が実行する計算の種類とターゲット アーキテクチャによって異なります。Intel と AMD の SMT 実装は、互いにほぼ反対の動作をします。たとえば、Intel の s は、整数演算と分岐演算がロードされたタスクの並列実行に優れています。AMD は、SIMD とメモリ操作を並行して実行することに長けています。
ターボ機能について:
最近のほとんどの CPU には非常に効果的な組み込みの Turbo サポートがあり、システムのすべてのコアにわたるスケーリングから得られる価値がさらに低下します。さらに悪いことに、ターボ機能は、CPU 負荷と同じくらいシステムの実際の温度に基づいている場合があるため、タワー自体の冷却システムは、CPU の仕様と同じくらい速度に影響します。たとえば、特定の AMD A10 (ブルドーザー) では、2 つのスレッドで 3.7 GHz で実行されていることがわかりました。3 番目のスレッドが開始されると 3.5 GHz に低下し、4 番目のスレッドが開始されると 3.4 GHz に低下しました。これも統合された GPU であるため、4 つのスレッドと GPU が動作している場合、約 3.0 GHz まで低下しました (高負荷のシナリオでは、A10 CPU は内部的に GPU を優先します)。ただし、2 つのスレッドと GPU がアクティブな状態で 3.6 GHz を使用することはできます。私のアプリケーションは CPU と GPU の両方を使用していたので、これは重要な発見でした。プロセスを 2 つの CPU バウンド スレッドに制限することで、全体的なパフォーマンスを向上させることができました (他の 2 つの共有コアは引き続き役に立ちました。それらは GPU サービス スレッドとして機能し、新しいデータを GPU にプッシュするためにすばやく応答して起動できます。必要に応じて)。
...しかし同時に、4x スレッドでの私のアプリケーションは、高品質の冷却デバイスがインストールされたシステムではるかに優れたパフォーマンスを発揮した可能性があります。それはすべて非常に複雑です。
結論: 良い答えはありません。CPU SMT/Turbo 設計の分野は進化し続けているため、良い答えがすぐに見つかるとは思えません。今日定式化した適切なヒューリスティックは、明日には理想的な結果をもたらさない可能性があります。したがって、私の推奨事項は次のとおりです。時間を無駄にしないでください。ローカルの目的に十分に適したコア数に基づいて大まかに推測し、構成/スイッチによってオーバーライドできるようにして、先に進みます。