過去には、単一のCPUコアが2つのコアのように機能するハイパースレッディングと呼ばれるものがありました。
しかし、2つのCPUコアを1つにマージして、複数のコアを適切に使用しないプログラムのパフォーマンスを向上させることは可能ですか? (古いゲームからX Plane 11まで)
簡単な答え:いいえ。
もう少し長い答え:マルチコアチップ上のコアは、基本的に別個の物理プロセッサです。ハイパースレッディングを使用すると、1つの物理コアを2つのスレッドなどに分割できます。これの利点は、シングルコアがスレッド間で前後にスワップできるため、一方のスレッドが待機しているとき(たとえば、I/Oの場合)、もう一方のスレッドを再開できることです。 1つのハイパースレッドコア上の2つのスレッドがリソースを共有し、スレッド間の非常に効率的なコンテキスト切り替えを可能にします。
では、なぜ反対のことができないのですか?まあ、それを想像してみてください。 2つの物理コアがありますが、プロセスは1つだけです。考えられるシナリオは2つあります。
実行中のコードは並行して実行できます。この場合、各コアに1つずつ、合計2つのスレッドがあります。このようにして、両方のスレッドを同時に実行できます。
実行中のコードを並行して実行することはできません。これがあなたが求めていることです。この場合、単一のスレッドがあります。コードを並行して実行することはできないため、2つの別々のプロセッサで同時に実行することはできません。両方のコアで単一のスレッドを実行するには、2つのコア間でスレッドを切り替えるだけです。これによってパフォーマンスが向上することはなく、実際には、不要なコンテキストスイッチが原因でパフォーマンスが低下します。
これは、マルチコアシステムの不幸な欠点です。アプリケーションが複数のタスクを並行して実行でき、そうするように記述されている場合にのみ、パフォーマンスの向上が見られます。それでも、ゲインはコアの数に正比例しません( アムダールの法則 を参照)。
いいえ、そうではありません
何らかの方法で命令を並列化する必要があり、それらの多くは他の命令の結果に依存します[1]。それに加えて、算術演算装置(実際に計算している脳)は通常、ボトルネックではありません。
データにアクセスして計算するには、データを保存する必要があります。これを高速化するために、複数のメモリ層(レジスタ、キャッシュ(レベル1、2、3)、RAM)があります。 2つのコア(x86プロセッサ内)は通常、RAM(およびおそらくL3キャッシュ)のみを共有します。したがって、残りの半分には必要なデータがあるため、プログラムを単純に分割することはできません。
ハイパースレッディングは時間を利用しており、コンピューティングユニットは他の何かを待っています。
たとえば、から値をロードするのに長い時間がかかります。 RAM(AFAIKは約500 CPUサイクル)。このとき、演算装置が通常何もしない場合、ハイパースレッディングは同じコアで2番目のプロセスを実行します。
[1]それは、投機的実行が助けようとするポイントでもあります。そして多分いくつかのセキュリティホールを作成します(SpectreとMeltdown)