サイクルごとの高い命令と高いクロック速度の両方を使用できないのはなぜですか?


37

Megahertz Mythは、PCのINTEL 8086プロセッサーとAppleのRockwell 6502プロセッサーの違いにより、宣伝用の戦術になりました。8086は4.77MHzで動作し、6502は1MHzで動作しました。ただし、6502での指示に必要なサイクルは少なくなりました。実際、それよりもはるかに少ないため、8086よりも高速に 実行されました。一部の命令で必要なサイクルが少ないのはなぜですか?そして、なぜ少ないサイクルを必要とする6502の命令を8086の高速サイクリングプロセッサと組み合わせることができないのでしょうか?

サイクルごとの指示(IPC)に関するWikipediaの記事によると

IPCを管理する要因
1秒あたりの一定レベルの命令は、高いIPCと低いクロック速度で、または低いIPCと高いクロック速度で実現できます。

サイクルごとの高い命令と高いクロック速度の両方を使用できないのはなぜですか?

たぶんこれはクロックサイクルと関係があるのでしょうか?ウィキペディアは回路の同期について言及していますか?それが何を意味するのか分かりません。

それとも、これはパイプラインの仕組みに関係しているのでしょうか?短いパイプラインの命令が長いパイプラインの命令と異なる理由はわかりません。

どんな洞察も素晴らしいでしょう!神話の背後にあるアーキテクチャを理解しようとしています。ありがとう!

参照:

サイクルごとの指示とサイクル数の増加

http://en.wikipedia.org/wiki/Instructions_per_cycle

http://en.wikipedia.org/wiki/Clock_cycle


1
>一部の命令で必要なサイクルが少ないのはなぜですか? RISC / CISC(まあ、ちょっと)。 そして、なぜ少ないサイクルを必要とする6502の命令を8086の高速サイクリングプロセッサと組み合わせることができないのでしょうか? 彼らは持つことができます。問題は、いったんベースを確立すると、すべてを捨てて次のモデルを最初から始めるのが難しいことです。
Synetech

@Synetech、インテルはちょっとみかんの変換、その後、プログラマにCISC命令セットを提示することによってそれをしたことRISCierチップ上の命令に
soandos

さて、2つが結合されたと言ったとき、私はまったく異なるチップメーカーを意味していました。私は手元にリストを持っていませんが、そのようなことをした他の人(非Intel / AMD)がいました。(ほとんどの人は、IntelとAMDがデスクトップ市場を支配しているため、多くのチップメーカーがあることを忘れています。)
Synetech

回答:


21

tl; dr

パイプラインが短いほど、クロック速度は速くなりますが、スループットが低下する場合があります。また、下部の回答#2と3を参照してください(これらは短く、約束します)。

長いバージョン:

ここで考慮すべきことがいくつかあります。

  1. すべての指示に同じ時間がかかるわけではありません
  2. すべての命令がすぐに実行された(または10から20)命令に依存するわけではない

非常に単純化されたパイプライン(最新のIntelチップで発生することは複雑を超えています)には、いくつかの段階があります。

フェッチ->デコード->メモリアクセス->実行->ライトバック->プログラムカウンターの更新

それぞれに->発生する時間コストがあります。さらに、ティック(クロックサイクル)ごとに、すべてが1つのステージから次のステージに移動するため、最も遅いステージがすべてのステージの速度になります(実際には、それらの長さが可能な限り同じになります)。

5つの命令があり、それらを実行したいとします(ウィキペディアからの写真、ここではPCの更新は行われていません)。次のようになります。

ここに画像の説明を入力してください

各命令が完了するまでに5クロックサイクルかかりますが、完了した命令はサイクルごとにパイプラインから出てきます。各ステージにかかる時間が40 nsで、中間ビットに15 ns(上記の6ステージパイプラインを使用)の場合、最初の命令を取り出すには40 * 6 + 5 * 15 = 315 nsかかります。

対照的に、パイプラインを完全に削除する場合(ただし、他のすべてを同じに保つ場合)、最初の命令を出すのにたった240 nsしかかかりません。(この「最初の」命令を取り出す速度の差はレイテンシと呼ばれます。一般に、スループット(1秒あたりの命令数)よりも重要度は低くなります)。

しかし、実際の違いは、パイプライン化された例では、60 nsごとに(最初のインストルメントの後に)新しいインストルメントが実行されることです。パイプライン化されていないものでは、毎回240かかります。これは、パイプラインがスループットの向上に優れていることを示しています。

