Transcript Document

情報システム基盤学基礎1
情報システム基盤学基礎1
コンピュータアーキテクチャ編 第2回
命令
高性能コンピューティング学講座
三輪 忍
[email protected]
1
情報システム基盤学基礎1
本日の講義内容
• プログラムと命令
• 命令セットアーキテクチャ
2
情報システム基盤学基礎1
プログラムと命令
3
プログラム
• 身近な例
• Word
• Excel
• iTunes
など
• コンピュータに行わせたい処理を記述したもの
情報システム基盤学基礎1
5
プログラムの記述方法
• プロセッサごとに決められている言語仕様がある
• アメリカ人と話すなら英語
Hello!
Hello!
• 中国人と話すなら中国語
您好!
您好!
• 言語仕様に沿って記述しないと思い通りに動かない
• アメリカ人に中国語で話しかけても伝わらない
您好!
Yes
we can!
情報システム基盤学基礎1
6
命令
• プロセッサへの指示の単位
• 例: 「c = a + b」(a と b を足して c に代入)
「c = a << b」(a を b ビット分 シフトして c に代入) など
• a, b, c のような処理の対象はデータと呼ばれる
• 機械語
• 命令をビット列で表現したもの(例: 「0100101…」)
• ビット: 2 進数の 1 桁分(0 or 1)
• 異なる命令  異なるビット列
• プロセッサは機械語を解釈・実行
add $t1, $s1, $s2
add $t2, $s3, $s4
sub $s0, $t1, $t2
[ プログラム ]
• アセンブリ言語
• 機械語を人間に(少し)わかりやすくしたもの(例: add $t1, $s1, $s2)
• 機械語と 1 対 1 対応
• 命令の組み合わせによりプログラムを作成
高級言語とコンパイラ
• 機械語やアセンブリ言語の問題点
• 人間には(まだ)わかりにくい
• プログラミング作業が大変
• 高級言語
Ex.) Fortran, C, Java, Ruby, …
• これなら何とかなる(for 人間)
• 理解不能(for コンピュータ)
高級言語
機械語
コンパイル
• コンパイラ
• 翻訳を行うプログラム(例: gcc, LLVM, VC など)
• 高級言語で記述されたものを機械語へと変換(変換処理=コンパイル)
情報システム基盤学基礎1
8
プログラムの格納場所
• メモリに格納(プログラム内蔵方式)
• プロセッサはメモリから命令を順に取得
• 取得した命令にしたがって処理を行う
メモリ
プロセッサ
add $t1, $s1, $s2
add $t2, $s3, $s4
sub $s0, $t2, $t3
• 理由:便利だから
• メモリの内容を書き換えるだけで別の
プログラムを実行可能
• 1960年代まではプログラムをパンチ
カードに記録して読み込んでいた
• プログラムがハードウェア化されていた
時代もあった(書き換え不可)
[ プログラム内蔵方式 ]
[ パンチカード ]
情報システム基盤学基礎1
9
プログラムの格納方式による分類
• フォンノイマン型アーキテクチャ
• データ用と同じメモリに命令を格納
• 利点: 作りが単純
• 欠点: 命令へのアクセスとデータへのアクセスが衝突
• ハーバードアーキテクチャ
• 命令用のメモリがデータ用とは別に存在
• 利点: 命令へのアクセスとデータへのアクセスが独立
• 欠点: 作りは複雑
• 上記の分類は過去のもの
• 今はフォンノイマン型アーキテクチャにハーバード
アーキテクチャの思想を取り入れたものが多い
(「記憶階層」で詳しく説明)
メモリ
命令
データ
プロセッサ
[ フォンノイマン型
アーキテクチャ ]
メモリ
プロセッサ
メモリ
[ ハーバードアーキテクチャ ]
情報システム基盤学基礎1
10
命令のアドレスとプログラムカウンタ
• データとアドレス
アドレス メモリ
• データ: 中身(例: 電通大)
0 add $t1, $s1, $s2
• アドレス: 場所
4 add $t2, $s3, $s4
(例: 調布市調布ヶ丘1-5-1)
8 sub $s0, $t2, $t3
• 命令のアドレス
• プログラム内蔵方式では命令も
メモリに格納
• 命令にもアドレスが存在
64
68
72
プロセッサ
PC
100
10
500
• プログラムカウンタ(PC)
• プロセッサ内にある小さなメモリ
• 実行する命令のアドレスを示す
• プロセッサはプログラムカウンタにしたがって命令をメモリから取得
8
4
0
情報システム基盤学基礎1
プログラムの基本構造
メモリ
プロセッサ
PC
• レジスタ
• プロセッサ内にある高速&小容量のメモリ
• データを一時的に格納する場所
• 同時に格納できるデータは高々 64個程
レジスタ
• ほとんどの命令はレジスタに対して処理を行う
• メモリ上のデータに対する処理は低速なため
• プログラムの基本構造
• メモリ上のデータの値をレジスタにコピー
• レジスタの値を使って演算を繰り返す
• 結果が入ったレジスタの値をメモリに書き戻す
• レジスタに別のデータを割り当てるため
メモリ
からの
コピー
演算
書き
戻し
レジスタ
lw $s1, 0($t0)
lw $s2, 4($t0)
lw $s3, 8($t0)
lw $s4, 16($t0)
add $t1, $s1, $s2
add $t2, $s3, $s4
sub $s0, $t1, $t2
sw $s0, 16($t0)
情報システム基盤学基礎1
12
命令セットアーキテクチャ
情報システム基盤学基礎1
13
コンピュータアーキテクチャ(前回の復習)
• ハードウェアとソフトウェアのインタ
フェース
命令セットアーキテクチャ
• ソフト側から見た場合
• ハード内の振る舞いを隠ぺい
• ソフトが利用可能な機能を定義したもの
• ハード側から見た場合
• ハードが実現すべき機能を定義したもの
• 実現のためのハードウェア設計
アプリケーション
(Word, Excel 等)
システムソフトウェア
(OS,コンパイラ等)
コンピュータ
アーキテクチャ
論理回路
ソフトウェア
ハードと
ソフトの
インタ
フェース
+
ハード
設計
ハードウェア
電子回路
情報システム基盤学基礎1
14
命令セットアーキテクチャ
• ソフトウェアとハードウェアの間の契約
• ソフトウェアが利用可能な命令の一覧
• ハードウェアが処理可能な命令の一覧
• プロセッサの性能や複雑さを決める重要なもの
• 複雑な命令の採用
ハードウェアの複雑化,性能の向上(?)
• 単純な命令の採用
ハードウェアの簡単化,性能の低下(?)
• さまざまな命令セットアーキテクチャが存在
• 例: x86, ARM, POWER, SPARC, MIPS など
• 現在は本質的な差はほとんどない
• 同じ目標(コンパイラの開発が容易,プロセッサが高性能,低消費電力,
低価格など)を目指して開発を進めてきた結果
情報システム基盤学基礎1
15
MIPS 命令セットアーキテクチャ
• 主に組み込みシステムで使われていた
• 例: CISCO のルータやプリンタ,NINTENDO64, PS, PS2 など
[ MIPS命令セットアーキテクチャの一部 ]
• 特徴
• 命令長を 32 ビットに統一
• 32 本の汎用レジスタと
32 本の浮動小数点レジスタ
• レジスタの幅は 32 ビット
(のちに 64 ビット)
• 仕様がきれいなため,
アーキテクチャの
授業でよく使われる
情報システム基盤学基礎1
16
命令の基本構造
オペランド
• オペコード
• 処理の種類
• 例: add, sub, lw など
オペコード
• オペランド
• 処理の対象
• 例: $s0, 0($t0), 100 など
• オペランドの数はオペコードによって異なる
lw
lw
lw
lw
add
add
sub
sw
$s1,
$s2,
$s3,
$s4,
$t1,
$t2,
$s0,
$s0,
0($t0)
4($t0)
8($t0)
16($t0)
$s1,
$s2
$s3,
$s4
$t1,
$t2
16($t0)
情報システム基盤学基礎1
17
フィールドと命令形式
• アセンブリ言語と機械語の対応例
• アセンブリ言語: add $t1, $s1, $s2
• 機械語:
フィールド
32ビット
000000
10001
10010
01001
00000
100000
6ビット
(add)
5ビット
($s1)
5ビット
($s2)
5ビット
($t1)
5ビット
(未使用)
6ビット
(add)
• 命令形式
• フィールドの構成の違いによる命令の分類
• MIPS の場合は 3 種類の命令形式が存在
情報システム基盤学基礎1
18
MIPS の命令形式
• R 形式
op
rs
rt
rd
shamt
funct
6ビット
5ビット
5ビット
5ビット
5ビット
6ビット
op
rs
rt
constant or address
6ビット
5ビット
5ビット
16ビット
• I 形式
• J 形式
op
address
6ビット
26ビット
op: オペコード
shamt: シフト量
rs: 第1オペランド
funct: 機能コード
rt: 第2オペランド
constant: 定数
rd: 第3オペランド
address: アドレス
情報システム基盤学基礎1
MIPS 命令の種類
算術演算命令
論理演算命令
データ転送命令
分岐命令
19
情報システム基盤学基礎1
20
算術演算命令
• 四則演算などの算術演算を行う命令
• 例: add, sub, mult, div, addi など
• 命令形式は R 形式または I 形式
• オペランドはレジスタまたは定数(即値)
• MIPS の算術演算ではメモリアドレスを指定できない
命令
形式
アセンブリ言語
意味
add $t1, $s1, $s2 $t1 = $s1 + $s2
R
sub $t1, $s0, $s3 $t1 = $s0 - $s3
I
addi $t1, $s0, 66 $t1 = $s0 + 66
機械語
000000 10001 10010 01001 00000 100000
$s1
$s2
$t1
add
000000 10000 10011 01001 00000 100010
$s0
$s3
001000 10000 01001
addi
$s0
$t1
$t1
sub
0000000001000010
66
情報システム基盤学基礎1
21
論理演算命令
• 論理演算を行う命令
• 例: and, or, andi, sll など
• 命令形式は R 形式または定数
• オペランドはレジスタまたは定数
• メモリアドレスの指定不可
命令
形式
アセンブリ言語
意味
機械語
and $t1, $s1, $s2 $t1 = $s1 & $s2 000000
R
sll $t1, $s0, 4
I
$t1 = $s0 << 4
andi $t1, $s0, 10 $t1 = $s0 & 10
10001 10010 01001 00000 100100
$s1
$s2
$t1
and
000000 00000 10000 01001 00100 000000
$s0
001100 10000 01001
andi
$s0
$t1
$t1
sll
4
0000000000001010
10
情報システム基盤学基礎1
22
データ転送命令
• メモリ  レジスタ間のデータ転送を行う命令
• 例: lw, sw など
• 命令形式は I 形式
• オペランドはレジスタまたはアドレス
命令
形式
アセンブリ言語
意味
機械語
lw $s2, 4($t0)
$s2=M[$t0+4]
100011 10010 01000
sw $s0, 16($t0)
M[$t0+16]=$s0
101011 10000 01000
I
lw
sw
$s2
$s0
$t0
$t0
0000000000000100
4
0000000000010000
16
※ M[X]: メモリアドレス X に対応するメモリ上のデータ
情報システム基盤学基礎1
23
分岐命令
• 次に実行する命令を変更する命令※
• 無条件に変更する命令: j, jr など(goto 文,switch 文に相当)
• 条件に応じて変更する命令: slt + beq, bne など(if 文に相当)
• 命令形式は R 形式,I 形式,J 形式
※ 通常はメモリ上の並びの
次の命令が実行される
• オペランドはレジスタ,アドレス,定数
命令
形式
アセンブリ言語
J
j
R
jr $t1
R
I
10000
意味
機械語
go to 10000
000010
go to $t1
000000 00000 01001 00000 00000 001000
if ($s2 < $s3)
slt $s1, $s2, $s3 $s1 = 1;
else $s1 = 0;
if ($s1 == $s2)
beq $s1, $s2, 100 go to 100;
00000000000000100111000100
2500※
j
$t1
jr
000000 10010 10011 10001 00000 101010
$s2
$s3
000100 10001 10010
beq
$s1
$s2
$s1
slt
0000000000011001
25※
※ 2ビット左シフトしたものをアドレスとして使用するため
情報システム基盤学基礎1
24
MIPS のアドレシングモード
• アドレシングモード
• オペランドの解釈方法
• 命令によって異なる
• MIPS のアドレシングモード
• 即値アドレシング
• 命令中に指定された定数をオペランドとする(例: addi $t1, $s0, 66)
• レジスタアドレシング
• レジスタをオペランドとする(例: sub $t1, $s0, $s3)
• ベース相対アドレシング
• 命令中の定数とレジスタの和によってオペランドのアドレスを表す(例: lw $s2, 4($t0))
• PC相対アドレシング
• 命令中の定数と PC の和によってメモリアドレスを表す(例: beq $s1, $s2, 100)
• 疑似直接アドレシング
• 命令中の 26 ビットと PC の上位ビットを連結したものを分岐アドレスとする(例: j 10000)
情報システム基盤学基礎1
25
プログラムの実行例(分岐を含まない場合)
アドレス
0
4
8
12
16
20
24
28
1024
1028
1032
1036
1040
プロセッサ
メモリ
lw $s1, 0($t0)
lw $s2, 4($t0)
PC
4
0
$s2
$s1 = M [1024 + 4]
0]
実行中
の命令
レジスタ
lw $s3, 8($t0)
lw $s4, 16($t0)
add $t1, $s1, $s2
add $t2, $s3, $s4
sub $s0, $t1, $t2
sw $s0, 16($t0)
20($t0)
100
10
42
3
0
8 ($t0)
9 ($t1)
10 ($t2)
16 ($s0)
17 ($s1)
18 ($s2)
19 ($s3)
20 ($s4)
1024
情報システム基盤学基礎1
26
プログラムの実行例(分岐を含まない場合)
アドレス
0
4
8
12
16
20
24
28
1024
1028
1032
1036
1040
プロセッサ
メモリ
lw $s1, 0($t0)
lw $s2, 4($t0)
PC
12
20
16
24
実行中
の命令
$t2
$s3
$s4
$t1
$s2
$s0==$s1
$t1 +- $t2
lw $s4, 16($t0)
レジスタ
lw $s3, 8($t0)
lw $s4, 16($t0)
add $t1, $s1, $s2
add $t2, $s3, $s4
sub $s0, $t1, $t2
sw $s0, 16($t0)
20($t0)
100
10
42
3
0
8 ($t0)
9 ($t1)
10 ($t2)
1024
110
45
16 ($s0)
17 ($s1)
18 ($s2)
19 ($s3)
20 ($s4)
65
100
10
42
3
情報システム基盤学基礎1
27
プログラムの実行例(分岐を含まない場合)
アドレス
0
4
8
12
16
20
24
28
1024
1028
1032
1036
1040
プロセッサ
メモリ
lw $s1, 0($t0)
lw $s2, 4($t0)
PC
24
28
実行中
の命令
M [1024+16] = $s0
sub $s0, $t1, $t2
レジスタ
lw $s3, 8($t0)
lw $s4, 16($t0)
add $t1, $s1, $s2
add $t2, $s3, $s4
sub $s0, $t1, $t2
sw
($t0)
sw $s0,
$s0, 16
16($t0)
100
10
42
3
0
8 ($t0)
9 ($t1)
10 ($t2)
1024
110
45
16 ($s0)
17 ($s1)
18 ($s2)
19 ($s3)
20 ($s4)
65
100
10
42
3
情報システム基盤学基礎1
28
プログラムの実行例(分岐を含む場合)
アドレス
0
4
8
12
16
20
1024
1028
lw $s1, 0($t0)
lw $s2, 4($t0)
if ($s1 == $s2)
プロセッサ
メモリ
PC
12
4
0
8
実行中
の命令
$s2go= to
$s2
+1
20;
lw $s2, 4($t0)
レジスタ
beq $s1, $s2, 20
addi $s2, $s2, 1
j8
8 ($t0)
9 ($t1)
10 ($t2)
2
0
16 ($s0)
17 ($s1)
18 ($s2)
19 ($s3)
20 ($s4)
1024
2
0
1
情報システム基盤学基礎1
29
プログラムの実行例(分岐を含む場合)
アドレス
0
4
8
12
16
20
1024
1028
lw $s1, 0($t0)
lw $s2, 4($t0)
if ($s1 == $s2)
go to 8
go to 20;
プロセッサ
メモリ
PC
8
12
16
0
実行中
の命令
addi $s2, $s2, 1
レジスタ
beq $s1, $s2, 20
addi $s2, $s2, 1
j8
8 ($t0)
9 ($t1)
10 ($t2)
2
0
16 ($s0)
17 ($s1)
18 ($s2)
19 ($s3)
20 ($s4)
1024
2
0
1
情報システム基盤学基礎1
30
プログラムの実行例(分岐を含む場合)
アドレス
0
4
8
12
16
20
1024
1028
lw $s1, 0($t0)
lw $s2, 4($t0)
if ($s1 == $s2)
go to 20;
プロセッサ
メモリ
PC
8
16
4
0
20
実行中
の命令
j8
レジスタ
beq $s1, $s2, 20
addi $s1,
$s2, $s1,
$s2, 1
j8
8 ($t0)
9 ($t1)
10 ($t2)
2
0
16 ($s0)
17 ($s1)
18 ($s2)
19 ($s3)
20 ($s4)
1024
2
0
2
情報システム基盤学基礎1
31
プログラムが使用するメモリ領域
アドレス
0x00000000
• システムソフトウェアが管理
メモリ
予約済み
PC
• いくつかのセグメントに分けて管理
• テキスト: 命令を格納する領域
• 静的データ: 静的データを格納する領域 $gp
• ヒープ: 動的データを格納する領域
• スタック: 関数呼び出し時にレジスタや
戻りアドレスを格納する領域
0x00400000
テキスト
0x10000000
静的データ
0x10008000
ヒープ
• 頻繁にアクセスするアドレス
• 静的データ・セグメントの末尾,スタックの先頭など
• レジスタ($gp, $sp)に常に保持しておくことによって $sp
メモリアクセスを高速化
0x7ffffffc
スタック
情報システム基盤学基礎1
32
MIPS のレジスタ規約
名前
レジスタ番号 用途
$zero
0
定数 0 が常に格納されているレジスタ 該当しない
$v0-$v1
2-3
結果および式の評価のための値
しない
$a0-$a3
4-7
引数
しない
$t0-$t7
8-15
一時
しない
$s0-$s7
16-23
退避
する
$t8-$t9
24-25
予備の一時
しない
$gp
28
グローバルポインタ
する
$sp
29
スタックポインタ
する
$fp
30
フレームポインタ‡
する
$ra
31
戻りアドレス
する
関数呼び出し時
に退避するか?
† 26-27番の汎用レジスタは OS のカーネルが使用するために予約されている
‡ フレームポインタ: スタック内の最も最近のフレーム領域の末尾を指すポインタ.
フレーム領域とは1回の関数呼び出しによって退避されたデータを格納した領域.
情報システム基盤学基礎1
整列化制約とエンディアン
• 整列化制約
• 32 ビット(1ワード)のデータ(命令)を
4 の倍数のアドレスに配置
• 例: 0, 4, 8, …, 1024, 1028, …
• データへのアクセスを容易にするため
33
X:アドレス
メモリ
メモリ
0
1
2
3
0lw $s1,
2 3
1 0($t0)
4
5
6
7
4lw $s2,
6 7
5 4($t0)
8
9
10
11
8lw $s3,
10 11
9 8($t0)
12
13 14 15
12
14 15
13 16($t0)
lw $s4,
16
17 18 19
16 $t1,
18 $s2
17 $s1,
19
add
20
21 22 23
20 $t2,
add
22 $s4
21 $s3,
23
24
25 26 27
28
29 30 31
整列化
sub $s0,
$t1, $t2
24
25 26
27
28
30 31
29 16($t0)
sw $s0,
20($t0)
• エンディアン
• ワード内のデータの並び順
• ビッグエンディアン: 最上位バイトが最小アドレスの位置
• リトルエンディアン: 最上位バイトが最大アドレスの位置
ビッグエンディアン
• 命令セットアーキテクチャによって異なる
• ビッグエンディアン: MIPS, SPARC など
• リトルエンディアン: x86, ARM など
2048
0A
2049
0B
2050
0C
2051
0D
2048
0D
2049
0C
2050
0B
2051
0A
0A0B0C0D
リトルエンディアン
情報システム基盤学基礎1
34
x86 命令セットアーキテクチャ
• PC とサーバ向けの大多数のプロセッサが採用
• Intel 製と AMD 製のほぼすべてのプロセッサ
• x86 の主な特徴
• 命令長が命令によって異なる
• 汎用レジスタが少ない(8本)
• 1命令で複雑な処理が可能
• 例: メモリから読み込んだ値にレジスタの値を加算し,結果をメモリに格納
• 命令ごとに付加された条件コードを利用して条件分岐を行う
• 条件コード: 実行結果に応じてセットされるフラグ
• 対応する条件コードがセットされている命令の実行を省略
• MIPS とは異なり,条件判定の際に汎用レジスタを消費しない
• SIMD(Single Instruction Multiple Data)命令の追加
• 複数データ(例えば 8 個のデータ)に対して同じ演算を行う命令
• データ並列アプリケーション向け
情報システム基盤学基礎1
35
ARMv7, ARMv8 命令セットアーキテクチャ
• ARM 製のプロセッサが採用
• 組み込み市場をほぼ独占
• ARMv7 の主な特徴
• 命令長は 32 ビット固定
• 汎用レジスタは 16 本(その内の 1 つは PC)
• 条件コードを利用した条件分岐
• 多彩なアドレシングモード(全部で9種類)
• 除算命令がない
• ARMv8 の主な特徴
• 汎用レジスタを 32 本に拡張(PC は別)
• 条件コードの廃止
• 除算命令の追加
情報システム基盤学基礎1
本日のまとめ
36
情報システム基盤学基礎1
まとめ
• プログラムと命令
• 命令セットアーキテクチャ
37
情報システム基盤学基礎1
次回
• 7/2(木) 9:00~
• 「演算」について解説
38