一般に、システム内のコア数をスケールアップする場合、メモリ レイテンシや帯域幅が問題になります。注: おそらく特殊な例外がありますが、概して、最新のシステムのほとんどは、6 つ以上のハードウェア コアがメモリにアクセスするまでメモリ ボトルネックに陥ることはありません。
ただし、通信のオーバーヘッドは非常に高くつく可能性があります。これの技術的な理由は非常に複雑であり、私の回答の範囲を超えています.いくつかの側面はハードウェアに関連していますが、他の側面は単に計算を完了するために別のコアをブロックするコストに関連しています..両方とも悪い. このため、複数のコアを利用するプログラム/アプリケーションは通常、コア間の通信をできるだけ少なくする必要があります。これにより、個別のコアにオフロードできるタスクの種類が制限されます。
新しいシステムは、技術的に実現可能であるという理由だけで、より多くのコアを追加しています。たとえば、シングル コアのパフォーマンスを向上させることは、技術的にも経済的にももはや実行可能ではありません。私が知っているほとんどすべてのアプリケーション プログラマーは、12 個のコアを効率的に利用する方法を考え出すよりも、単一の超高速コアを絶対に好むでしょう。しかし、たとえ数千万ドルを支払ったとしても、チップ メーカーはそのようなコアを製造することはできませんでした。
光の速度が一定である限り、並列処理は存続します。今日のように、CPU で見られる速度向上の多くは、個々の命令の並列処理によるものです。可能な限り、Core 2 Duo (たとえば) は最大 4 つの命令を並行して実行します。これが機能するのは、多くのプログラムでは、命令のシーケンスが互いに直接依存しないことが多いためです。
- = g_Var1 + 1;
- b = g_Var2 + 3;
- c = b * a;
- d = g_Var3 + 5;
最新の CPU は、実際には 1、2、4 行を並行して実行し、その後 2 倍にして 3 行目を終了します。通常は、5、6 行目などと並行して実行します。(「c」変数の結果はそれらのいずれにも必要ないと仮定します)。これが必要なのは、単一の命令を実行するパイプラインを高速化または短縮する能力が非常に限られているためです。その代わりに、エンジニアは「広く行く」ことに焦点を当ててきました - より多くの命令を並行して、より多くのコアを並行して、より多くのコンピューターを並行して (後者はクラウド コンピューティング、BOINC、または @home プロジェクトに似ています)。