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)」と書いても同じ値になります。
解き方:経路を書き出してから平均する
覚え方だけに頼らず、この手順で解くのが確実です。
- ヒット時に通る経路と、その総時間を書く
- ミス時に通る経路と、その総時間を書く
- それぞれにヒット率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」
本記事の例題は、基本情報技術者試験の出題範囲及び標準的なコンピュータ性能指標を参考に、当サイトで独自に作成したものです。

コメント