さらに一歩進んで、メモリアクセスの段階では、(アドレスの計算を行うために)追加ユニットが必要になるようです。つまり、そのサイクルのmemステージを使用しない命令があれば、別の追加を行うことができます。したがって、1つのティックで1つのプロセッサで2つの実行ステージ(1つはメモリアクセスステージにあります)を実行できます(スケジュールは悪夢ですが、そこには行きません。さらに、PC更新ステージにも追加ユニットが必要です。ジャンプの場合、1ティックで3つの追加実行状態を実行できます)。パイプラインを持つことにより、2つ(またはそれ以上)の命令が異なるステージ(またはleapfogステージなど)を使用できるように設計でき、貴重な時間を節約できます。

これを行うために、プロセッサは多くの「魔法」を実行することに注意してください(順不同の実行分岐予測など)。しかし、これにより、パイプラインがない場合よりも複数の命令を高速に出すことができます。長い管理は非常に難しく、ステージ間で待機するだけでコストが高くなります)。逆に、パイプラインを長くしすぎると、異常なクロック速度を得ることができますが、元の利点の多くを失うことがあります(複数の場所に存在し、同時に使用できる同じタイプのロジックを持つこと) )。

回答#2:

SIMD(単一命令複数データ)プロセッサ(ほとんどのGPUと同様)は、多くの情報ビットに対して多くの作業を行いますが、処理に時間がかかります。すべての値の読み込みには時間がかかります(ある程度広いバスを使用することでこのオフセットは相殺されますが、クロックが遅くなります)が、一度により多くの命令を実行できます(サイクルあたりのより効果的な命令)。

回答#3:

サイクルカウントを人為的に「チート」して、サイクルごとに2つの命令を実行できるようにするためです(クロック速度を半分にするだけです)。1クロックではなく2ティックごとに何かを行うことも可能です(2倍のクロック速度を与えますが、命令を1秒ごとに変更することはできません)。


3
短いパイプラインは遅いクロック速度を意味します!Pentium 4は長いパイプラインのために高クロックを備えていました。WPは次のとおりです。「NetBurstはP6(Pentium III、IIなど)とは異なり、非常に深い命令パイプラインを特徴として非常に高いクロック速度を実現します。」ポイントは、高速化を達成するためにステージごとにほとんど何もしないことです。しかし、これは実行可能ではなかったため、IntelはこれによりAMDに大きな勢いを失いました。彼らはPentium 3アーキテクチャに戻り、「コア」を思いつきました。
-stolsvik

@stolsvik、これを説明できますか?それは私には意味がありません(インタースティシャルステージが少ないと、他のすべてが等しくなり、クロックサイクルが短くなり、クロック速度が速くなります)
-soandos

4
クロックサイクルごとに1つのパイプラインステージが実行されます。パイプライン全体が1クロックごとに1ステップ進みます-下部で新しい命令をフェッチし、上部で完成した命令を「発行」します。したがって、Pentium4のアイデアは、非常に小さなステップを作成することでした。このステップは実行が速く、高いクロックを与えますが、長いパイプラインを必要とします。パイプライン(すべてのプロセッサが1つを使用)の手がかりは、進行中の複数の命令がいつでも処理されることです。長いパイプラインは、多くの命令が進行中であることを意味します-分岐予測が失敗した場合、パイプ全体をフラッシュする必要があります。
stolsvik

答え#2の場合、CPUはキャッシュを介してのみデータにアクセスします(メモリアクセスは通常、命令の観点からは透過的です)。クロック周波数を遅くしても、データがRAMから取得されるまでの時間には影響しません(キャッシュにない場合)。また、バス幅は、オペランドのサイズに関連するSIMD操作の速度にのみ影響します(つまり、64ビットバスに8つの8ビットオペランドを一度にロードできますが、8つの64ビット値を手動でロードする必要があります64ビットのオペランドがある場合)。
ブレークスルー

2
また、答え#1について、「サイクルを実行するmemステージを使用しない命令があれば、別の追加を行うことができます」と言うと、これはfalseです。順不同の実行は、マイクロオペレーションレベルではなく、命令レベルで適用されます。パイプラインで命令を2回実行する必要がある場合、パイプラインにバブルが発生します。最後に、x86アーキテクチャには、メモリの読み取り/書き込み中にオンザフライでメモリアドレスを計算するための別個のALUがあります([EBX+ECX*4+100]スタイルアドレス指定が可能です)。
ブレークスルー

8

私はこれを非常に単純化しすぎていますが、覚えておくべき重要な点は、これらの用語はリンゴとオレンジを比較しているということです。「サイクル」は、「秒」が時間の統一された測定値であるように、すべてのプロセッサーで同じ単一の統一された測定単位ではありません。代わりに、サイクルは特定の作業単位を表します。これは、いくぶんarbitrarily意的に定義されますが、パイプライン設計の複雑さ、そしてもちろん物理学によって制限されます。

