Closed27

CSAPP 4章 プロセッサ・アーキテクチャ

bayamasabayamasa

アドレシングモード
命令のオペランドの 指定法
IMMとか(%rax)でメモリの中身を参照するとかの書き方

bayamasabayamasa

CISC vs RISC

CISC「complex instruction set computer」
複雑な命令セット
RISC「reduced instruction set computer」
単純な命令セット

CISC RISC
命令種 大量 100以下
実行時間 いくつかは長い命令 短いものしかない
エンコード 可変長 4byte
bayamasabayamasa

アセンブラディレクティブ
コードやデータを置く位置や、それらをどのようにアラインするかを示す

文字列の配置 .ascii, .asciz
https://suu-g.hateblo.jp/entry/20080510/1210408956

ちなみにascizは終端0byte埋めがされているよということらしい
https://sourceware.org/binutils/docs/as/Asciz.html#index-asciz-directive

bayamasabayamasa

ロケーションカウンタ
ロケーションカウンタはPCのアセンブラ版らしい
https://troter.hatenablog.jp/entry/20070704/1183525887

p2align 4 0x90
power of align の略 引数を2の累乗に取る。
つまりロケーションカウンタは16になる。第2引数はパディングをどの値で埋めるか。
x86はshortを基準に作成されているので、16bitつまり2byteがアセンブリの命令の箱というかアライメントとなる。
0x90はnop命令なので、パディングするときはnop命令で埋める。

bayamasabayamasa

現代の回路技術では電位が高い素子を1、低い素子を0として扱う。
具体的には高い素子は1V付近のもの、低い素子は0V付近のものとする。

bayamasabayamasa

ALU Arithmetic / logic unit
この回路はファンクションコードの入力に応じて、算術 or 論理演算を行う。
ファンクションコードとはMUXのsのようなもの

bayamasabayamasa

クロック
順序回路によりビット表現による値の保持を可能にする記憶回路を制御する波形

bayamasabayamasa

基本的には、ビット値を記憶するにはフリップフロップ回路と呼ばれる回路を用いる。
ただしこの回路を使用しているときに、入力の信号の時間に誤差が存在すると不整合が起きてしまう。
なので入力の信号に誤差を与えては行けない。

そのために、クロック波形という一定の時間を計測して、電気を流すことによって不整合をなくす。
https://engineer-education.com/sequential-circuit_flip-flop/

bayamasabayamasa

処理のステージ
フェッチ:PCにある値をメモリアドレスとし、そこから命令を呼び出す。オペランド指定子なども呼び出す。
デコード:オペランドをレジスタから読みだす。
実行:命令によって指定された演算処理をALUなどで行う。
メモリ:メモリへのread/write
ライト・バック:結果をレジスタに書き込む
PCアップデート:PCを更新して次の命令を読み込む

bayamasabayamasa

レイテンシ(一回の処理にかかる時間)
スループット(単位時間当たりに処理出来るプロセス数)

bayamasabayamasa

GIPS Giga-Instructions Per Second
一秒あたり10億回命令実行出来るか

これをスループットという

bayamasabayamasa

パイプライン実装のため、各ステージのレイテンシは均一にしないと行けない。
というのもクロックの動作周波数は決まっているので、一番遅いステージに合った値になってしまうからである。ステージの中でpsが一番遅いものに依存する

bayamasabayamasa

パイプラインのステージを増やし続けるとレイテンシははやくなるが、スループットの伸びは悪くなる。
費用対効果的にベストなスループットを模索する必要がある

bayamasabayamasa

分岐予測
パイプラインの設計上、フェッチのタイミングで次の処理を決定しないといけない
なぜかというと
プロセッサの処理の順番が、フェッチ→デコード→実行となるので、条件分岐は実行のタイミングでのみ決定できるが、最初の処理のフェッチが終わったタイミングで次の処理のフェッチをいれなければいけないから。

つまり、次の処理がどのPCになるのかを前の処理のフェッチが終わるタイミングで決定しないと行けない

この影響によりレイテンシが長くなることを防ぐために、分岐予測というものが存在する。
これは条件分岐の結果を予め設定しておくことでパイプラインの処理を速くすること。
予測はだいたい60%の確率で成功するようにできている。

予測の正答率が大幅にCPUの性能を向上する例がある
https://pc.watch.impress.co.jp/docs/column/kaigai/1192296.html

bayamasabayamasa

パイプラインハザード
前処理が後続のパイプラインの処理に依存していること。
依存するパターンは2つ

  1. データ依存
    計算結果を後続の命令に使用する依存
  2. 制御依存
    jump, call, retのロケーションの処理における依存
bayamasabayamasa

ストール(失速)

  1. 進むと不都合な命令があるステージとその上流のステージを停止する.
  2. より下流のステージは停止せず,バブルを注入する.

下流の命令が上流に依存することをプロセッサが検知したときに、下流の命令が実行される前にバブルと呼ばれる、なにもしない処理(nop命令)を挿入することでハザードを防ぐ一般的な方法。

bayamasabayamasa

フォワーディング
下流の演算で上流のデータが必要だと判明した場合、Eステージの前で上流のデータを下流に流すような処理を行う。
これにより、nop命令を必要としないので、速度上昇を助ける。

実装としてはEステージのALUの前にフォワーディングの値を保存しておくMUXを設置することで可能とする

bayamasabayamasa

フォワーディングが万能ではなく、ステージのタイミングによっては機能しないことがある。
例えばmov命令がEステージに到達していない段階で、下流のFステージによってmov先の値の読み出しが必要な場合などである。

このような場合に、ストールを組み合わせる必要がある。このときのストールをロードインターロックと呼ぶ。

bayamasabayamasa

制御ハザード
jump, call, retの中身の処理を予め設定しておき、処理を進める。
もし不要になった場合途中で命令を破棄する。

このスクラップは2021/09/30にクローズされました