1つのC++プロセスがあり、このプロセスで8つのスレッド(in parallelを実行したいとします。
そして、それを仮定します:
私の質問はこれです:
注:「並列」とは、完全に別の論理スレッドを意味します。
はい、8つのスレッドを持つ単一のプロセスを8つのコアで同時に実行できます。 OSにとって、これらのコアの物理的な配置(ソケットの数)はほとんど関係ありません。
これは、私が知っている本質的にすべての主要なOS(Windows、Linux、* BSD)に当てはまります。同様に、この点に関して制限を課しているC++コンパイラーについても知りません。
それを実現するためにあなたがしなければならない主なことは、あなたのスレッドが互いに独立して実際に実行できることを確実にすることです。相互依存関係がある場合、1つのスレッド(つまり1つのコア)が別のスレッドを待機することになります。
スレッドで実行している処理の種類に応じて、追加のスレッドを1つまたは2つ(場合によっては、特にI/Oにバインドされている場合はさらに多く)作成すると、常に任意のスレッドで実行できるスレッドが存在するので便利ですコア(スレッドの1つが入力(またはその順序の何か)を待機してストールしている場合でも).
ただし、現在のほとんどのOSdoは、スレッドをどこにスケジュールするかを決定するときにソケットを考慮に入れることを追加する必要があります。通常、単一のソケットのコア間で共有される単一のキャッシュがありますが、各ソケットには独自の個別のキャッシュがあるため、スレッドをスケジュールするときにソケットを考慮に入れることで、ある程度の効率を得ることができます。これは通常、準備ができていてもスレッドの実行を停止しませんが、2つのスレッドが両方とも実行準備ができている場合、可能であれば特定のソケットでそれぞれをスケジュールするための設定を表示することがあります。
同様に、多くのマルチソケットシステムは不均一なメモリアクセス(NUMA)を提供します。つまり、各CPUはメモリの一部に直接接続されています。別のCPUに接続されたメモリに保存されているデータを使用できますが、そうすると、レイテンシが増加し、帯域幅も減少する可能性があります。このようなシステムでは、処理中のデータを保持しているメモリに直接接続されているソケットにスレッドをスケジュールするのが一般的に望ましい方法です。
これを最適化するために、WindowsとLinuxの両方にNUMA関数が用意されているため、スレッドのスケジューリングとメモリ割り当てを制御できます。ただし、これはオプションの最適化です。プログラムはそれなしですべてのソケットのすべてのコアを使用できますが、アクセスパターンを最適化すると、より高速に実行できる可能性があります。
また、これをうまく使用しないと、プログラムを悲観化できるので、デフォルトよりも実行速度が遅くなることにも注意してください...