【基本情報】CPU性能計算、鍵は「1秒・1命令・1アクセスあたり」の整理|MIPS・CPI・キャッシュ

MIPS、クロック周波数、CPI、実効アクセス時間。用語が多いせいで難しく見えますが、この分野の問題は「1秒あたり」「1命令あたり」「1アクセスあたり」のどの量を求めているのかを整理すると、急に見通しがよくなります。

そして手を動かす前に確認したいのが、問題文の条件です。周波数の単位(GHzかMHzか)、CPIは平均か命令種別ごとか、命令数は与えられているか、キャッシュミス時の時間は「総時間」か「追加時間」か、ヒット率かミス率か、そして答えの単位。特にキャッシュのところは後半でじっくりやります。

登場人物の整理

用語 意味 注意点
クロック周波数 1秒あたりのクロック数 Hzで表す。2GHzなら1秒に2×10^9回
クロック周期 1クロックにかかる時間 周波数の逆数
CPI 1命令あたりの平均クロック数 命令ミックスで変わる
IPS 1秒あたりの命令数 周波数÷平均CPI
MIPS 1秒あたりの百万命令数 異なる命令体系の比較には注意
CPU実行時間 対象処理の実行にCPUが使う時間 命令数×平均CPI÷周波数
ヒット率 キャッシュに目的データがある割合 ミス率=1−ヒット率
実効アクセス時間 各経路の時間を確率で平均した値 問題文の時間定義を確認

CPIは、クロック周波数と実行命令数が同じなら、小さいほど実行時間を短くできます。MIPSは、同じ処理を同じ実行コードで動かすなど、実行される命令の内容と動的命令数が同等とみなせる場合に、大きいほどCPU実行時間が短くなります。この「条件付き」の意味はあとで説明します。ちなみに似た指標のFLOPSは「1秒あたりの浮動小数点演算回数」で、科学技術計算向けの別の物差しです。

基本の式:CPU実行時間

個別の公式のおおもとになるのがこれです。

CPU実行時間 = 実行命令数 × 平均CPI ÷ クロック周波数
(クロック周期で書くなら:実行命令数 × 平均CPI × クロック周期)

「命令が何個あって、1命令に何クロックかかって、1クロックが何秒か」を掛けているだけ。ここから、

1命令あたりの平均実行時間 = 平均CPI ÷ クロック周波数 = 平均CPI × クロック周期

も出てきます。なお実行命令数は「実際に実行された命令の数(動的な数)」です。

ここでひとつ区別を。この式で出るのはCPU実行時間——対象処理にCPUが使った時間です。I/O待ち・通信待ち・他プロセスの実行時間まで含む経過時間とは別物なので、問題文で「各時間が重ならず順に発生する」と読み取れる場合にだけ加算します。並行して発生する時間や、すでに総時間に含まれている時間を二重に足さないでください。また、問題文のCPIが「キャッシュミスなどの待ちクロックを含んだ平均CPI」なのか「基本処理だけのCPI」なのかも確認を。停止クロックが別に与えられているのに、待ち込みのCPIにさらに足すと二重計上になります。

MIPS:「1秒あたり何百万命令か」

IPS = クロック周波数[Hz] ÷ 平均CPI
MIPS = クロック周波数[Hz] ÷(平均CPI × 10^6)

単位換算込みの形も置いておきます。周波数がMHzならそのまま割るだけGHzなら1,000倍してから割ります。

MIPS = 周波数[MHz] ÷ 平均CPI
MIPS = 周波数[GHz] × 1,000 ÷ 平均CPI

例題:2.4GHzのCPUが、1命令を平均4クロックで実行する。性能は何MIPS?

Hzで:2.4×10^9 ÷ 4 = 6×10^8 命令/秒 = 600MIPS
GHz形式で:2.4 × 1,000 ÷ 4 = 600MIPS

ミスしやすいのは2パターン。「1命令=1クロックと思い込んで周波数をそのままMIPSにする」(2400MIPSという大きめの誤答)と、「GHzの2.4をそのまま割って0.6MIPSにする」(単位換算の抜け)。式に入れる前に単位を書くと、この種の計算ミスを防ぎやすくなります。

