[パタヘネ:読書メモ]付録B アセンブラ,リンカ,SPIMシミュレータ その2
B.6 手続き呼出し規約 分割コンパイルする場合は、各コンパイル単位で関数の引数・戻り値をどうやって(=どのレジスタに)セットするかのルールが必要でそのルール手続き呼び出し規約(calling convention)と呼ぶ。 例えばIntel CPUの場合だけでも、以下のようなものがある。 cdecl fastcall stdcall safecall thiscall Pascal Intel ABI x86-64cdecl fastcall stdcall safecall thiscall Pascal Intel ABI x86-64 呼び出し規約が異なるobjやlibフ…
続きを読む
[パタヘネ:読書メモ]付録B アセンブラ,リンカ,SPIMシミュレータ
B.1 はじめに コンピュータが理解できるのは0/1の羅列である機械語のみだけど、機械語だと人が読みづらいので、アセンブリ言語を用意した。アセンブリ言語は、機械語と1:1に対応する名前を付けることで、人が読みやすくなる。この名前(命令)をニーモニックと呼ぶ。 アセンブリ言語を機械語に置き換えるために、アセンブラというプログラムを使用する。 素のアセンブリ言語だけだと、表現できる幅が狭いので、マクロ機能を設ける事が多い。 アセンブリのプログラム(.asm)は、アセンブリ->リンクという経緯を経て実行ファイルが作成される。 また、.asmファイルはニーモニック以外にも情報を記述できる場合が多い。あ…
続きを読む
「CPUの創りかた」は、パタヘネ本の次に必読の一冊
CPUの創りかた CPU設計の超入門書として良書とという評判だったので、読んでみました。 表紙の絵は、書店で買うにはちょっと恥ずかしい感じですが、内容は至って真面目です。 説明の順序が良くて文章も平易で非常に読みやすかったので3時間程度での読了でした。すんなり内容が入ってきたのは、本書の読みやすさももちろんですが、先にパタヘネ本を読んでCPUの概要を把握していたのも大きかったです。 文章がどれくらい読み易いかは、以下のサンプルページを見てもらうと一目瞭然です。 専門的な内容にも関わらず、いわゆる教科書っぽい堅苦しさは一切有りません。 この本を読む上での前提知識は、2進数、論理式(AND,OR等…
続きを読む
[パタヘネ:読書メモ]第7章 マルチコアとマルチプロセッサとクラスタ
7.1 はじめに 単一のCPUの能力を向上させるには、密度、発熱量的に限界があるので、可能であれば複数のプロセッサ(マルチプロセッサ)を使用してプログラミングを行いたい。”能力を向上…”の能力には色々な意味があるけど、ここでは単位時間当たりの処理量であるスループットを対象とする。マルチプロセッサで、スループットをあげるには全てのプロセッサに別の仕事(ジョブ)を割り当てればよい。 独立したジョブが沢山ある場合の特性を、ジョブレベル並列性(あるいはプロセスレベル並列性)と呼ぶ。 一方、単一のプログラムのコード片を複数のプロセッサで分散処理する場合は、並列処理プロ…
続きを読む
[パタヘネ:読書メモ]第6章 ストレージおよびその他の入出力の話題 その2
6.7 入出力性能の測定法:ディスクおよびファイル・システムを例にして 省略 6.8 入出力システムの設計 入出力システムを設計する上で、要求される指標値には、バスのバンド幅と応答の遅延(レイテンシ)がある。 無負荷時のレイテンシ試算は簡単だけど、負荷がある場合は設計が難しい。 そのあたりの設計は、待ち行列理論などでシミュレーションさせたりする必要がある。 6.9 並列処理と入出力:RAID 基本的なRAIDの仕組みは常識レベルの話なので省略。 RAID構成の問題点として1台のディスクに故障が出ると、リビルド時に既存ディスクに負荷が高くなる問題がある。既存ディスクも同じ環境に晒されているため、…
続きを読む
[パタヘネ:読書メモ]第6章 ストレージおよびその他の入出力の話題
6.1 はじめに 6.2 信頼性と信頼度とアベイラビリティ 6.3 ディスク・ストレージ 6.4 フラッシュ・ストレージ 6.1~6.4の内容は基本的な事項なので省略 (応用情報処理の試験とかのレベル) 6.5 プロセッサ、メモリ、入出力装置間の接続 プロセッサ、メモリ、入出力装置間はバスで接続されている。 バスのメリットは、汎用的で低コストということ。 バスは大きく3つに分かれる。 プロセッサ-主記憶間バス 最も距離が短く、最も速くする必要がある。 入出力バス 距離が長く、複数のデバイスが接続される。 I/Oが直接メモリに接続されるわけではなく、他のバスを経由して接続される。 …
続きを読む
[パタヘネ:読書メモ]第5章 容量と速度の両立:記憶階層の利用 その5
5.6 仮想マシン VMという言葉からイメージする仮想化は、CPUバイナリ互換性からJavaVM等まで色々なものがある。 だけど、ここで議論するものは、命令セットアーキテクチャ(ISA:interaction set architecture)の互換性についてのみとする。 このようなものを、システム仮想マシン(system virtual machine)と呼び、どんな物なのかはVMwareなどをイメージすると分かりやすい。VMの下のレイヤーにある仕組みをVMM:仮想マシンモニタ(あるいはハイパーバイザ)と呼び、プラットホーム側をホスト、仮想環境をゲストVMと呼ぶ。 この仮想マシンモニタは、非…
続きを読む
[パタヘネ:読書メモ]第5章 容量と速度の両立:記憶階層の利用 その4
5.5 記憶階層間に共通する概念 CPUのL1,L2キャッシュや、仮想記憶など複数の記憶階層間でキャッシュが行われるが、各階層間で似たような技術が使われている。 一方、各記憶階層ではそれぞれ要件(記憶量・速度・キャッシュ場所を求めるのに許容される時間etc)が異なる為、使われる戦略は微妙に異なる。 キャッシュの連想度を上げると、必要なキャッシュが追い出される確率が下がるので、ミス率は低下する傾向にある。但し、キャッシュサイズが大きい時はそもそもキャッシュエントリが競合する確率が低いので、連想度向上の価値が”相対的に”下がる。 キャッシュ方式の戦略 キャッシュ方式には、ダ…
続きを読む
[パタヘネ:読書メモ]第5章 容量と速度の両立:記憶階層の利用 その3
5.4 仮想記憶 仮想記憶を使う目的は主に2つある 複数プログラム間でメモリを効率よく使用する 主記憶以上のメモリ空間を(仮想的に)プログラムが使用できるようにする複数プログラム間でメモリを効率よく使用する 主記憶以上のメモリ空間を(仮想的に)プログラムが使用できるようにする 後者は、仮想アドレスと物理アドレスの変換機能と、他プロセスから自プロセスのメモリ空間をアクセスされないための保護機能がある。 基本的に仮想記憶とキャッシュは同じ考え方だけど、歴史的な経緯により用語がそれぞれで異なっている。 キャッシュミスのことは、仮想記憶の世界ではページフォールトと呼ばれる。 ページフォールが起きるとペ…
続きを読む
[パタヘネ:読書メモ]第5章 容量と速度の両立:記憶階層の利用 その2
5.3 キャッシュの性能の測定と改善 キャッシュの性能の測定を行うためには、CPUの使用時間の式を再定義する必要がある。 メモリアクセスを考慮したCPU使用時間は、以下の式で表すことができる。 CPU時間 = (CPU実行クロック数 + メモリストールクロック数 ) * クロックサイクル数 メモリストールクロック数 = 読出メモリストールクロック数 + 書込メモリストールクロック数 読出メモリストールクロック数 = 読出件数 * 読出ミス率 * 読出ミスペナルティ 書込メモリストールクロック数 = 書込件数 * 書込ミス率 * 書込ミスペナルティ + …
続きを読む
[パタヘネ:読書メモ]第5章 容量と速度の両立:記憶階層の利用
まず基本原則として、コスト的な制約により記憶域には”少量の高速な記憶域”か”大量の低速な記憶域”のどちらかしかない。これは、たとえ十分な資金を用意できたとしても、”より大量”の情報をアーカイブしておく保存領域が欲しくなるので、結局上記の状況になる。 一方、プログラム側としては、大量の記憶域へ高速へアクセスしたいという要望が出てくる。 その結果として、データのキャッシュを行う必要があるけど、キャッシュがなぜ有効かというと、それは以下の原則によっている。 局所性の法則 時間的局所性(temporal locality) 最近使…
続きを読む
[パタヘネ:読書メモ]第4章 プロセッサ その4
4.8 制御ハザード 制御ハザードというのは、分岐命令に起因するハザードの事を意味する。 これがなぜ発生するかというと、分岐条件が成立するかの判定はEXステージで比較演算を行い、その後のMEMステージまで決まらないから。一方で、分岐命令がMEMステージに来るころには、直後3命令分に対してそれぞれIM,ID,EX処理が行われている必要があるので、その分のクロックサイクルが無駄になるリスクがある。 これに関しては、その性質上完全に防ぐ事は出来ないので、どうすれば”よりましか”という考え方になる。 単純な分岐の予測 分岐結果が決まるまで後続の命令実行を止めるというのは、その待…
続きを読む
[パタヘネ:読書メモ]第4章 プロセッサ その3
4.6 データパスのパイプライン化と制御 前の節でも書いたように、MIPSでパイプライン化を検討する際は、以下のステージ分けを行う IF: 命令のフェッチステージ ID: 命令のデコードステージ EX: 実行ステージ MEM:メモリアクセスステージ WB: 書き戻しステージ(write back to register)IF: 命令のフェッチステージ ID: 命令のデコードステージ EX: 実行ステージ MEM:メモリアクセスステージ WB: 書き戻しステージ(write back to register) パイプライン化されたCPU環境で、命令を実行する際、注意が必要なのは2点。 1.WBス…
続きを読む
[パタヘネ:読書メモ]第4章 プロセッサ その2
4.4 単純な実現方式 ここでは、まずシンプルな命令だけを実行できるCPUを作る 4.1でも書いたけど、サポートする命令を再掲しておく。 メモリ参照命令 : lw(load word), sw(store word) 算術論理演算命令: add, sub, and or, slt ジャンプ命令 : beq, jメモリ参照命令 : lw(load word), sw(store word) 算術論理演算命令: add, sub, and or, slt ジャンプ命令 : beq, j 演算を行うためにはALUが必要だけど、今回使用するALUは、以下の演算を行う事が出来るものとする。 Cプログラマ…
続きを読む
[パタヘネ:読書メモ]第4章 プロセッサ
4.1 はじめに この章では、CPUの設計について考える。 だけど、いきなり本格的なCPU設計を考えると難しいので、まずはシンプルなものを設計する。 最初のバージョンで実行可能な命令は以下の9つだけをサポートする。 メモリ参照命令 : lw(load word), sw(store word) 算術論理演算命令: add, sub, and or, slt ジャンプ命令 : beq, jメモリ参照命令 : lw(load word), sw(store word) 算術論理演算命令: add, sub, and or, slt ジャンプ命令 : beq, j CPUの実装をしたいのだけど、CP…
続きを読む
[パタヘネ][C]シフトと加算だけで、掛け算を行う
パタヘネの”第3章:コンピュータにおける算術演算”にある、3.3乗算の補足説明です。 “乗算は、ハードウェア的には、前述した加算処理とシフト処理で実装できる”を確認するために、Cでコードを作成しました。 当然ながら、乗算命令が下記のような形でソフトウェア的に実装されているというわけではないです。 下記のような振る舞いを行う”電子回路が組まれる”という意味だけど、 回路的として説明すると分かり辛いので、説明としてコードとして記述しただけです。 #include <stdio.h> main(…
続きを読む
[パタヘネ:読書メモ]第3章 コンピュータにおける算術演算
3.1 はじめに この章で取り扱う話題の確認 実数や小数のあわら仕方(内部表現) 32bitに収まらない、大きな数の管理方法 四則演算などの計算は、ハードウェア的にどうやって実装されているのか実数や小数のあわら仕方(内部表現) 32bitに収まらない、大きな数の管理方法 四則演算などの計算は、ハードウェア的にどうやって実装されているのか 3.2 加算と減算 2進の加算処理の基本 -> 情報処理試験レベルなので省略 演算処理では、オーバーフローの考慮が必要。 ソフトウェアの都合で、オーバーフローの検出を行いたい場合があるので、どうやって検出すればよいかを考えてみる。 加算において2つの値の符号が…
続きを読む
[パタヘネ:読書メモ]2章 命令:コンピュータの言葉 その4
2.10 32ビットの即値およびアドレスに対するMIPSのアドレシング方式 MIPSの命令長は32bitなので、32bit値をレジスタにセットしたり、32bitアドレス空間の任意の場所にジャンプさせるには工夫が必要。理由は、32bitの中にopcodeやオペランドを指定する場所が必要なので、値の指定には16bitとかしか使えないから。 というわけで、レジスタへの値セットと、ジャンプ命令で指定するアドレスの指定方法を考える。 レジスタに,32bitの値をセットする まず、値のセット方法について。 これは、lui命令(load upper immediate) + ori命令(or immedia…
続きを読む
[パタヘネ:読書メモ]2章 命令:コンピュータの言葉 その3
2.8 コンピュータ・ハードウエア内での手続きのサポート 関数の呼び出し まずは用語の確認 caller 関数の呼び元(親側) callee 関数の呼び出され側(子供側) プログラムカウンタ 現在実行中の命令がある場所(address)caller 関数の呼び元(親側) callee 関数の呼び出され側(子供側) プログラムカウンタ 現在実行中の命令がある場所(address) 関数呼び出しの手続きは以下の流れで行われる。 パラメータのセット ($a0-$a3レジスタを使用) 手続きに処理を移す 手続きに必要なメモリを確保 手続きの実行 結果のセット ($v0-$v1レジスタを使用) 制御を元…
続きを読む
[パタヘネ:読書メモ]2章 命令:コンピュータの言葉 その2
2.4 符号付き数と符号なし数 1の補数と2の補数の話とか 情報処理試験とかで学べるレベルの内容なので飛ばし読み 2.5 コンピュータ内での命令の表現 MIPSのアセンブリ言語では32のレジスタがあり、例えば以下のような割り当てになっている $t0-$t7は、レジスタ8-15 $s0-$s7は、レジスタ16-23$t0-$t7は、レジスタ8-15 $s0-$s7は、レジスタ16-23 MIPSアセンブリと機械語の割り当てについて 例えば add $t0, $s1, $s2add $t0, $s1, $s2 は、以下の機械語に対応付けられる(10進表記) 0,17,18,8,0,320,17,1…
続きを読む