インテルがプロセッサーの内部RISCコアを隠すのはなぜですか?


89

Pentium Pro(P6マイクロアーキテクチャ)から、Intelはマイクロプロセッサを再設計し、古いCISC命令の下で内部RISCコアを使用しました。Pentium Pro以降、すべてのCISC命令は小さな部分(uops)に分割され、RISCコアによって実行されます。

当初、Intelが新しい内部アーキテクチャを非表示にし、プログラマに「CISCシェル」の使用を強制することを決定したことは明らかでした。この決定のおかげで、Intelは互換性を損なうことなくマイクロプロセッサアーキテクチャを完全に再設計することができました。それは合理的です。

しかし、私は1つのことを理解していません。なぜ、Intelは内部RISC命令セットを何年も隠しているのですか?古いx86CISC命令セットを使用するように、プログラマーにRISC命令を使用させないのはなぜですか?

Intelが下位互換性を長期間維持している場合(64ビットモードの隣に仮想8086モードがまだあります)、CISC命令をバイパスして、RISCコアを直接使用するようにプログラムをコンパイルできないのはなぜですか?これにより、x86命令セットをゆっくりと放棄する自然な方法が開かれますが、これは最近非推奨になっています(これが、Intelが内部でRISCコアを使用することを決定した主な理由ですよね?)。

新しいIntelの「Corei」シリーズを見ると、AVX、SSE4などを追加したCISC命令セットのみが拡張されていることがわかります。


回答:


90

いいえ、x86命令セットは確かに非推奨ではありません。相変わらず人気があります。IntelがRISCのようなマイクロ命令のセットを内部で使用する理由は、それらをより効率的に処理できるためです。

したがって、x86 CPUは、フロントエンドに非常に頑丈なデコーダーを搭載することで機能します。このデコーダーは、x86命令を受け入れ、バックエンドが処理できる最適化された内部形式に変換します。

このフォーマットを「外部」プログラムに公開することに関しては、2つのポイントがあります。

  • 安定したフォーマットではありません。Intelは、特定のアーキテクチャに最適になるようにCPUモデル間で変更できます。これにより、効率を最大化することができ、内部使用と外部使用の両方で固定された安定した命令フォーマットを決定する必要がある場合、この利点は失われます。
  • それをすることによって得られるものは何もありません。今日の巨大で複雑なCPUでは、デコーダーはCPUの比較的小さな部分です。x86命令をデコードする必要があると、それはより複雑になりますが、CPUの残りの部分は影響を受けないため、特に「レガシー」コードを実行するためにx86フロントエンドがまだ存在している必要があるため、全体として得られるものはほとんどありません。 。したがって、x86フロントエンドで現在使用されているトランジスタを保存することすらできません。

これは完全な配置ではありませんが、コストはかなり小さく、2つの完全に異なる命令セットをサポートするようにCPUを設計するよりもはるかに優れた選択肢です。(その場合、CPUの内部アーキテクチャに最適になるように自由に調整できるという理由だけで、内部使用のために3番目のマイクロオペレーションのセットを発明することになります)


1
良い点。RISCは優れたコアアーキテクチャであり、GOODは実行速度が速く、正しく実装できることを意味します。CISCアーキテクチャの歴史を持つx86 ISAは、膨大な歴史と豊富なバイナリソフトウェアを備えた命令セットレイアウトです。 、およびストレージと処理に効率的です。これはCISCシェルではなく、業界のデファクトスタンダードであるISAです。
ウォーレンP

2
@ウォーレン:最後の部分では、私は実際にはそうは思いません。うまく設計されたCISC命令セットは、はい、保管の面でより効率的ですが、私が見てきたいくつかのテストから、「平均的な」x86命令は、4.3のようなものである、バイト幅より、それは一般的になるだろうよりも、 RISCアーキテクチャ。x86は、何年にもわたって無計画に設計および拡張されてきたため、ストレージ効率が大幅に低下します。しかし、あなたが言うように、その主な強みは、歴史と既存のバイナリコードの膨大な量です。
jalf 2011

1
「うまく設計されたCISC」ではなく、「巨大な歴史」だとは言いませんでした。GOODパーツはRISCチップ設計パーツです。
ウォーレンP

2
@ jalf-実際のバイナリを調べると、x86の命令サイズはそれぞれ平均で約3バイトです。もちろん、はるかに長い指示がありますが、実際の使用では小さいものが支配的である傾向があります。
2011