MIPSだけでCPUの優劣は決まらない

ひとつ大事な注意。MIPSは「命令の個数」を数えているだけで、1命令がどれだけ仕事をするかは見ていません。MIPSで速さを比較できるのは、実行される命令の内容と動的命令数が同じ(同等とみなせる)場合——たとえば同じ実行コードを別のCPUで動かす場合です。同じ命令セットでも、コンパイラや最適化が違えば実行命令数は変わりますし、異なる命令セット間ではそもそも1命令の仕事量が違うのでMIPSだけでは比較できません。最も確実なのは、同じ処理の実行時間そのものを比べること。CPU実行時間は命令数・平均CPI・クロック周波数の3つ全部で決まる、が結論です。試験の計算問題では、問題文が与えた命令数・CPI・周波数の枠内で素直に計算すればOKですが、「異なるCPUをMIPSだけで比較できるか」という知識問題では「できない」側が正解です。

平均CPIは「実行割合で重み付け」

命令ごとにかかるクロック数が違う問題は、加重平均で解きます。

平均CPI = Σ(各命令種別のCPI × 実行割合)

ここでの割合は、実際に実行された命令数に占める割合(動的な命令ミックス)です。ソースコードに書いてある命令の個数ではなく、分岐や繰り返しで何回実行されたかで数えます。割合の合計は必ず1(100%)になっているか、最初に確認してください。

例題:命令の70%は2クロック、残り30%は6クロックで実行される。平均CPIは?

2×0.7 + 6×0.3 = 1.4 + 1.8 = 3.2

単純平均で(2+6)÷2=4とやると、「よく実行される軽い命令」の貢献が消えてしまいます。テストの平均点と同じで、人数(割合)を掛けてから足す。3種類でも同じです:CPI1が50%・CPI3が30%・CPI5が20%なら、1×0.5+3×0.3+5×0.2=2.4。割合ではなく命令数そのものが与えられたら、Σ(各命令数×CPI)÷総命令数で同じ平均CPIが出ます。

逆算パターン:式を回すだけ

CPU実行時間の基本式とMIPSの式は、どこを聞かれても変形で対応できます。

平均CPI = 周波数[Hz] ÷(MIPS × 10^6)
周波数[Hz] = MIPS × 10^6 × 平均CPI
実行命令数 = CPU実行時間 × 周波数 ÷ 平均CPI
CPU実行時間 = 実行命令数 × 平均CPI ÷ 周波数

例題:400MIPSのCPUが、同じ命令体系で8×10^8命令を実行する。CPU実行時間は?

8×10^8 ÷(400×10^6)= 2秒

MIPSは「毎秒4×10^8命令」のこと。あとは命令数を速度で割るだけです。

クロック周期は「周波数の逆数」

クロック周期[秒] = 1 ÷ クロック周波数[Hz](逆も同じ:周波数 = 1 ÷ 周期)

例題:2GHzのCPUの1クロックの時間は?

1 ÷(2×10^9)= 0.5×10^-9 秒 = 0.5ナノ秒

ここは単位の変換が本体です。

接頭語 倍率
k 10^3
M 10^6
G 10^9
m 10^-3
μ 10^-6
n 10^-9

代表例:1GHz→1ns、2GHz→0.5ns、500MHz→2ns、周期4ns→250MHz。「ギガとナノはペア」と覚えるのは便利ですが、ペアなのは単位の桁の話で、数値そのものは逆数(2GHz→0.5ns)になる点に注意してください。周波数が高いほど周期は短い。周波数をHz、周期を秒と、対応する単位にそろえれば「周波数×周期=1」が成立します。

ついでにMIPSの例題と接続しておくと、2.4GHzの周期は1÷(2.4×10^9)=約0.4167ns、CPI4なら1命令あたり4×0.4167=約1.6667ns、1秒÷1.6667ns=約6×10^8命令/秒=600MIPS。ちゃんと同じ答えに戻ってきます(0.4167を早く丸めすぎると最後がズレるので、割り算のまま持ち回るのが安全です)。

