良い質問か、興味深い回答が少なくとも1つあります。この回答の一部は、CPU が複数の独立したコアではなく、幅を効率的に拡張できる世界をイメージしています。ライセンス/価格モデルは異なります!
残りは、なぜできないのかを説明しています。概要:
- 複数のコアのコストはほぼ線形にスケーリングします
- 1コアのスーパースカラーパイプラインを拡張するコストは、約2 倍に拡大します。これは、とにかくある程度まで、十分なブルートフォースで実行可能です。シングルスレッドのパフォーマンスは、インタラクティブな使用にとって非常に重要です(スループットだけでなく、エンドツーエンドのレイテンシが問題になります)。そのため、現在のビッグコアハイエンドCPUはその代価を支払います。例:Skylake(4ワイド)、Ryzen(5または6ワイド)、およびAppleのA12(大きなコアでは7ワイド、小さなエネルギー効率の良いコアでは3ワイド)
- パイプラインを3または4幅以上に拡張するだけで、ILPを見つけるための順序が正しくない場合でも、深刻なIPCの減少は戻ります。ブランチミスとキャッシュミスは困難であり、パイプライン全体を停止させます。
周波数については言及しませんでしたが、IPCだけですが、周波数のスケーリングも難しいです。高い周波数は、より高い電圧を必要とするので、周波数のパワースケールは立方:^1
直接周波数から、および^2
電圧から。(コンデンサに蓄積されたエネルギーはV ^ 2に比例し、漏れ電流を超えるほとんどの動的電力は、FETゲート+ワイヤの容量性負荷への電荷のポンピングによるものです。)
パフォーマンス= IPCの頻度。(同じアーキテクチャ内で。より広いSIMDでは、より少ない命令で同じ作業を行うことができます。一部のISAは他のISAよりも密度が高くなります。
コストは、ダイ領域(製造コスト)および/または電力(冷却が難しいため間接的に周波数を制限する)にあります。また、特にモバイル(バッテリー)およびサーバー(電力密度/冷却コスト/電力コスト)の場合、ワットあたりの電力とパフォーマンスの低下自体が目標です。
ソケットごとのマルチコアが問題になる前は、製造可能な単一のCPUで達成可能なスループットよりも高いスループットが必要なハイエンドユースケース向けのマルチソケットシステムがあり、それが唯一のSMPシステムでした。(サーバー、ハイエンドワークステーション)。
単一のコアが希望どおりに効率的に拡張できる場合、ソケットごとに1つの物理コアを持つシステムがあります。 、複数の論理コアとして機能するSMT(ハイパースレッディングなど)を。 典型的なデスクトップ/ラップトップには物理コアが1つしかなく、より多くのコアで線形にスケーリングしないものを並列化するのに苦労しません。たとえばmake -j4
、マルチソケットサーバーを活用したり、デスクトップでI / Oレイテンシを隠したりします。(または、パイプラインの幅が簡単にスケーリングされたがIPCがそうでなかった場合、まだ多くの並列化を試みるかもしれません。そのため、より多くのSMTスレッドを使用する必要がありました。) OSへのSMTの提示は非常に異なっていたため、そこでは並列スケジューリングアルゴリズムとロックが必要になります。
ドナルド・クヌースは2008年のインタビューでこう語った
マルチコアアーキテクチャへの現在の傾向に個人的に不満があることについても、少し炎上するかもしれません。私には、ハードウェア設計者がアイデアを使い果たしてしまったように見え、ムーアの法則の将来の終forの責任をソフトウェア作家に渡そうとしているように見えますが、少数のマシンでのみ高速に動作するマシンを提供することで重要なベンチマーク!
はい、8倍のスループットの奇跡的なシングルコアCPUがあれば 実際のプログラム、おそらくそれらを使用しているでしょう。デュアルソケットシステムでは、スループットを高めるために多くを支払う価値があった場合にのみ(シングルスレッドパフォーマンスではありません)。
複数のCPUを使用すると、複数のプログラムを高速で切り替えるのではなく、実際に並列に実行できるため、コンテキスト切り替えのコストが削減されます このようなCPUが必要とする大規模な異常な機械を中断するプリエンプティブマルチタスクは、おそらく現在よりもさらに痛いでしょう。
物理的にはシングルコア(コア間の相互接続のない単純なキャッシュ階層の場合)ですが、SMT(Intelのハイパースレッディングなど)をサポートするため、ソフトウェアはスループットリソースを動的に競合する8つの論理コアとして使用できます。または、1つのスレッドのみが実行されている/ストールされていない場合、完全なメリットが得られます。
そのため、実際に簡単で自然な場合(たとえば、個別のプロセスを一度に実行する場合)、またはこの獣のIPCを使い果たすことを妨げる依存関係チェーンで簡単に並列化できる場合は、複数のスレッドを使用します。
しかし、残念なことに、マルチコアCPUはこの時点で停止するというKnuth側の希望的観測です。
シングルスレッドパフォーマンススケーリング
8コアCPUと同等の1コアを作成した場合、1コアでIPCが800%増加するため、複数のコアに最適化されたプログラムだけでなく、すべてのプログラムで完全なパフォーマンスが得られると思います。
はい、そうです。 そのようなCPUをまったく構築することができれば、それは非常に驚くべきことです。しかし、私はそれが文字通りだと思います、同じ半導体製造プロセスでは不可能ます(つまり、トランジスタの品質/効率は同じです)。8コアCPUと同じ電力バジェットとダイ領域では、コアを結合するためのロジックを節約し、コアごとのプライベートキャッシュにそれほど多くのスペースを必要としませんが、確かに不可能です。
周波数の増加を許可したとしても(実際の基準は1秒あたりの動作であり、1クロックあたりの動作ではないため)、CPUを2倍高速化することは大きな課題です。
同じ電力とダイ領域の予算(製造コスト)に近い場所でそのようなCPUを構築することが可能である場合、はいCPUベンダーはすでにそのように構築しています。
具体的には、より多くのコアまたはより広いコアですか?セクション、この答えを理解するために必要な背景について; 順番に並べられたパイプライン化されたCPUの動作から始まり、スーパースカラー(クロックごとに複数の命令)になります。次に、P4時代にパワーウォールに到達し、簡単な周波数スケーリングの終わりに至り、ほとんどIPCのみを残し、より小さなトランジスタでも、命令(SIMDなど)ごとに多くの作業を行う方法について説明します。
パイプラインを広くする(クロックあたりの最大命令数)と、通常、コストはwidth-squaredに比例します。そのコストは、より広い並列依存関係チェック(ハザード検出)および実行する準備ができた命令を見つけるためのより広い順序外スケジューラーのために、ダイ領域および/または電力で測定されます。また、以外の命令を実行する場合は、レジスタファイルとキャッシュの読み取り/書き込みポートを増やしてくださいnop
。特に、FMAやキャリー付き加算(2レジスタ+フラグ)などの3入力命令がある場合。
また、CPUをより広くするためのIPCリターンが減少しています。ほとんどのワークロードでは、CPUが活用する小規模/短距離ILP(命令レベルの並列処理)が制限されているため、IPCが既に幅の制限に制限されている場合、コアを広くしても IPC(クロックあたりの命令)は増加しません依存関係チェーン、ブランチミス、キャッシュミス、またはその他のストールによるコア。独立した反復で展開されたループでスピードアップが得られることは確かですが、ほとんどのコードがほとんどの時間を費やしているわけではありません。比較/分岐命令は、「典型的な」コードであるIIRCの命令ミックスの20%を構成します。(私はさまざまなデータセットの15〜25%の数値を読んだと思います。)
また、依存するすべての命令(およびROB容量に達するとすべてのもの)がストールするキャッシュミスは、CPUが広いほどコストが高くなります。(より多くの実行ユニットをアイドル状態にする機会費用。より多くの潜在的な作業が完了しない。)または、分岐ミスも同様にバブルを引き起こします。
IPCを8倍にするためには、分岐予測の精度とキャッシュヒット率を少なくとも8倍改善する必要があります。ただし、キャッシュヒット率は、ほとんどのワークロードで特定のポイントを超えるキャッシュ容量にうまく対応できません。そして、HWプリフェッチは、スマートですが、することができないというスマート。また、IPCの8倍では、分岐予測子はサイクルごとに8倍の予測を生成し、より正確にする必要があります。
順不同の実行CPUを構築する現在の手法では、短距離でのみILPを見つけることができます。たとえば、SkylakeのROBサイズは224融合ドメインuopであり、実行されていないuopのスケジューラは97非融合ドメインです。参照長さを増大させるために、二つの長依存鎖でループ上LFENCEの影響を理解する彼らが得る場合、スケジューラサイズは、命令の2本の長い鎖からILPを抽出する際の制限要因である場合のためにあまりにも長いです。および/またはこのより一般的で入門的な回答を参照してください)。
したがって、2つの別々の長いループ間でILPを見つけることは、ハードウェアでできることではありません。ループフュージョンの動的なバイナリ再コンパイルが可能な場合もありますが、Transmeta Crusoeルートに行かない限り、CPUが実際に実行できることは難しく、ハードではありません。(異なる内部ISA上のx86エミュレーション層。この場合はVLIW)。しかし、uopキャッシュと強力なデコーダーを備えた標準的な最新のx86設計は、ほとんどのコードに勝るものはありません。
また、x86以外では、まだ使用されているすべてのISAは比較的簡単にデコードできるため、長距離の最適化以外に動的再コンパイルの動機はありません。 TL:DR:より多くのILPをハードウェアに公開できるマジックコンパイラを期待しても、Itanium IA-64ではうまくいきませんでした。また、実行のシリアルモデルを備えた既存のISAのスーパーワイドCPUでは動作しません。
超ワイドCPUを使用していた場合は、SMTをサポートして、複数の低ILPスレッドを実行することで実行する作業を維持できるようにする必要があります。
Skylakeの幅は現在4 uopsである(そして、クロックあたり2〜3 uopsの実際のIPC、またはハイスループットコードで4に近い)ので、8倍の仮想CPUは32幅になります!
それを動的に切り替わる8個または16個の論理CPUに戻すことができるそれらを実行リソース共有ことができれば素晴らしいです。ストールされていないスレッドはすべてのフロントエンド帯域幅とバックエンドスループットを取得します。
ただし、8つの独立したコアを使用すると、スレッドがストールした場合、実行ユニットにフィードを保持することはできません。他のスレッドにはメリットがありません。
多くの場合、実行はバースト的です。キャッシュミスのロードを待機して停止し、一度到着すると、多数の命令が並行してその結果を使用できます。超ワイドCPUを使用すると、そのバーストはより高速になり、実際にSMTに役立ちます。
しかし、魔法のような超ワイドなCPUを持つことはできません
そのため、スループットを得るために、スレッドレベルの並列処理という形で並列処理をハードウェアに公開する必要があります。一般に、コンパイラは、非常に大きなループのような単純な場合を除いて、いつ/どのようにスレッドを使用するかを知るのに優れていません。(OpenMP、またはgccの-ftree-parallelize-loops
)。スレッド間の通信は高価であり、スレッドの起動も同様であるため、有用な作業を効率的に並列に実行するには、コードを修正するのに人間の賢さが必要です。
TLPは、HWが活用できる実行の単一スレッド内の細粒度ILPとは異なり、粗粒度並列処理です。
対話型のワークロード(Intel / AMD x86、Apple / ARM AArch64ハイエンドコアなど)を対象としたCPU は、IPCスケーリングの利益の減少を確実に推進します。超並列問題。
ゲームの8つのコピーをそれぞれ15fpsで並行して実行できることは、45fpsで1つのコピーを実行できることよりもはるかに価値がありません。CPUベンダーはこれを知っているので、最新のCPUはかなりの電力とダイ領域を必要としますが、アウトオブオーダー実行を使用します。(ただし、GPUは、ワークロードが既に超並列であるため、そうではありません)。
IntelのメニーコアXeon Phiハードウェア(Knight's Landing / Knight's Mill)は興味深い中間点です:非常に限られたアウトオブオーダー実行とSMTにより、2ワイドコアにAVX512 SIMD命令を供給して数値を処理します。コアは、Intelの低電力Silvermontアーキテクチャに基づいています。(アウトオブオーダーexecですが、小さなコアのSandybridgeファミリーよりもはるかに小さい小さな並べ替えウィンドウがあります。パイプラインが狭くなっています。)
ところで、これはすべてSIMDに直交しています。問題が発生する可能性がある場合は、命令ごとにより多くの作業を行うことが常に役立ちます。
価格モデル
ソフトウェア価格モデルは、現在のハードウェアの状況に基づいています。
マルチコアCPUの登場により、コアごとのライセンスモデルがより普及しました(シングルソケットデスクトップにも関連するようになりました)。それ以前は、サーバーと大きなワークステーションにのみ関連していました。
ソフトウェアが最高速度で実行するために複数のコアを必要としなかった場合、弱いCPUで実行するため、それほど利益を得ていない人々に安く販売する方法はありません。ソフトウェア/ハードウェアエコシステムが「SMTチャネル」の制御を進化させて、その論理コアで実行されるコードの最大実行幅を構成できるのでない限り。(CPUが複数の独立したコアではなくパイプライン幅でスケーリングする世界を想像してください。)