多くの場合、1サイクルで多くの作業を行うと、パイプライン全体をクリアできます。成功した場合、これは次のサイクルが最適化されないことを意味します。パイプラインを再度充填する必要があり、時間がかかることがあるためです。

サイクルごとに1つのRISC命令の1つのステージを処理する非常に単純なプロセッサを設計できました。これが私のCPUの基礎である場合、「aサイクル"。

詳細は、私があまり理解していない多くの物理学と電気工学に入りますが、クロックレートは、単純に入力電圧をプロセッサに追加して最高のものを期待するだけでは達成できないことを思い出してください。少なくとも、熱プロファイルは別の必要な懸念事項です。


これは本当に彼の質問に答えません(なぜ物事がスピードアップできないのかは関係ありません)。彼は、より多くのサイクルを常に求めています!=常により多くの作業
soandos

ただし、この回答は、他の回答では見られなかった問題、つまり、より少ないクロックサイクルで操作を完了する特定の命令セットを含めること、および最も遅い命令セットに基づいてクロックサイクルを測定する機能について説明しています。それほど効率的ではありません。(私は非常に間違っている可能性があります...私は建築が魅力的であると思いますが、私は決して自分を専門家とは考えません)
スティーブンR

5

これは非常に単純な(おそらく非常に単純化された)説明です。特定の仕事があり、32ビットの数値を2つ追加するとします。2つのアプローチを使用できます。非常に多数の非常に小さなステップに分割することも、少数の非常に大きなステップに分割することもできます。

たとえば、「2つの数字を追加してください」と言うことができます。これで、ステップは1つだけになりました。しかし、そのステップには複数の部分があり、実行に時間がかかります。したがって、サイクルごとに高い命令があります。この場合は1つです。あなたが持っているので、しかし、あなたのクロック速度を高くすることができない多く、そのサイクルで実行するを。

または、「最初の数値をレジスタにフェッチします。次に2番目の数値をフェッチします。次に最下位ビットを追加します。次に、前からのキャリーで最下位から2番目のビットを追加します。次に、最上位ビットを追加します。キャリーがあった場合は、オーバーフローフラグを設定します。結果をメモリに書き込みます。」これで、非常に多くのステップがあります。しかし、各ステップはとてつもなく高速です。したがって、サイクルあたりの命令数は少なくなります(この場合、1/36程度)。ただし、各サイクルには実行するビットが非常に少ないため、クロック速度は非常に高くなる可能性があります。

サイクルごとに高い命令と高いクロック速度の両方を使用するには、複雑な命令を非常に少数の非常に単純なステップに分割する必要があります。しかし、命令は複雑であるため、それはできません。

実際の特定のトレードオフとサイクル数は、最新のCPUがパイプライン化され、命令をオーバーラップするため、大きく異なります。しかし、基本的な考え方は正しいです。


2

あなたはできるサイクル当たりの命令や高クロック速度の両方を持っています。限界に達するのは、デジタル回路の伝播遅延が単一クロックサイクルのパルス幅を超える場合です。これはCPU電圧を上げることで克服できますが、これにより消費電力が増加する(したがって、熱が放散される)ことに注意してください。

したがって、より速いクロック速度が必要な場合は、電圧を上げて(電子ドリフト速度を上げて)伝搬遅延を減らす必要があります。この遅延がクロックサイクルを超えた場合、CPUは予想どおりに動作しない可能性が高く、その上で実行されているソフトウェアはクラッシュするか、例外をスローします。ただし、プロセッサを介して実行できる電圧には明らかに制限があり、これはCPU自体の設計(主に、内部電気経路の通電容量)によって決まります。


パイプライン処理では、各命令がいくつかの小さな「マイクロ操作」に分割されるため、場合によってはより高いクロック速度が可能になります。これらのマイクロ操作は非常に単純な操作であり、チェーンで相互接続されたはるかに小さな回路を使用します(物理的な意味で、電子の移動距離が短いほど、特定のサブユニットを通る伝搬遅延が短くなります)。

パイプライン化されたCPUに追加された利点は、より複雑な設計を犠牲にして、単位時間あたりに実行される命令の数を大幅に増やすことができることです。