1
平均命令長はコード密度の良い尺度ではありません。一般的なコードで最も一般的なタイプのx86命令は、ロードとストアです(データを処理できる場所に移動し、メモリに戻すだけです。RISCプロセッサとCISCの約1/2レジスタがたくさんあるので、これほど多くのことを行う必要はありません。また、1つの命令でどれだけのことができるか(arm命令は約3つのことを実行できます)
ctrl-alt-delor 2016年

20

本当の答えは簡単です。

RISCプロセッサの実装の背後にある主な要因は、複雑さを軽減し、速度を上げることでした。RISCの欠点は、命令密度が低下することです。つまり、RISCのような形式で表現された同じコードには、同等のCISCコードよりも多くの命令が必要です。

この副作用は、CPUがメモリと同じ速度で実行されている場合、または少なくとも両方が適度に類似した速度で実行されている場合は、あまり意味がありません。

現在、CPU速度と比較したメモリ速度はクロックに大きな違いを示しています。現在のCPUは、メインメモリよりも5倍以上高速な場合があります。

このテクノロジーの状態は、CISCが提供するより高密度のコードを優先します。

キャッシュはRISCCPUを高速化する可能性があると主張できます。しかし、CISCCPUについても同じことが言えます。

同じサイズのキャッシュはCISCが提供する高密度コードにより大きな影響を与えるため、CISCとキャッシュを使用すると、RISCとキャッシュよりも速度が大幅に向上します。

もう1つの副作用は、コンパイラの実装でRISCが難しくなることです。CISCCPU用にコンパイラを最適化する方が簡単です。等

Intelは彼らが何をしているのか知っています。

これは非常に真実であるため、ARMにはThumbと呼ばれるより高いコード密度モードがあります。


1
また、内部RISCコアにより、CISCCPUのトランジスタ数が削減されます。すべてのCISC命令を配線する代わりに、マイクロコードを使用してそれらを実行できます。これにより、RISCマイクロコード命令をさまざまなCISC命令に再利用できるため、使用するダイ領域が少なくなります。
シル2017

16

Intelが下位互換性を長期間維持している場合(64ビットモードの隣に仮想8086モードがまだあります)、CISC命令をバイパスして、RISCコアを直接使用するようにプログラムをコンパイルできないのはなぜですか?これにより、x86命令セットをゆっくりと放棄する自然な方法が開かれますが、これは最近非推奨になっています(これが、Intelが内部でRISCコアを使用することを決定した主な理由ですよね?)。

あなたはこれのビジネスの角度を見る必要があります。Intelは実際にx86から​​離れようとしましたが、会社にとって金の卵を産むのはガチョウです。XScaleとItaniumは、コアとなるx86ビジネスの成功レベルに​​さえ近づくことはありませんでした。

あなたが基本的に求めているのは、開発者からの暖かいファジーと引き換えに、Intelが手首を切り裂くことです。x86を弱体化させることは彼らの利益にはなりません。より多くの開発者がx86をターゲットにすることを選択する必要がなくなるものはすべて、x86を弱体化させます。それは、順番に、彼らを弱体化させます。


6
はい、Intelがこれを行おうとしたとき(Itanium)、市場は肩をすくめるだけで応答しました。
ウォーレンP

Itaniumが失敗したときは、新しいアーキテクチャであるという理由だけでなく、さまざまな要因があったことに注意してください。たとえば、CPUスケジューリングを、実際には目標を達成しなかったコンパイラにオフロードします。Itaniumがx86CPUよりも10倍または100倍高速だったとしたら、ホットケーキのように売れていたでしょう。しかし、それは速くはありませんでした。
KatasticVoyage18年

5

答えは簡単です。Intelは開発者向けのCPUを開発していません!彼らは購入を決定する人々のためにそれらを開発しています、ところで、それは世界中のすべての会社がしていることです!

Intelはずっと前に、(当然のことながら)CPUの下位互換性を維持することを約束しました。人々は、新しいIntelベースのコンピューターを購入すると、現在のすべてのソフトウェアが古いコンピューターとまったく同じように実行されることを知りたがっています。(ただし、うまくいけば、より速くなります!)

さらに、Intelは、かつては別の方法を試みたため、そのコミットメントがいかに重要であるかを正確に知っています。Itanium CPUで正確に何人の人知っていますか?!?

気に入らないかもしれませんが、x86を使い続けるという1つの決定が、Intelを世界で最も有名なビジネス名の1つにした理由です。


2
私は、Intelプロセッサが開発者に優しいものではないというほのめかしに同意しません。PowerPCとx86を長年プログラミングしてきた私は、CISCの方がはるかにプログラマーに優しいと信じるようになりました。(私は現在インテルで働いていますが、採用される前にこの問題について決心しました。)
ジェフ

1
@Jeffそれは私の意図ではありませんでした!問題は、開発者が使用できるようにIntelがRISC命令セットを開かなかった理由です。x86が開発者にやさしくないことについては何も言いませんでした。私が言ったのは、このような決定は開発者を念頭に置いて決定さたのではなく、厳密にビジネス上の決定であったということでした。
geo 2015年

5

@jalfの回答はほとんどの理由をカバーしていますが、言及されていない興味深い詳細が1つあります。内部RISCのようなコアは、ARM / PPC / MIPSのような命令セットを実行するように設計されていません。x86-taxは、電力を大量に消費するデコーダーで支払われるだけでなく、コア全体である程度支払われます。つまり、x86命令のエンコーディングだけではありません。それは奇妙なセマンティクスを持つすべての命令です。

Intelが、命令ストリームがx86以外のものであり、命令がuopsに直接マップされる動作モードを作成したとしましょう。また、各CPUモデルにこのモード用の独自のISAがあると仮定して、必要に応じて内部を自由に変更し、この代替形式の命令デコード用に最小限のトランジスタでそれらを公開します。

おそらく、x86アーキテクチャー状態にマップされたレジスターの数は同じであるため、x86 OSは、CPU固有の命令セットを使用せずに、コンテキストスイッチにレジスターを保存/復元できます。しかし、その実際的な制限を捨てれば、マイクロコード1用に通常予約されている非表示の一時レジスターを使用できるため、さらにいくつかのレジスターを持つことができます。


後のパイプラインステージ(実行ユニット)に変更を加えずに代替デコーダーがある場合でもこのISAには多くのx86偏心があります。 それはあまり良いRISCアーキテクチャではないでしょう。単一の命令が非常に複雑になることはありませんが、x86の他の狂気のいくつかはまだそこにあります。

例:シフトカウントが1でない限り、左/右シフトはオーバーフローフラグを未定義のままにします。1の場合、OF =通常の符号付きオーバーフロー検出です。回転のための同様の狂気。ただし、公開されたRISC命令は、フラグのないシフトなどを提供する可能性があります(通常、複雑なx86命令に含まれる複数のuopのうち1つまたは2つだけを使用できます)。したがって、これは主な反論として実際には持ちこたえられません。

RISC ISA用のまったく新しいデコーダーを作成する場合は、RISC命令として公開するx86命令の一部を選択して選択することができます。これにより、コアのx86特殊化がいくらか軽減されます。


単一のuopsは大量のデータを保持できるため、命令のエンコードはおそらく固定サイズではありません。すべてのinsnが同じサイズである場合、意味をなすよりもはるかに多くのデータ。単一のマイクロフューズドuopは、2つのレジスタと32ビットのディスプレイスメントを備えたアドレッシングモードを使用する32ビットのイミディエートとメモリオペランドを追加できます。(SnB以降では、単一レジスタのアドレッシングモードのみがALU演算とマイクロヒューズできます)。

uopsは非常に大きく、固定幅のARM命令とはあまり似ていません。固定幅の32ビット命令セットは一度に16ビットのイミディエートしかロードできないため、32ビットアドレスをロードするには、load-immediate low-half / loadhigh-immediateペアが必要です。x86はそれを行う必要はありません。これは、15個のGPレジスタだけで、レジスタ内の定数を維持する機能を制限することで、ひどいことをしないようにするのに役立ちます。(15は7レジスタよりも大きな助けになりますが、再び31に倍増すると、はるかに少なくなります。シミュレーションが見つかったと思います。RSPは通常汎用ではないため、15 GPレジスタとスタックに似ています。)


TL; DRの概要:

とにかく、この答えは「x86命令セットは、x86命令を迅速に実行できなければならないCPUをプログラムするためのおそらく最良の方法です」に要約されますが、うまくいけば、理由にいくつかの光を当てます。


フロントエンドとバックエンドの内部uop形式

フロントエンドとバックエンドのuop形式がIntelCPUで表すことができる違いの1つのケースについては、マイクロフュージョンモードとアドレッシングモードも参照してください。

脚注1:マイクロコードによって一時的に使用するための「隠された」レジスタがいくつかあります。これらのレジスタは、x86アーキテクチャレジスタと同じように名前が変更されるため、multi-uop命令が順不同で実行される可能性があります。

たとえばxchg eax, ecx、IntelCPUでは3uopsとしてデコードされ(なぜ?)、これらはMOVのようなuopsであると推測されますtmp = eax; ecx=eax ; eax=tmp;。この順序で、dst-> src方向のレイテンシーを約1サイクルで測定するのに対し、他の方法では2サイクルです。そして、これらの移動uopsは、通常のmov指示とは異なります。それらは、ゼロレイテンシのmov-eliminationの候補ではないようです。

PRFサイズを実験的に測定しようとすること、および非表示レジスタを含むアーキテクチャ状態を保持するために使用される物理レジスタを考慮する必要があることについては、http://blog.stuffedcow.net/2013/05/measuring-rob-capacity/も参照してください。

デコーダーの後のフロントエンドで、レジスターの名前を物理レジスターファイルに変更する発行/名前変更段階の前に、内部uop形式はx86 reg番号と同様のレジスター番号を使用しますが、これらの非表示レジスターをアドレス指定する余地があります。

uop形式は、アウトオブオーダーコア(ROBおよびRS)、別名バックエンド(発行/名前変更段階の後)内では多少異なります。int / FP物理レジスタファイルにはそれぞれHaswell168のエントリがあるため、uopの各レジスタフィールドは、その数に対応するのに十分な幅が必要です。

名前変更はHWにあるので、静的にスケジュールされた命令をバックエンドに直接供給するのではなく、おそらくそれを使用する方がよいでしょう。したがって、x86アーキテクチャレジスタと一時的なマイクロコードと同じ大きさのレジスタのセットを使用することができます。

バックエンドは、WAW / WARの危険を回避するフロントエンドの名前変更機能と連携するように設計されているため、必要な場合でも、インオーダーCPUのように使用することはできませんでした。これらの依存関係を検出するためのインターロックはありません。それはissue / renameによって処理されます。

問題/名前の変更段階のボトルネックなしにバックエンドにuopsをフィードできれば、それは素晴らしいことかもしれません(たとえば、Skylakeの4ワイドvs.4 ALU +2ロード+1ストアポートの最新のIntelパイプラインの最も狭いポイントバックエンド)。しかし、そうすると、レジスタの再利用を回避するためにコードを静的にスケジュールして、キャッシュミスによって負荷が長時間停止した場合でも必要な結果を踏むことができないと思います。

したがって、uopsを発行/名前変更ステージにフィードする必要があります。おそらく、uopキャッシュやIDQではなく、デコードをバイパスするだけです。次に、正常なハザード検出を備えた通常のOoOexecを取得します。レジスタ割り当てテーブルは、16 +いくつかの整数レジスタの名前を168エントリの整数PRFに変更するように設計されています。HWがより多くの論理レジスタのセットを同じ数の物理レジスタに名前変更することは期待できませんでした。それはより大きなRATを必要とします。


-3

CISC命令をバイパスし、RISCコアを直接使用するように、プログラムのコンパイルを許可しないのはなぜですか?

以前の回答に加えて、別の理由は市場の細分化です。一部の命令はハードウェアではなくマイクロコードで実装されると考えられているため、誰でも任意のマイクロ操作を実行できるようにすると、「新しい」よりパフォーマンスの高いCISC命令で新しいCPUの販売が損なわれる可能性があります。


1
これは意味がないと思います。RISCはマイクロコードを使用できます。特に、RISCデコーダーをx86フロントエンドに追加するだけの場合はそうです。
ピーターコーデス2016年

2
それはまだ間違っています。AESの新しい命令(および今後のSHA命令)、およびPCLMULQDQのような他のものには、専用のハードウェアがあります。Haswellでは、AESENCは単一のuopagner.org/optimize)にデコードするため、マイクロコード化されていないことは間違いありません。(デコーダーは、4 uopsを超えるデコードを行う命令に対してのみマイクロコードROMシーケンサーをアクティブ化する必要があります。)
Peter Cordes

1
一部の新しい命令は、x86命令では使用できない方法で既存の機能を使用するだけです。良い例はBMI2SHLXですあなたはCLでのカウントを入れずに、余分なのuopを招くことなく、可変数のシフトを行うことができますので、シフト・カウントがゼロの場合のフラグが修正されていない(安っぽいx86のフラグのセマンティクスを処理するために必要SHL r/m32, clがありますFLAGSへの入力依存性であり、Skylakeでは3 uopにデコードされます。ただし、Agner Fogのテストによると、Core2 / Nehalemでは1uopにすぎませんでした。)
Peter Cordes

コメントしてくださってありがとうございます。
KOLANICH 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.