1命令の実行に必要な平均クロックサイクル数(Cycles Per Instruction)
CPI(Cycles Per Instruction)とは、1命令を実行するのに平均で何回のクロックサイクル(拍)が必要かを表す数値です。クロックサイクルとは、CPUを動かす基準信号(クロック信号)の1拍ぶんのこと。
身近な例で言うと、料理の「1品あたりの調理ステップ数」のようなものです。サラダは2ステップで作れても、煮込み料理は10ステップかかる。同じように、足し算のような単純な命令は少ない拍(CPIが小さい)で済みますが、メモリからデータを読むロード命令などは多くの拍(CPIが大きい)を必要とします。
上のツールで命令数とCPIを書き換えると、プログラム全体の平均CPIがリアルタイムで再計算されます。命令の構成しだいで平均CPIがどう変わるか試してみてください。
CPIの基本の式は、かかったクロックサイクルの総数を、実行した命令の総数で割るというものです。
CPI = クロックサイクル数 / 命令数
命令の種類ごとにCPIが違う場合は、種別ごとの「命令数 × CPI」を全部足して総サイクル数を出し、それを総命令数で割って平均CPIを求めます。これを「加重平均(重みつき平均)」と呼びます。
平均CPI = Σ(命令数 × CPI) / 総命令数
計算例(上のツールの初期値)
演算 50×1 = 50
ロード 30×3 = 90
ストア 10×2 = 20
分岐 10×4 = 40
───────────────
総サイクル = 200, 総命令 = 100
平均CPI = 200 ÷ 100 = 2.0
「命令種別ごとのCPIと出現割合(%)」から平均CPIを求める場合、割合で与えられたときは 各CPIにその割合を掛けて足すだけで平均CPIが出ます。
CPIはCPUの性能を比べるときの重要な指標です。CPUの実行時間は次の式で表せ、CPIが小さいほど実行時間が短く=高性能になります。
実行時間 = 命令数 × CPI × クロック周期
CPUを比較するときは、次の3つの要素をセットで見ます。
・命令数:少ないほど良い(CISCのように1命令で多くを処理する設計など)
・CPI:小さいほど良い(パイプラインで1拍に近づける)
・クロック周波数:高いほどクロック周期が短く良い
ここで覚えておきたいのが、命令数とCPIにはトレードオフがあることです。たとえばRISC(単純な命令だけを持つ設計)はCPIを1に近づけられますが、複雑な処理に多くの命令を必要とするため命令数が増えます。逆にCISC(高機能な命令を持つ設計)は命令数を減らせますが、1命令のCPIが大きくなりがちです。
CPIだけ・周波数だけで性能を判断しないのがポイントで、性能は必ず3要素の掛け算で考えましょう。
なぜ命令によってCPIが違うのか。それは命令ごとに「何をしなければならないか」が違うからです。CPUが命令を処理するとき、単純な計算(たし算など)はCPU内部の演算回路だけで完結しますが、メモリからデータを読むロード命令などは「メモリにアクセスするまでの待ち」が発生します。メモリはCPU内部より遅いので、その分だけ余計なクロックがかかります。
代表的な命令のCPIの目安(値はCPUの設計によって異なります)。
・演算命令(加算・論理演算など):CPI ≒ 1。CPU内部だけで完結するため最速。
・ロード命令(メモリからレジスタへ読み込む):CPI ≒ 2〜5。メモリアクセスの待ちが加わる。
・ストア命令(レジスタからメモリへ書き出す):CPI ≒ 2〜3。書き込みの待ちが加わる。
・分岐命令(if/ループなどの条件分岐):CPI ≒ 3〜5。分岐先が確定するまでパイプラインを止める(ハザード)必要があるため高くなりやすい。
だから平均CPIを下げるには、CPIの大きな命令(ロード・分岐など)の出現回数を減らすことが効果的です。コンパイラ(プログラムをCPUの命令に変換するソフト)は、この最適化を自動で行っています。
クロック周波数(Hz=ヘルツ)とは、CPUが1秒間に刻む「拍」の数のことです。クロック周波数が高いほど1拍の時間(クロック周期)が短くなり、同じCPIでも実行時間が短くなります。
例) 命令数 = 100、平均CPI = 2.0、
クロック周波数 = 1GHz(= 10億回/秒)の場合
クロック周期 = 1 ÷ 1,000,000,000 = 1ns(ナノ秒)
実行時間 = 100 × 2.0 × 1ns = 200ns
同じプログラムを2つのCPUで比べる場合、どちらが速いかを正しく判断するには3要素すべてを計算します。
・CPU-A:命令数=100、CPI=1.5、周波数=2GHz(周期=0.5ns)→ 実行時間 = 100 × 1.5 × 0.5ns = 75ns
・CPU-B:命令数=100、CPI=2.0、周波数=3GHz(周期≒0.33ns)→ 実行時間 = 100 × 2.0 × 0.33ns ≒ 66ns
CPU-Bの方がCPIは大きいですが、周波数も高いのでトータルでは速くなります。このように「CPI単体・周波数単体」だけで速い遅いは判断できず、3要素の積(掛け算)で比べる必要があります。