序文
複数の選択肢
- 絶対的なオプションに注意してください
- 選択できない場合は、オプションでピットを見つけることができるかどうかを確認してください。
コンパイル
- 空白を埋めるときは操作の順序に注意し、括弧を追加するときは括弧を追加してください
- マシンコードを入力するときは、リトルエンディアン方式に注意してください。
- 命令の接尾辞とレジスタの長さに注意してください!
- スタックフレームを埋めるときは、メモリスケールに注意してください
プロセッサー
- プロセッサのウォームアップサイクル
- サイクル間の潜在的なデータハザード
- サイクル数を計算するときは、最初/最後のサイクルを個別に考慮してください
- それがCndであるか!Cndであるかに注意してください
最適化
- メモリエイリアスがクリティカルパスを引き起こす状況に注意してください
- データ依存グラフ
キャッシュ
-
順序に注意してください。デフォルトが最初に進められます。
-
質問を注意深く読んでください!
-
十分な大きさの場所を見つけ、すべてのデータをきちんとリストし、最初に16進数に変換してから、2進数に変換します
Chp2データ
1整数
正の数は負の数としてオーバーフローし、負の数は正の数としてオーバーフローします
assert(0x80000000 > 0); // 十六进制数先转unsigned, 再转long; 这里转成unsigned
int x = 0x80000000;
assert(x < 0);
古典的な例:INT_MIN == -INT_MIN
2浮動小数点
スペースの割り当て
符号 | exp | 正規化された範囲 | フラック | |
---|---|---|---|---|
浮く | 1 | 8 | -126〜127 | 23 |
ダブル | 1 | 11 | -1022〜1023 | 52 |
特別価値
-
に
float nan1 = u2f(0xffc00000u); float nan2 = u2f(0xffc00001u); printf("%d %d\n", nan1==nan1, nan1!=nan1); printf("%d %d\n", nan1==nan2, nan1!=nan2);
結果:
0 1 0 1
簡単に言えば:Nan!= NanHengが設立されました
-
denormed
-
INF
3floatおよびint
- intにフロートし、直接インターセプトします
- int / doubleからfloat、丸め
4TMINについて
cout << (-2147483648 > 0) << endl; // 0
cout << (0x80000000 > 0) << endl; // 1
説明:
16進変換順序int-> unsigned-> long; 10進変換順序:int-> long
したがって、最初のものは長く扱われ、2番目のものは署名されていないものとして扱われます
5ビッグエンディアンとリトルエンディアン
ビッグエンディアン:上位ビットを前に置きます(下位アドレス)
リトルエンディアン:下位が最初(上位アドレス)
その他6
オペレーターの優先順位に注意してください
型変換の場合、最初にサイズを変更してから、符号付き/符号なし変換を実行します
Chp3コンパイル
1基本
フォーマット | 値 |
---|---|
$ Imm | イム |
イム | M [Imm] |
(r1、r2) | M [R [r1] + R [r2]] |
Imm(r1、r2) | |
(、r1、s) | M [s * R [r1]] |
Imm(、r1、s) |
スケーラーは1/2/4/8でなければなりません
登録
%r12〜%r15==%rbxおよび%rbp ==と同じで、どちらも呼び出し先が保存されます
%r8と%r9は、それぞれ5番目と6番目のパラメーターです。
サフィックス
qlwb
leaはqでのみ使用できます
オペランド
単項算術/論理演算のオペランドはメモリにすることができます
2つの2進算術/論理演算オペランドはメモリにすることができます、最初のオペランドは即値にすることもできます
MOVS / ZおよびCMOV命令の最初のオペランドは、メモリにすることができます。2番目のオペランドはレジスタのみにすることができます
CMOV型命令のオペランドを1バイトにすることはできません、レジスタサフィックスで長さを指定します(movbとmovlの接尾辞の意味!)
条件コード
命令 | 条件コード |
---|---|
leaq | 条件コードなし |
株式会社/ 12月 | CFではなくZFとOFを設定する |
論理演算 | CFとOFを0とします |
シフト操作 | CFとOFを0とします |
命令 | 状態 | 備考 |
---|---|---|
setl | OF ^ SF | |
setb | CF | |
セット | SF | マイナスの場合 |
2まれな組み立て手順
データ転送関連
命令 | 効果 | 備考 |
---|---|---|
cltq | %eax記号を%raxに拡張します | longをquadに変換 |
movabsq | movabsqのオペランドは即値であり、64ビットにすることができます。宛先はレジスターのみです | そして通常のmovqは32ビットしかできません |
算術関連
シフト操作:kは==%cl ==(シングルバイト)に格納でき、下位mビットで取得されます
sar:オペランドが1つしかない場合、kは1です。
命令 | 効果 | 備考 |
---|---|---|
(i)mulq S | rdx:rax ←\ leftarrow← S * rax | iは 符号付きの番号を意味し、それ以外の場合は符号なしの番号です |
cqto | rdx:rax ←\ leftarrow←ラックス | クワッドを10月に圧縮 idivqを使用する前のCqto divqを使用する前にrdxをクリアする |
(i)divq | rax ←\ leftarrow← rdx:rax / Srdx←\ leftarrow← rdx:rax%S |
注意Sは除数です |
ジャンプ関連
jmp *%rax
jmp *(%rax)
プロセス関連
leave
と同等です:
movq %rbp, %rsp
popq %rbp
retが続く
3ロジック
レビュー資料を見るP6〜7
スイッチに注意してください:jmp *JUMP_LIST(, index, 8)
、== * ==は重要です!
4プロセス
スタックフレームレイアウト
- (Rbp)
- 登録(呼び出し先を保存)
- ローカル変数(必ずしも8バイトのアライメントではなく、構造体のアライメントと一致します)
- 7番目以上のパラメーター(すべて8バイトの配置、%rsp + 8 *(k-6))
- 差出人住所RA
callとjmpは一般的に相対コーディングを使用します
5浮動小数点
%xmm0の戻り値
%xmm0〜78パラメータ
Chp4Y86プロセッサ
CFなしの条件コード
レジスタに%r15がありません
通話は絶対的にのみアドレス指定でき、PCの相対アドレス指定はできません
%rspの動作をプッシュ/ポップ:常に元の値を処理します
論理ゲート
丸いものはAND、鋭いものはORです(文字の形の逆です)
CISCとRISC
インデックス | CISC | 危険 |
---|---|---|
ディレイ | 異なる長さ | すべて短い |
エンコーディングの長さ | 可変長 | 固定長(4バイト) |
メモリアドレス指定 | 多様な | ベースアドレスとオフセットアドレス指定のみ |
メモリアクセス | 算術/論理演算はメモリにアクセスできます | ロード/ストアアーキテクチャ |
算術/論理演算オペランド | 記憶になります | レジスターにしかなれません |
抽象化の程度 | 概要 | 詳細が表示されます |
条件コード | 持ってる | 番号 |
処理する | 密集したスタック | 集中的に登録する |
例えば |
概念
ディレイ:命令を最初から最後まで処理するのにかかる時間
スループット:単位時間あたりに処理される命令の総数(単位:GIPS、または命令数/ ns)
スループット= 1最大モジュール遅延+レジスタ遅延(ps)∗ 1000スループット= \ dfrac {1} {最大モジュール遅延時間+レジスタ遅延(ps)} * 1000唾液量を飲み込む=最も大きなモールドブロックの遅延時間+レジスタメモリデバイスの遅延時間(P S )1∗1000
其他
- 注意运行前要填充流水线,5阶段流水线要填充4个周期
- 注意循环可能导致潜在的数据冒险
- 计算周期数时,注意单独考虑第一次/最后一次循环
Chp5 优化
循环展开级数并不是越多越好,考虑容量不命中(寄存器也算)
Chp6 缓存
RAM
晶体管数/bit | 访问时间 | 成本 | 应用 | 敏感 | |
---|---|---|---|---|---|
SRAM | 6 | x1 | x1000 | 缓存 | 否 |
DRSM | 1 | x10 | x1 | 内存 | 是 |
传统DRAM
超单元:由 ω \omega ω个单元组成
DRAM芯片有rc=d个超单元
访问DRAM内容时,先发RAS请求,DRAM取出相应行的数据,放进一个缓冲区,再发CAS请求,复制出相应的 ω \omega ω位数据。RAS和CAS占用相同的引脚。两次发送是为了降低芯片的引脚数量
总共需要 ω + m a x ( l o g 2 r + l o g 2 c ) \omega+max(log_2r+log_2c) ω+max(log2r+log2c)个引脚
增强DRAM
名称 | 特点 |
---|---|
FPM | 对于同一行数据的访问,可以直接从缓冲区中读取,只发一次RAS请求即可 |
EDO | FPM的增强 |
SDRAM | 比异步的更快 |
DDR SDRAM | 相比SDRAM速度翻倍 |
VDRAM | 对图形系统的优化 |
ROM
擦写次数 | 应用 | |
---|---|---|
PROM | 1 | |
EPROM | 1000 | |
EEPROM | 10^5 | 闪存、SSD |
固件:ROM上的程序,例如BIOS、驱动程序
BUS
总线事务:读事务、写事务
总线:系统总线、内存总线
DISK
注意单位GB与GiB的区别
盘面->表面->磁道->扇区
柱面,个数等于每个表面的磁道个数
计算磁盘容量:注意每个盘片有两个表面
计算访问时间: = T a v g s e e k + 60 ∗ 1000 R P M ∗ ( 1 2 + 1 磁 道 平 均 扇 区 数 ) =T_{avg\ seek} + \dfrac{60*1000}{RPM}*(\dfrac{1}{2}+\dfrac{1}{磁道平均扇区数}) =Tavg seek+RPM60∗1000∗(21+磁道平均扇区数1)
寻道时间和旋转延迟大致相等,所以可以用寻道时间*2估计旋转延迟
磁盘控制器将物理磁盘与逻辑磁盘之间建立映射
概念:内存映射I/O
概念:DMA直接内存访问
SSD
读比写快
以页为单位读写
一页被擦除后才能写入数据
写慢的原因
- 擦除慢,1ms量级(读是50us量级)
- 若块中已有数据,要先复制
Cache
一路(way)有很多行(line)
缓存不命中的几种特殊情况
- 冷不命中/强制性不命中
- 冲突不命中
- 容量不命中
计算Cache Size
c a c h e s i z e = d a t a s i z e + ( v a l i d b i t s i z e + t a g s i z e ) ∗ b l o c k n u m b e r cachesize = datasize + (validbitsize + tagsize) * blocknumber cachesize=datasize+(validbitsize+tagsize)∗blocknumber
Cache参数的影响
命中时间 | 命中率 | 不命中处罚 | 有效数据占比 | |
---|---|---|---|---|
缓存大 | 增大(理解) | 增大(减少容量不命中) | —— | —— |
块大 | —— | 块大,空间局部性提高; 行数变小,时间局部性降低 |
增大(复制成本) | 增大 |
组相连度高 | 增大(理解) | 减少冲突不命中/抖动 可能放大容量不命中的影响 |
增大(选择牺牲行的成本) | 减小(tag位变长) |
存储结构越往下走,就越不能忍受不命中,宁可牺牲一点命中时间,因此会选择更高的组相连度
写策略影响
- 直写 & 非写分配
- 减少总线流量,增大复杂性(修改位dirty bit)
- 写回 & 写分配
- 层次较低的多用,因为不能忍受反复不命中