web-dev-qa-db-ja.com

サイクルあたりの命令数とクロック速度を両立できないのはなぜですか?

メガヘルツ神話は、PCのINTEL 8086プロセッサーとAppleのRockwell 6502プロセッサーの違いにより、宣伝戦略になりました。 8086は4.77MHzで動作し、6502は1MHzで動作しました。ただし、6502の命令では必要なサイクルが少なくなりました。実際には、8086よりも高速に実行されるほど、はるかに少ない数です。なぜ一部の命令はより少ないサイクルを必要とするのですか?そして、なぜ少ないサイクルを必要とする6502の命令を8086の高速サイクリングプロセッサと組み合わせることができないのですか?

Wikipediaのサイクルあたりの命令数に関する記事(IPC)によると

IPCを支配する要因
高いIPCおよび低いクロック速度...または低いIPCそして高いクロック速度。

サイクルあたりの命令数とクロック速度の両方を高くできないのはなぜですか?

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

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

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

参照:

サイクルあたりの命令と増加したサイクル数

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

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

37
dobus

tl; dr

パイプラインが短いほど、クロック速度は速くなりますが、スループットが低下する可能性があります。また、一番下の回答2と3を参照してください(短いので、約束します)。

長いバージョン:

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

  1. すべての指示に同じ時間がかかるわけではありません
  2. すべての指示が、すぐに(または10または20でも)何が行われたかに依存するわけではありません。

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

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

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

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

enter image description here

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

対照的に、パイプラインを完全に排除する場合(ただし、他のすべてを同じに保つ場合)は、最初の命令を取得するのにわずか240ナノ秒しかかかりません。 (この「最初の」命令を取得する速度の違いは、レイテンシと呼ばれます。一般に、スループット(1秒あたりの命令数)ほど重要ではありません)。

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

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

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

回答#2:

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

回答#3:

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

21
soandos

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

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

サイクルごとに1つのRISC命令の1つのステージを処理する非常に単純なプロセッサを設計できます。これが私のCPUの基礎である場合、「a」の構成要素の複雑さを軽減するため、1秒あたり非常に非常に高いサイクルを実現できます。サイクル"。

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

8
allquixotic

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

たとえば、「2つの数値を加算する」とだけ言うことができます。これで、ステップは1つだけになります。ただし、そのステップには複数の部分があり、実行には時間がかかります。したがって、サイクルあたりの命令数が多くなります(この場合は1つ)。しかし、そのサイクルでlotを実行する必要があるため、クロック速度を高くすることはできません。

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

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

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

5
David Schwartz

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

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


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

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

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

マルチサイクル操作の影響は、 [〜#〜] risc [〜#〜] 設計(つまりARM)では [〜#〜] cisc [〜#〜] 設計(つまりx86)。これは、RISCベースの設計には最も一般的に使用される基本演算しかなく、サイクルごとに1命令のスループットを達成する方法でパイプライン化する方がはるかに簡単だからです。

2
Breakthrough

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

クロック速度は、実際には(多かれ少なかれ)CPU設計者が任意に決定したものであり、適切な理由(効率)がある場合と、不十分な場合(広告)がある場合があります。

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

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

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

TL; DR

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

1

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

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

IPC = a sqrt(A)

一方、設計によって達成可能な最大周波数(F)は、[1]としてスケールします。

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

a、b、cパラメータを使用します。

したがって、muarchの複雑さを増すとIPCが増加しますが、動作周波数が低下しますが、複雑さを減らすとIPCを犠牲にして周波数が増加します。これは、ウィキペディアの記事ですが、ウィキペディアは名前の言及に失敗しています:Brainiacおよびspeed-demon。

  • ブレニアック設計:高IPCおよび低頻度
  • スピードデーモンの設計:高頻度で低IPC。

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

0
juanrga