一部の命令で必要なサイクルが多かれ少なかれサイクルについては、実行している命令によって異なります。たとえば、x86命令セットには、メモリ内の文字列全体をある場所から別の場所に移動できるMOVS命令があります。明らかに、長い文字列を瞬時にコピーすることはできませんが、複数のクロックサイクルをかけて単語ごとにコピーすることはできます。したがって、MOVS命令の時間は可変です(コピーする文字の量によって異なります)。

マルチサイクル操作の効果は、CISC設計(x86)とは対照的に、RISC設計(ARMなど)ではあまり目立ちません。これは、RISCベースのデザインでは最も一般的に使用される基本演算のみが使用され、パイプライン処理が非常に簡単で、サイクルあたり1命令のスループットを達成できるためです。


1

コンピューターが特定のタスクを完了するのにかかる時間は、コンピューターのクロック速度に依存しません...それは、計算ユニットの設計および設計方法に依存します。

クロック速度は、実際にはCPU設計者が行う(多かれ少なかれ)任意の決定であり、時には正当な理由(効率)、時には貧弱な理由(広告)のために行われます。

特定のCPUには、1〜100ナノ秒(ns)の時間を要する命令が混在しているとします。1ティックが100 ns(10 MHz)になるようにクロックレートを設定できます。これは、すべての命令がちょうど1ティックで終了することを意味します。ただし、命令の実行時間が均等に分散されている場合、これは計算ユニットが50%の時間アイドル状態になることを意味します(平均実行速度は50nsで、残りのティックの50nsはアイドル状態になります)。一方、ティックを10nsに設定すると、命令の範囲は1から10ティックになりますが、次の命令が開始されるまでユニットが9ns以上アイドルになることはなく、平均アイドルは5nsになります。

開発中、CPUは、CPUが実際に実行できる作業量に基づいて、特定の速度で実行されるように設計されます。クロック速度を上げたり下げたりしても、CPUが達成できる作業量を実際に変更するのではなく、その効率比をいじっているだけです。

(そして、オーバークロックCPUについて叫ぶ前に:これは、実際の速度向上をもたらす2つの利点を提供します:高速実行命令(1サイクル未満)は、実行時間を短縮し、すべての命令はアイドル時間を短縮します。これらのうち、実際にコンピューターで実行できる作業量を増やすことができますが、CPUをX%オーバークロックしても、ベンチマーク時に行った作業のX%増加と常に一致するとは限りません。)

TL; DR

CPUは1秒でXの作業を完了できます。Hクロック速度とI IPCを使用する場合、I = X / Hになります。Hを変更してもXは変更されませんが、Iに逆に影響します。


1
クロック速度は、arbitrary意的な決定からはほど遠いものです。CPU供給電圧とICトレース長の関数として慎重に選択する必要があります(過度の伝播遅延を避けるため)。
ブレークスルー

CPUは同期デジタル回路であるという事実を見逃したと思います。命令はXナノ秒かかりません(クロックサイクルが伝播遅延より小さいと仮定)、すべてがクロックの立ち上がりエッジまたは立ち下がりエッジ、あるいはその両方で発生します。命令は、X単位ではなく Xサイクルかかります。はい、サイクルの長さは変更できますが、違いはいつ起こるかです。最後に、CPUが1秒間に実行できる作業量はクロック速度の関数であるため、式は実際にはチェックされません。
cp2141

CPUは、複数の非同期ユニットの同期的合併です。クロックティックは物事をうまく整列するために使用されますが、実行にかかる時間を決定しません...たとえば、整数加算は、CPUを流れる電流の長さとトランジスターの速さに基づいて一定の時間を要します状態を切り替えます。結果は次のクロックティックでREADになりますが、実際の計算はティック全体で非同期に実行されます。
ベンジャミンチェンバース

0

要件が矛盾しているため、サイクルごとの高い命令と高いクロック速度の両方を持つことはできません。

最初の近似では、IPCは設計の複雑さ(A)に依存することを示すことができます。

IPC = a sqrt(A)

一方、設計で達成可能な最大周波数(F)は[1]

F = 1 / {b + c sqrt(A)}

a、b、およびcパラメーター。

したがって、muarchの複雑さを増すと、作業頻度が減るという犠牲を払ってIPCが増しますが、複雑さを減らすとIPCを犠牲にして頻度が増します。これは、ウィキペディアの記事で言及されている2つの極端なケースに対応していますが、ウィキペディアはBrainiacとspeed-demonという名前について言及していません。

  • 頭脳設計:高IPCおよび低頻度
  • スピードデーモンの設計:高周波および低IPC。

[1]一部の著者は、頻度の表現は「1 / {b + c A}」であると主張していますが、どちらの場合も、複雑さが増すと、達成可能な最大頻度が減少します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.