プロセッサのしくみについてもう少し学習しましたが、サイクルごとの命令についての正解を見つけることができませんでした。
たとえば、4コアのCPUは1サイクルあたり4つの命令を実行できるため、2 GHzで実行されている4コアのCPUは1秒あたり80億の操作を実行するという印象を受けました。これは事実ですか?
単純化しすぎていると思いますが、ガイドなどを使って自分を正直にすることができれば、間違いなくアイデアを受け入れることができます。
おそらく検索すべきキーワードは [〜#〜] cisc [〜#〜] 、 [〜#〜] risc [〜#〜] と スーパースカラーアーキテクチャ 。
CISCアーキテクチャ(x86、68000、VAX)では、1つの命令が強力ですが、処理に複数のサイクルが必要です。古いアーキテクチャでは、サイクル数は固定されていましたが、現在、命令あたりのサイクル数は通常、さまざまな要因(キャッシュヒット/ミス、分岐予測など)に依存しています。 tables で検索できます。多くの場合、特定の状況下で特定の命令が何サイクルかかるかを実際に測定するのにも役立ちます( パフォーマンスカウンター を参照)。
Intelの詳細に興味がある場合は、 Intel 64およびIA-32最適化リファレンスマニュアル をお読みください。
RISC(ARM、PowerPC、SPARC)アーキテクチャでは、通常、1つの非常に単純な命令で数サイクル(多くの場合1つだけ)のサイクルしかかかりません。
しかし、CISCやRISCに関係なく、スーパースカラーアーキテクチャがあります。 CPUは1つの命令を次々と処理していませんが、アセンブリラインと同様に、多くの命令を同時に処理しています。
結果は次のとおりです。単にプログラムのすべての命令のサイクルを調べて、それらをすべて追加すると、最終的には数が多くなります。シングルコアのRISC CPUがあるとします。単一の命令を処理する時間は、1サイクルの時間より短くなることはありませんが、全体的なスループットは、サイクルごとに複数の命令になる可能性があります。
私がそれを考えるのが好きな方法は、ランドリーのアナロジーです。 CPUの命令は、大量の洗濯物のようなものです。それぞれの負荷に対して、洗濯機と乾燥機の両方を使用する必要があります。それぞれの実行に30分かかるとします。それがクロックサイクルです。古いCPUは洗濯機を稼働させ、次に乾燥機を稼働させ、毎回、洗濯物の各負荷を完了するために60分(2サイクル)を要していました。
パイプライン:パイプラインは、両方を同時に使用する場合です-負荷を洗浄し、その後、乾燥している間に次の負荷を洗浄します。最初のロードは2サイクルで終了しますが、2番目のロードはさらに1サイクル後に終了します。したがって、最初のロードを除いて、ほとんどのロードは1サイクルしか必要としません。
スーパースカラー:すべての洗濯物をコインランドリーに持っていきます。 2つのワッシャーを取得し、両方にロードします。完了したら、2つの乾燥機を見つけて、両方を使用します。これで、2回の洗濯で60分で乾燥できます。これは、2サイクルで2つの負荷です。各ロードにはまだ2サイクルかかりますが、今ではより多くのサイクルを実行できます。現在、平均時間はサイクルごとに1ロードです。
パイプラインを使用したスーパースカラー:最初の2つの負荷を洗浄し、次にこれらが乾燥している間に、次の2つの負荷でワッシャーを負荷します。これで、最初の2つのロードはまだ2サイクルかかり、次の2つはさらに1サイクル後に終了します。したがって、ほとんどの場合、各サイクルで2つのロードを完了します。
マルチコア:洗濯物の半分を母親に渡します。母親には2つの洗濯機と2つの乾燥機があります。両者が一緒に作業することで、2倍の成果を上げることができます。これはスーパースカラーに似ていますが、少し異なります。すべての洗濯物を各マシンとの間で自分で移動する代わりに、彼女はあなたと同時にそれを行うことができます。
これは素晴らしいことです。以前よりも8倍洗濯を同じ時間で行うことができます。 (2倍のクロック速度:実行に15分しか必要としない洗濯機。)
さて、物事がうまくいかない方法について話しましょう:
パイプラインバブル:ウォッシュでシミが出ていないので、もう一度洗うことにしました。今、乾燥機はただそこに座って、何かするのを待っています。
キャッシュミス:汚れた洗濯物を運ぶトラックが渋滞しています。これで、洗濯機が2つと乾燥機が2つありますが、待つ必要があるため、作業は完了しません。
問題が発生する頻度に応じて、サイクルごとに4つのロードを常に実行できるとは限らないため、実行される実際の作業量は異なる場合があります。
分岐予測:さて、後で汚れている場合に備えて、きれいな服を洗濯し始めます。 さて、ここでアナロジーが崩れます...
ではない正確に。参照しているサイクルはクロックサイクルであり、ほとんどの最新のプロセッサパイプラインなので、1つの命令を実行するには数クロックサイクルかかります。 (これは、最初の命令が完了する前でも他の命令が実行を開始できるようにするので、良いことです。)最も理想的な状況を想定すると、おそらく80億IPC程度ですが、依存関係やパイプラインのバブルなど、あらゆる種類のことが起こります。 、ブランチなどなので、常に機能するとは限りません。
申し訳ありませんが、正直な回答をするには複雑すぎます。 Jon Stokesは この記事 でそれを説明するのに優れています。
各命令のサイクルタイムをルックアップ(または記憶)し、特定のコードのビットが完了するまでに必要なクロック数を知ることができた日は、ハイエンドチップでは古くからあります(ただし、一部ではまだマイクロコントローラ)。現代の汎用CPUコアは、複数のパイプラインでいくつかの異なる実行ユニットの複数のコピーを持ち、独自のロジックと分岐予測と投機的実行機能を備えた多段メモリキャッシュにアクセスします。単一のダイ上に複数のコアがあると、キャッシュの整合性ロジックやその他の複雑さが増加します。
つまり、短い答えはコア数が多いほど、物事を成し遂げる能力が高いということですが、予測可能な方法ではありません。
ルートヴィヒはCISCとRISCの違いを説明しましたが、RISC命令はシンプルで迅速ですが、個別に行うことはほとんどないため、CISCプロセッサで単一の命令と同じことを行うには、いくつかをつなぎ合わせる必要があることを忘れていました。その結果、一部のRISC命令は高速になりますが、他の命令は高速ではありません。
サイクルは、コアごとのコンセプトに近いものです。各コアは独自のサイクルを並行して実行します。