CSAPP 4章 プロセッサ・アーキテクチャ
アドレシングモード
命令のオペランドの 指定法
IMMとか(%rax)でメモリの中身を参照するとかの書き方
CISC vs RISC
CISC「complex instruction set computer」
複雑な命令セット
RISC「reduced instruction set computer」
単純な命令セット
CISC | RISC | |
---|---|---|
命令種 | 大量 | 100以下 |
実行時間 | いくつかは長い命令 | 短いものしかない |
エンコード | 可変長 | 4byte |
アセンブラディレクティブ
コードやデータを置く位置や、それらをどのようにアラインするかを示す
文字列の配置 .ascii, .asciz
ちなみにascizは終端0byte埋めがされているよということらしい
gas
GNU assemblyの略
clangとかはまた別のアセンブリを使っているらしいがgasとの互換性はあるらしい
ロケーションカウンタ
ロケーションカウンタはPCのアセンブラ版らしい
p2align 4 0x90
power of align の略 引数を2の累乗に取る。
つまりロケーションカウンタは16になる。第2引数はパディングをどの値で埋めるか。
x86はshortを基準に作成されているので、16bitつまり2byteがアセンブリの命令の箱というかアライメントとなる。
0x90はnop命令なので、パディングするときはnop命令で埋める。
-falign-functions=32などするとalignを変更することが可能
現代の回路技術では電位が高い素子を1、低い素子を0として扱う。
具体的には高い素子は1V付近のもの、低い素子は0V付近のものとする。
ALU Arithmetic / logic unit
この回路はファンクションコードの入力に応じて、算術 or 論理演算を行う。
ファンクションコードとはMUXのsのようなもの
クロック
順序回路によりビット表現による値の保持を可能にする記憶回路を制御する波形
レジスタファイル
クロック周波数によって複数の値の読み書き操作を行う事ができる。
また内部にビット値を保存出来る順序回路でもある
処理のステージ
フェッチ:PCにある値をメモリアドレスとし、そこから命令を呼び出す。オペランド指定子なども呼び出す。
デコード:オペランドをレジスタから読みだす。
実行:命令によって指定された演算処理をALUなどで行う。
メモリ:メモリへのread/write
ライト・バック:結果をレジスタに書き込む
PCアップデート:PCを更新して次の命令を読み込む
レイテンシ(一回の処理にかかる時間)
スループット(単位時間当たりに処理出来るプロセス数)
パイプライン実装のため、各ステージのレイテンシは均一にしないと行けない。
というのもクロックの動作周波数は決まっているので、一番遅いステージに合った値になってしまうからである。ステージの中でpsが一番遅いものに依存する
パイプラインのステージを増やし続けるとレイテンシははやくなるが、スループットの伸びは悪くなる。
費用対効果的にベストなスループットを模索する必要がある
分岐予測
パイプラインの設計上、フェッチのタイミングで次の処理を決定しないといけない
なぜかというと
プロセッサの処理の順番が、フェッチ→デコード→実行となるので、条件分岐は実行のタイミングでのみ決定できるが、最初の処理のフェッチが終わったタイミングで次の処理のフェッチをいれなければいけないから。
つまり、次の処理がどのPCになるのかを前の処理のフェッチが終わるタイミングで決定しないと行けない
この影響によりレイテンシが長くなることを防ぐために、分岐予測というものが存在する。
これは条件分岐の結果を予め設定しておくことでパイプラインの処理を速くすること。
予測はだいたい60%の確率で成功するようにできている。
予測の正答率が大幅にCPUの性能を向上する例がある
パイプラインハザード
前処理が後続のパイプラインの処理に依存していること。
依存するパターンは2つ
- データ依存
計算結果を後続の命令に使用する依存 - 制御依存
jump, call, retのロケーションの処理における依存
データハザードはnop命令を使用して、パイプライン処理をずらすことによって解決出来る
ストール(失速)
- 進むと不都合な命令があるステージとその上流のステージを停止する.
- より下流のステージは停止せず,バブルを注入する.
下流の命令が上流に依存することをプロセッサが検知したときに、下流の命令が実行される前にバブルと呼ばれる、なにもしない処理(nop命令)を挿入することでハザードを防ぐ一般的な方法。
フォワーディング
下流の演算で上流のデータが必要だと判明した場合、Eステージの前で上流のデータを下流に流すような処理を行う。
これにより、nop命令を必要としないので、速度上昇を助ける。
実装としてはEステージのALUの前にフォワーディングの値を保存しておくMUXを設置することで可能とする
フォワーディングが万能ではなく、ステージのタイミングによっては機能しないことがある。
例えばmov命令がEステージに到達していない段階で、下流のFステージによってmov先の値の読み出しが必要な場合などである。
このような場合に、ストールを組み合わせる必要がある。このときのストールをロードインターロックと呼ぶ。
制御ハザード
jump, call, retの中身の処理を予め設定しておき、処理を進める。
もし不要になった場合途中で命令を破棄する。