線形スケーラビリティの鍵は、1コアから2コアに移行するとスループットが2倍になるという状況で、共有リソースの使用をできるだけ少なくすることです。これの意味は:
- ハイパースレッディングを使用しないでください(2つのスレッドが同じコアリソースを共有するため)
- すべてのスレッドを特定のコアに結び付けます(そうでない場合、OSはコア間でスレッドをジャグリングします)
- コアよりも多くのスレッドを使用しないでください(OSはスワップインおよびスワップアウトします)
- コア自体のキャッシュ内にとどまる-現在、L1およびL2キャッシュ
- どうしても必要な場合を除いて、L3キャッシュやRAMに足を踏み入れないでください
- クリティカルセクション/同期の使用を最小化/経済化
ここまで来たら、おそらくコードのプロファイルを作成して手動で調整したことでしょう。
スレッドプールは妥協案であり、妥協のない高性能アプリケーションには適していません。トータルスレッドコントロールはです。
OSスケジューラについて心配する必要はありません。アプリケーションがCPUにバインドされており、ほとんどの場合ローカルL1およびL2メモリアクセスを行う長い計算を行う場合は、各スレッドを独自のコアに結び付ける方がパフォーマンスが向上します。確かにOSは入りますが、スレッドによって実行されている作業と比較すると、OSの作業はごくわずかです。
また、私のスレッド体験は主にWindowsNTエンジンマシンからのものであると言わなければなりません。
__ _ ____編集____ __ _ _ _ _ _
すべてのメモリアクセスがデータの読み取りと書き込みに関係しているわけではありません(上記のコメントを参照)。見過ごされがちなメモリアクセスは、実行するコードをフェッチすることです。したがって、コア自体のキャッシュ内にとどまるという私の声明は、必要なすべてのデータとコードがこれらのキャッシュに存在することを確認することを意味します。非常に単純なOOコードでさえ、ライブラリルーチンへの非表示の呼び出しを生成する可能性があることも覚えておいてください。この点(コード生成部門)では、OOおよびインタープリターされたコードはおそらくC(通常はWYSIWYG)またはもちろんアセンブリー(完全にWYSIWYG)よりもはるかに少ないWYSIWYGです。