出门左拐, 互联网万千世界

处理器体系结构

指令集架构

x86 ARM
Intel AMD 手机,平板
CISC(复杂指令集) RISC(精简指令集)

Y86架构

详细见书介绍

简介

组成

8个寄存器(%eax,%ecx,%edx,%ebx,%esi,%edi,%esp,%ebp),三个标志位(ZF,OF,SF),一个程序计数器(PC),一个内存

指令集结构

0~5个字节,每个字节由2个十六进制数字表达

位置 作用
0(第一位代码部分,第2位功能部分) 指令类型
1 操作的寄存器
2~5 偏移量,值
大体指令 数字
nop 0
halt 1
mov 2,3,4,5
OPl 6
jxx 7
call 8
ret 9
push A
pop B

Tips:

  1. 内存之间的传送必须要靠寄存器;
  2. 内存不能存储立即数
  3. OPl 指add,sub,and,xor
  4. halt 停止指令的执行(x86是hlt)

逻辑设计和硬件控制语言HCL

逻辑门

组合电路(计算块)

解释: 多个逻辑门的组合如xor

多路复用器电路(根据控制信号来选出使用的电路)用情况表达式来描述

1
2
3
4
5
int Out =[
case1: value1;
case2: value2;
1: defalut;
];

ALU(算数/逻辑单元)就是一种组合电路

存储器和时钟控制

硬件寄存器 存储单个字或位
程序寄存器 寄存器文件,%eax…

此处作者没咋理解…

Y86的顺序实现

流水线(SEQ)

一条指令包括6个操作:

  1. 取指: 读入指令(第0个字节),计算下一条指令的地址
  2. 解码: 读入指定的寄存器
  3. 执行: 执行指令
  4. 访存: 访问内存
  5. 写回: 写回寄存器
  6. 更新PC: 将下一条指令地址更新

SEQ的时序

看不懂QAQ

优化程序性能

浮点数乘法损耗性能较大

优化编译器

通过 -O 来优化会有一定的局限性, 会出现"存储器别名使用"—编译器必须假设指针指向的位置不同, “认为函数有副作用”

表示程序性能

CPE(cycle per element)

循环优化

  1. 代码移动: 将计算结果不会改变的放在循环体外的局部变量
  2. 函数调用: 循环体里尽量不要函数调用(会损坏一定的封装性)
  3. 指针引用: 循环体中减少指针的解引用,可以在循环体外用局部变量储存值

理解现代处理器

超标量乱序执行计数:

  1. 汇编代码上: 好像是一次执行一个指令
  2. 实际上: 是同时对多条指令进行流水线操作的

遇到了分支有三种处理方式: 1.选择分支 2.分支预测 3.两个都要
了解算术操作的执行时间和发射时间, 发现除法(38)和浮点数乘法的性能损耗(5)大
循环展开

单指令多操作寄存器

%xmm 128位
%ymm 256位
%zmm 512位

存储器层次结构