ICS中間レビューノート

序文

複数の選択肢

  • 絶対的なオプションに注意してください
  • 選択できない場合は、オプションでピットを見つけることができるかどうかを確認してください。

コンパイル

  • 空白を埋めるときは操作の順序に注意し、括弧を追加するときは括弧を追加してください
  • マシンコードを入力するときは、リトルエンディアン方式に注意してください。
  • 命令の接尾辞とレジスタの長さに注意してください!
  • スタックフレームを埋めるときは、メモリスケールに注意してください

プロセッサー

  • プロセッサのウォームアップサイクル
  • サイクル間の潜在的なデータハザード
  • サイクル数を計算するときは、最初/最後のサイクルを個別に考慮してください
  • それが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
特別価値
  1. 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が設立されました

  2. denormed

  3. INF

3floatおよびint

  1. intにフロートし、直接インターセプトします
  2. 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 11000

其他

  • 注意运行前要填充流水线,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+RPM601000(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)
  • 写回 & 写分配
    • 层次较低的多用,因为不能忍受反复不命中

おすすめ

転載: blog.csdn.net/w112348/article/details/109742106