コンピュータアーキテクチャI講義ノート (2) 1 コンピュータの抽象化と

2015.10.14
コンピュータアーキテクチャI 講義ノート (2)
コンピュータの抽象化とテクノロジ
1
第 1 章は,序論です.したがって,ポイントをかいつまんで話します.
1.1
はじめに
ムーアの法則
コンピュータシステムの性能は,過去 60 年にわたって急速な進歩を遂げてきた.この進歩を喝
破したムーア (Moore)1 は,自身の経験から,技術進歩を次のような言葉で表した(1965 年).
「集積回路上のトランジスタ数は 18 か月で倍になる.
」
ムーア自身は, 上記のように直接言ったわけではないが,後年わかりやすく上記のように表現す
るようになった2 .
この法則は,経験則である.すなわち,IC チップに入るトランジスタの数が 18 か月で倍になる
ということが経験的に成り立っていると言っている.実際は,プロセッサチップのトランジスタ数
は 2 年で倍になっている.図 1 参照.
図 1:
ム ー ア の 法 則:プ ロ セッサ チップ の ト ラ ン ジ ス タ 数( 四 角 は プ ロ セッサ の 名 前 )
“http://ja.wikipedia.org/wiki/ムーアの法則” より引用
1 Gordon
Moore. Moore は,インテルの共同創業者です.
の法則の原著論文は,
http://download.intel.com/museum/Moores Law/Articles-Press Releases/Gordon Moore 1965 Article.pdf
あります.読んでみてください.
2 Moore
1
に
また,今までそうだったから,今後もそうだろうということで,将来予測としても使われている
(きた).
Moore の法則の今後については,楽観的な見方と悲観的な見方がある.
楽観的な見方は,たとえば,
http://ja.wikipedia.org/wiki/ムーアの法則
にある.この中の「将来のトレンド」の項で今後も続くだろうと述べられている.
悲観的な見方は,たとえば,
http://techland.time.com/2012/05/01/
the-collapse-of-moores-law-physicist-says-its-already-happening/
を参照されたい.この中で,以下のように述べられている.
…in about ten years or so, we will see the collapse of Moore ’s Law. In fact, already, already
we see a slowing down of Moore ’s Law. Computer power simply cannot maintain its rapid
exponential rise using standard silicon technology. Intel Corporation has admitted this.
(ムーアの法則は今後 10 年で崩れるだろう.すでにムーアの法則は減速している.標準的なシ
リコン技術でトランジスタを指数関数的に増加させると,コンピュータパワーを維持することがで
きない.インテルはそれを認めている.
)
私は,悲観的な見方に近いですが,過去に何度もムーアの法則はもう成り立たないと言われてき
たにも関わらず,今も成立していますから,まだしばらくは成立するかもしれません.
(未来予測は
難しい.
)
コンピュータの進歩:速度,容量,価格
1940 年代半ばにコンピュータがこの世に現れ,以来 60 年.コンピュータは,高速化,大容量
化,小型化が進んだ.スピードは 500 万倍になった.初期のコンピュータの計算速度を人の歩く
速度 4km/h に例えると,今の計算機は,2000 万 km/h の速度.アメリカ大陸の東から西までは約
6000km あるから,6000km/2000 万 km/h= 1.01sec で大陸横断してしまう速度になったというこ
とである.メモリ容量は,100 万倍になった.値段は 10000 分の 1 になった.いや,それ以上に安
くなったかもしれない.
(20 年前の超大型計算機は何十億円もした.今はそれと同程度以上の性能
のパソコンが 10 万円である.
)
どのようにしてこんなに早くすることができたか?また,安くすることができたか?いろいろな
要因がある.速度に関する一番の貢献は,LSI 素子が高速で動くようになったこと(微細化技術の
進歩).次いでアーキテクチャ,すなわち,コンピュータの構成の仕方.価格については,LSI 素
子の高集積化と,大衆化(大量生産)である.
このように,長足の進歩を遂げるコンピュータであるが,その基本的な考え方は,昔から変わら
ない.この講義では,コンピュータの基本的な構成について詳しく話をする.コンピュータの高速
化技術(構成上の工夫によって高速化すること)については,3 年前期のコンピュータアーキテク
チャII の講義で詳しく述べる.
性能の向上とともに,今までは,計算能力や物理的な大きさの制約で応用できなかった分野に
も,コンピュータが使われるようになる.典型的な例は,
車載コンピュータ,携帯電話,ヒトゲノム研究プロジェクト,WWW,検索エンジン.
コンピュータの利用形態
昔は,コンピュータは非常に高価だったので,共同利用が普通だった.それに供する大型計算機
が開発されてきた.マイクロプロセッサが主流になってきたのは,1990 年頃からであろうか.現
2
在は,マイクロプロセッサ,すなわち,パーソナルコンピュータが主流である.デスクトップコン
ピュータやノートパソコンといった形で一般的に利用されている.
一方で,大量のデータを処理するコンピュータは根強い需要がある.これらは,大量のデータを
保管するものと,大量の計算を行うものに大別できる.前者は,データベースシステムなどに代
表され,いわゆるサーバーシステムとして提供されている.後者は,地球シミュレータや気象庁の
スーパーコンピュータシステムなどに代表され,大規模なマルチプロセッサ(スーパーコンピュー
タとか計算サーバーと呼ばれる)として提供されている.クラウドコンピューティングシステムは
両者を合わせたものと考えることができる.
実は,上記以外にもコンピュータは幅広く使われている.家電製品や自動車,携帯電話などであ
る.これらの用途に使われるコンピュータは組み込みコンピュータと呼ばれる.特徴は,機器に組
み込まれていることであり,ユーザから見るとコンピュータを使っているという意識は薄いだろう.
コンピュータの数という観点からは,組み込み用途に使われるコンピュータが圧倒的に多い.
これらの 3 つの用途に使われるコンピュータは,ノイマン型のコンピュータ(ストアードプログ
ラム方式のコンピュータ)という点で共通性がある.それゆえ,この科目では,ストアードプログ
ラム方式のコンピュータの構成について述べることにする.構成はプロセッサが違えば違った構成
法になるが,基本的な考え方は共通することが多い.そのような状況であるから,ここでは MIPS
プロセッサを例として使い,コンピュータ構成法(コンピュータアーキテクチャ)を述べる.
1.2
ソフトウェア
コンピュータはハードウェアとソフトウェアからなる.まずソフトウェア.ソフトウェアは言語
で記述されている.言語といっても人間が使う自然言語ではない.コンピュータ特有の言語,プロ
グラミング言語,がある.プログラミング言語を大別すると,機械語,アセンブリ言語,コンパイ
ラ言語となる.
• 機械語
0,1で表現.これが,唯一コンピュータが理解できる言語.いわゆるコンピュータへの命
令である.
• アセンブリ言語
機械語と1対1に対応.機械語の文字表現.人が理解しやすいようにしたもの.たとえば,
add, sub, mul といった命令がある.それぞれ,加算,減算,乗算の命令である.
mul t1, a, b;
add d, t1, c;
というような記述が行われる.1 番目の命令は a と b をかけて結果を t1 に代入するという意
味である.2 番目も同様.この 2 命令を実行すれば,d= c+a*b なる計算ができる.これは
積和計算をする命令列である.
• コンパイラ言語(高水準言語ともいう)
C,PASCAL,Java などいろいろな言語がある.より人間の言葉に近い表現ができる言語.た
とえば,
3
void swap(int *a, int *b)
{ int temp;
temp= *a;
*a= *b;
*b= temp;
}
は,変数 a と b の値を入れ替えるCプログラムである.
問題が与えられて,それを解く計算手順がわかると,その計算手順をコンパイラ言語で記述でき
る.
(プログラミングの授業でやりましたね.
)それを記述したものを一般にプログラムという.高
水準言語で記述したプログラムを直接コンピュータで実行することはできない.一旦,機械語に変
換してやる必要がある.それをコンパイル(あるいは翻訳)するといい,変換を実際に行うプログ
ラムをコンパイラという.
コンパイラも高水準言語で書いてある.だからそれも機械語に変換しておかなければならない.
(そう,皆さんが想像するように,最初のコンパイラは機械語(アセンブリ言語)でかかれていた.
それがあれば,コンパイラプログラムを高機能化していくことは楽ですね.
)
システムプログラムとアプリケーションプログラム
コンピュータを動かすソフトウェアは,その役割からシステムソフトウェアとアプリケーション
ソフトウェアに大別される.
アプリケーション(応用)ソフトウェア(あるいはプログラム)は,TeX とか Word とか Excel
などのプログラムである.皆さんの作ったプログラムも大概は応用プログラムだろう.
(将来は,皆
さんの中にシステムソフトウェアを作る人がでてくるだろう,しかし今は初心者だから,ほとんど
の人が応用プログラムを作っているはずである.
)
一方,システムソフトウェアの中心はオペレーティングシステム(OS)である.OS はコンピュー
タを管理するプログラムと考えてよい.詳しくは,OS の教科書を参照されたい.代表的な OS は,
windows や MAC OS それに UNIX (Linux) があげられる.また, コンパイラもシステムソフト
ウェアである.
これらのソフトウェアがアプリケーションソフトウェアを支えている.どう支えているかという
と,アプリケーションソフトウェアがここちよく動くように縁の下の力持ちとなっている.たとえ
ば,コンパイラは,人間に理解しやすい言葉で書いたプログラムをコンピュータが理解できる言葉
に変換してくれる.それがなかったら,変換作業を人がやらなければならない.OS は,複数のプ
ログラムが並行して実行できる環境を作ったり,メモリ(主記憶)の管理をしたり,ファイルの管
理をしたり,ユーザとのインタフェースを提供したり,とコンピュータがユーザにとって効率よく
快適に動作する環境を提供する.
1.3
ハードウェア
コンピュータは,非常に規模の大きい電子回路である.これは,多数の機能ブロックが結合され
て構成される.たとえば,四則演算を行う回路は一つの機能ブロックであり,データを記憶するレ
ジスタは別の機能ブロックである.何を持って機能ブロックというかは,見方によって異なる.い
くつかの機能ブロックが集まって,一つのまとまった大きな機能ブロックを構成することもあろ
4
う.いささか抽象的ではあるが,着目している機能を実現する回路を機能ブロックと呼ぶことにし
よう.したがって,機能ブロックという用語は,いろいろなレベルで使うことに注意してほしい.
また,機能ブロックを正しく動作させるには,適切な制御信号を与える必要があることに注意し
てほしい.
コンピュータのハードウェアをもっとも抽象的なレベルで機能ブロックに分けると,次の 5 つの
要素になる.これは,コンピュータの初期の時代から使われてきたオーソドックスな分け方である.
• 演算装置:四則演算や論理演算など命令の核となる演算を行う機能ブロック.たとえば,add
命令を実行する場合なら,加算の演算を行う.
• 制御装置:コンピュータの各機能ブロックが正しく動作するように制御信号を生成する機能
ブロック.たとえば,演算装置には,種々の演算ができる ALU(Arithmetic Logic Unit)) と
いう回路を使用し,演算種別を指定すると ALU はその演算を行う.制御装置は,実行する
命令に応じて適切な演算種別の信号を生成する.
• 記憶装置:プログラムやデータを記憶する機能ブロック.
• 入力装置:コンピュータにデータを与える機能ブロック.キーボードやマウスは典型的な入
力装置である.
• 出力装置:コンピュータの演算結果を出力して,人間に見えるようにする装置.ディスプレ
イやプリンタは典型的な出力装置.
これらは,図 2 のように結びついて,コンピュータを構成する.
なお,外部記憶装置(ハードディスク)やネットワークなど,入力と出力の両方の機能を持つも
のは,便宜上入力装置と出力装置の両方に属するものと考えることにする3 .
制御
入
力
出
力
演算
制御
データの流れ
記憶
図 2: 計算機の構成要素
インターネット革命が起きて以来,ネットワークは非常に重要なものになっている.ネットワー
クという用語は,非常に幅広い使われ方をしている.LAN などのローカルエリアネットワーク,プ
ロセッサ間をつなぐ相互結合ネットワーク,電話網などである.
このコンピュータアーキテクチャの講義では,ネットワークに関してはローカルエリアネット
ワークのネットワークインタフェースのみを扱う.インターネットのアーキテクチャについては,
その専門書を参照していただきたい.また,相互結合ネットワークについては,並列計算機の専門
書を参照していただきたい.電話網については,まったくこの科目の範囲外である.
3 入出力装置という機能ブロックとしてもよいが,このレベルは概念的なレベルなので,本文のようにしておいても混
乱することはないであろう.
5
1.4
命令セット
ハードウェアとソフトウェアの境界は何?それは命令.一般にコンピュータが持つ命令はたくさ
んの種類がある.たとえば,加算命令,乗算命令,ジャンプ命令などなど.これらを総称して命令
セットあるいは命令セットアーキテクチャあるいは単にアーキテクチャという.命令セットアーキ
テクチャが決まれば,ハードウェアは,命令の実行をするメカニズム(回路)を作ればよい.ソフ
トウェアは,人間の要求を実現する命令の系列を生成すればよい.また,コンピュータを設計する
に際しては,命令セットが完全に決まればハードウェアとソフトウェアは独立して仕事ができる.
また,命令セットの良し悪しは,コンピュータの性能に大きく影響してくる.したがって,命令
セットを決めることはコンピュータ設計の中で一番重要な仕事なのだ.
1.5
性能について
性能の定義
性能の定義の仕方には,いろいろなやり方がある.コンピュータシステムの性能という場合,2
通りの性能が考えられる.1 つは,プログラムの実行時間が短いほど性能がよい,とするやり方,
もう一つは,一定時間(単位時間)にどれだけのプログラムを実行したか,というやり方.前者は,
実行時間という尺度,後者はスループットという尺度で測られる.
プロセッサを高速のものにすれば,実行時間の改善ができる.その結果,単位時間に実行できる
プログラムの数も増えることになり,スループットも改善される.一方,プロセッサの速度はその
ままで,マルチプロセッサ化を行えば,1 つのプログラムの実行時間は変わらないが,同時に複数
のプログラムが実行できるので,スループットが改善される.
性能を実行時間で評価する場合は,
性能=1/実行時間
で評価できる.2 つのシステム A, B の性能を比較する場合は,比で評価する.
相対性能 =
性能A
性能B
分母に来るシステムを基準に,分子のシステムがどれだけ良いか(悪いか)を表す.
実行時間の意味を明確にしよう.プログラムの実行を開始して,結果が出てくる(終了する)ま
での時間を経過時間 (elapsed time) というが,これで実行時間とするやり方がある.まさに,あな
たが感じる時間である.経過時間の中には,ディスクのアクセス,入出力,メモリアクセス,OS の
オーバーヘッドなど,が含まれている.複数のプログラムがタイムシェアリングの環境下で動いて
いる場合は,別のプログラムが動いている時間も経過時間に含まれてしまう.ここで,タイムシェ
アリングとは,複数のプログラムを並行して実行する方式で,一定時間(たとえば 10msec)ごと
に実行するプログラムを切り替える方式である.このようにすれば,たとえば 1 秒という時間で見
たとき,複数のプログラムが同時に走行しているように見える.
そのプログラムが実際に CPU(central processing unit, 中央処理装置;プロセッサの心臓)を
使用した時間で評価する場合もある.これを CPU 時間という.CPU 時間は,さらに 2 つに分け
られる.ユーザ CPU 時間とシステム CPU 時間である.プログラムを実行する場合,入出力文
(たとえば,C の printf 文)の実行は.OS が手助けをする.具体的にはシステムコールと呼ばれ
る呼び出しを行って,printf 文の実行を OS に依頼する.その理由は,入出力装置をユーザがプロ
グラムで勝手に操作すると,入出力装置が正しく動作しなくなる危険性があるからである.このよ
6
うに,OS がユーザに代わって実行するのに使った時間をシステム CPU 時間といい,CPU 時間か
らシステム CPU 時間を引いたものをユーザ CPU 時間という.
t
1クロック
図 3: クロック
コンピュータシステムは,動作タイミングを与える信号,これをクロックという,に合わせて動
作を行う.このことを,クロックに同期して動作するという.クロックは,図 3 に示すような矩形
波(方形波とも言う)であり,周期波形である.波の立ち上がりから次の立ち上がりまでを 1 周期
あるいは 1 クロックと言い,その時間をクロックサイクル時間という.1 秒間に繰り返される波の
数(クロック数)を周波数といい,単位を Hz(ヘルツと読む)で表す.クロックサイクル時間を
T とすれば,周波数 f は
f=
1
T
である.
演習 1 p.28 相対性能
1 命令の実行に何クロックを要するかは,命令の種別によって異なるし,同じ命令(たとえば加
算)でもコンピュータによって異なる.
CPU 時間を性能とする場合は,プログラムの実行に必要なクロックサイクル数がわかれば,次
式で CPU 時間を求めることができる.
CPU 時間 = クロックサイクル数 × クロックサイクル時間 =
クロックサイクル数
周波数
また,実行した命令数がわかると,命令あたりの平均クロック数がわかる.これを CPI(clock
per instruction) という.すなわち,
CPI =
クロックサイクル数
実行した命令数
である.
CPI を用いれば,CPU 時間は次式で記述できる.
CPU 時間 = 命令実行数 × CPI × クロックサイクル時間
演習 2 p.31 性能の改善
演習 3 p.32 性能方程式の使用
演習 4 p.33 コード系列の比較
1.6
電力の壁
LSI の集積度が大きくなり,動作周波数が高くなると,LSI の消費電力が増える.CMOS は,か
つては(動作周波数が低かった頃)は,消費電力が極めて小さい素子として重宝された.それは,
7
CMOS 回路は,出力が 0 から 1 に変化するときあるいは 1 から 0 に変化するときに電力を消費し,
それ以外の時はほとんど電力を消費しないからである4 .
(図 4 参照.入力が 0 から 1 に変わるとき
あるいは 1 から 0 に変わるとき,出力が変化する.
)出力が変化するのに要する時間(コンデンサ
を充電する時間あるいは放電する時間)は極めて短いので,動作周波数が低かった頃は,無視でき
る時間だったのである.ところが,動作周波数が高くなってくると,その時間が無視できなくなり,
たとえば全体の 50%の時間は電力を消費しているということになってしまう.
図 4 の充電電流と放電電流が消費電力となる.この消費電力は,電源電圧を V ,コンデンサの
容量を C とするとどちらの場合も 12 CV 2 である5 .動作周波数を f とすると,1 秒間の消費電力は
1
2
2 CV f
× 2 となる.
(×2 は 1 クロックの間に立ち上りと立下りを考慮した場合である.
)したがっ
て,LSI 全体では,その中にある CMOS 回路の数を掛けただけの消費電力となる.
(ワーストケー
スで)
立ち上り
立ち下り
C
C
放電電流
充電電流
図 4: CMOS 回路:赤の矢印は,電流の流れる経路を示す.
LSI の消費電力を減らすには,電源電圧を下げるか周波数を下げるしかない.
(CMOS 回路の数
を減らすことはしたくない.C は回路技術から決まるので減らすことは困難である.
)電源電圧は
昔は 5V が標準だったが,最近は 3.3V とか 1.1V になっている.周波数も落としたくないが,背に
腹は代えられないとして,増加させることは行われてないようである.
(3.4GHz どまり?)
LSI に入るトランジスタ数は増加しているので,それを使わない手はない.電力の壁とうまく折
り合ってやっていくこと(性能をあげること)はできないか?それがマルチプロセッサ化である.
1 つの LSI の中に複数のプロセッサを構築する.LSI の中のプロセッサはコアと呼ばれる.これら
のコアが並列に動作すれば,コア数分の性能向上が期待できる.少々周波数を落としてもトータル
として性能が上がることが期待できる.最近の LSI はこの方向に進んでいる.コアをフルに並列動
作させる研究も積極的に行われている.
[例 ]
電源電圧 V = 3.3V ,コンデンサ容量 C = 0.01pF ,動作周波数 f = 109 ,トランジスタ数 n = 108
とし,1 クロックあたり平均 0.1%のトランジスタが動作している(出力変化を起こす)ものとす
る.この時の電力消費量は,
1 トランジスタあたり,2 × C2 V 2 × f = 2 × 21 × 0.01 × 10−12 × 3.32 × 109 = 10−4 (W )
チップ全体では,10−4 × n × 0.1 × 10−2 = 10−4 × 108 × 10−3 = 10(W )
すなわち,10W の消費電力になる.
4 電力は電圧と電流の積である.COMS 回路では,出力が変化するとき以外は電流が流れないように構成されている.
(実際は完全に流れないのではなく極めて微小な電流が流れる.
)したがって,出力が変化するとき以外の消費電力は 0 で
ある.
5 詳しくは,たとえば,http://jaco.ec.t.kanazawa-u.ac.jp/edu/micro1/pdf/5.2.pdf を参照してください.
8