実効アクセス時間:問題文の「時間の定義」で式が変わる

キャッシュメモリの問題も正体は加重平均ですが、ここに特に取り違えやすいポイントがあります。問題文の「主記憶のアクセス時間」が、

  • A:ミスしたときの、アクセス開始からデータ取得までの総時間なのか
  • B:キャッシュを確認したあとに追加でかかる時間なのか

で、式と答えが変わるんです。

モデルA:ヒット時・ミス時の「総時間」が与えられる場合

実効アクセス時間 = ヒット率 × ヒット時の総時間 +(1−ヒット率)× ミス時の総時間

例題:キャッシュにヒットした場合の総アクセス時間は5ns。ミスした場合、アクセス開始から主記憶のデータを得るまでの総時間は55ns。ヒット率0.9のとき、実効アクセス時間は?

5×0.9 + 55×0.1 = 4.5 + 5.5 = 10ナノ秒

問題文でヒット時とミス時の総時間がそれぞれ示されていたら、この加重平均の式です。「速いほうにヒット率、遅いほうに(1−ヒット率)」という覚え方が通用するのは、このモデルAの話。

モデルB:キャッシュを確認してから主記憶へ行く場合

「まずキャッシュを5nsで確認し、ミスだったら追加で主記憶に55nsアクセスする」という直列の設定なら、キャッシュ確認の5nsは全アクセスで必ず発生するので、

実効アクセス時間 = キャッシュ時間 +(1−ヒット率)× 追加の主記憶時間

同じ数値で計算すると:5 + 0.1×55 = 10.5ナノ秒。モデルAと0.5ns違います(=ミス時にもキャッシュ確認時間を払っている分)。ちなみにこの式は「0.9×5+0.1×(5+55)」と書いても同じ値になります。

解き方:経路を書き出してから平均する

覚え方だけに頼らず、この手順で解くのが確実です。

  1. ヒット時に通る経路と、その総時間を書く
  2. ミス時に通る経路と、その総時間を書く
  3. それぞれにヒット率h、ミス率(1−h)を掛けて足す

問題文の「主記憶アクセス時間55ns」が総時間か追加時間か、最初に判定する。これだけで両モデルを取り違えません。ミスペナルティという用語が出てきた場合も同じで、標準的には「キャッシュミスによって追加で必要になる時間」を指すことが多いのですが、試験問題では独自の言い回しや「主記憶アクセス時間」が使われることもあります。最終的には問題文の定義と経路で判断してください。追加時間の意味なら「実効 = キャッシュ時間 + ミス率 × ミスペナルティ」です。

必要なヒット率の逆算

「実効を◯ns以下にしたいとき、必要なヒット率は?」という逆算も、使った式をhについて解くだけです。

総時間モデル:E = h×T_hit +(1−h)×T_miss を変形して、

h =(T_miss − E)÷(T_miss − T_hit)

例題:ヒット時4ns、ミス時の総時間44ns。実効アクセス時間を8nsにするために必要なヒット率は?

h =(44−8)÷(44−4)= 36÷40 = 0.9(90%)

直列モデルなら E = T_c +(1−h)×T_m から h = 1 −(E−T_c)÷T_m。どちらの式を使うかは、問題文の時間定義で決まります

検算のコツをひとつ。実現できる目標Eには範囲があって、総時間モデルならT_hit ≦ E ≦ T_miss、追加時間モデルならT_c ≦ E ≦ T_c+T_m。計算したhが0〜1に収まっているかを必ず確認してください。範囲の外に出たら、目標が実現不可能か、時間定義の取り違えか、式・単位のミスのどれかです(例:さっきの条件で目標E=2nsとするとh=1.05になり、その時点でおかしいと分かります)。

アムダールの法則:速くならない部分が上限を決める

演習でも扱う並列化・高速化の定番です。変数の意味を正確に:pは「改善前の全実行時間のうち、高速化対象部分が占めていた時間の割合」(0≦p≦1。処理件数やコード量の割合とは限りません)、sはその部分だけの速度向上倍率(s>0、高速化なら通常s≧1)。このとき、

全体の速度向上率 = 1 ÷((1−p) + p/s)

例題:改善前の実行時間の80%を占めていた処理を、その部分だけ4倍の速度にした。全体では何倍速くなる?

1 ÷(0.2 + 0.8/4)= 1 ÷ 0.4 = 2.5倍

一部を4倍にしても、全体は4倍になりません。高速化できない20%がそのまま残るからです。極端な話、80%の部分を無限に高速化しても、全体は 1÷0.2 = 5倍が上限。「速くならない部分が天井を決める」、これがアムダールの法則の核心です。

ついでに速度向上率の基本も。速度向上率 = 旧実行時間 ÷ 新実行時間です。10秒が4秒になったら10÷4=2.5倍。これは「実行時間を60%短縮」と同じ状況ですが、「60%短縮=1.6倍」ではありません。一般式にすると、時間をr(小数)だけ短縮したら新時間は旧時間の(1−r)倍なので、速度向上率=1÷(1−r)。60%短縮なら1÷0.4=2.5倍です。

ありがちなミスまとめ

やらかし 出てくる誤答 対策
GHzをHz・MHzに直さない 桁が10^3・10^9ズレた値 式に入れる前に単位を書く
周波数をそのままMIPSに CPIを無視した大きい値 周波数を平均CPIで割ったか確認
平均CPIを単純平均 割合無視の値 実行割合を掛けてから足す
命令割合の合計が100%でない 加重平均が崩れる 最初に割合の合計を確認
MIPSだけで別CPUを断定比較 実際の処理時間と逆転することも 命令体系・命令数・CPIを確認
ミス時の総時間と追加時間を混同 0.5nsなど微妙にズレた値 ヒット経路・ミス経路を書き出す
ヒット率とミス率の取り違え 重みが逆の値 ミス率=1−ヒット率をメモ
周波数と周期を同じ向きに考える 高周波数ほど周期が長い誤解 周波数×周期=1
アムダールで全体を一律に高速化 過大な速度向上率 高速化できない割合を残す
途中で丸める 最終値が選択肢とズレる 丸めは最後の1回
命令体系が同じだけでMIPS比較できると考える 実行命令数の違いを無視 同じコード・動的命令数か確認
CPU実行時間に総時間を重複加算 実行時間の過大評価 CPU時間と経過時間を区別
目標Eの実現可能範囲を確認しない 0未満や1超のヒット率 hが0〜1に入るか検算
アムダールのpを命令数割合と決めつける 速度向上率のズレ 改善前の実行時間割合を使う
短縮率をそのまま倍率に足す 60%短縮を1.6倍と誤る 速度向上率=1÷(1−r)

仕上げに演習10問どうぞ

演習では、MIPSの正逆計算、平均CPI、クロック周期、実効アクセス時間と必要ヒット率の逆算、そして「並列化しても速くならない部分がある」というアムダールの法則の入門問題を確認できます。「時間の定義を確認してから式を選ぶ」練習にどうぞ。


今日のまとめ

  • 基本の式はCPU実行時間=命令数×平均CPI÷クロック周波数。CPU実行時間と経過時間は区別する
  • MIPSは周波数[Hz]÷(平均CPI×10^6)。比較に使えるのは動的命令数が同等とみなせる場合
  • 平均CPIは動的な命令ミックスの加重平均。割合の合計100%を最初に確認
  • MIPSだけでは異なる命令体系のCPUを絶対評価できない
  • クロック周期は周波数の逆数。「ギガとナノはペア、数値は逆数」
  • 実効アクセス時間はヒット経路とミス経路を書き出して加重平均。ミス時の55nsが「総時間」か「追加時間」かで答えが変わる(10ns vs 10.5ns)
  • アムダールの法則:高速化できない部分が全体の上限を決める

次回は「待ち行列」。M/M/1待ち行列の前提と基本式を整理します。

参考資料

  • IPA「基本情報技術者試験(レベル2)シラバス Ver.9.2」

本記事の例題は、基本情報技術者試験の出題範囲及び標準的なコンピュータ性能指標を参考に、当サイトで独自に作成したものです。

関連する問題


コメント

タイトルとURLをコピーしました