粗略的学习笔记 后期会整理排版
芯片内部结构
大部分时间在访存。
指令处理步骤:
Pipelining ->利用指令级并行 instruction-level parallelism ILP
- 极大的减小时钟周期【能加速】
- 增加一些延迟和芯片面积
- 问题:
- 具有依赖关系的指令?
- 分支如何处理? ->流水线长度 (指令分多少级) -> Core2的芯片:14级 -> Pentium 4: 大于20级 -> Sandy Bridge:中间
Bypassing 旁路 后者依赖前者的计算结果,通过旁路的形式不需要前者跑完一个周期。 Stalls 停滞 后者依赖前者,前者是访存,后者等待的过程称为停滞。 Branches 分支 条件判断。 -> 分支预测 猜测下一条指令 -> 基于过去的分支记录 -> 基于全局记录的两层预测(参考相关论文) + 现在的分支预测的准确度大于90%。 - 面积增加(有猜的机构) - 可能会增加延迟(时间) -> 分支断定 使用条件语句替换分支 + 不使用分支预测器
提升IPC 常规IPC(instructions / cycle)受限于 1 instruction / clock 超标量 Superscalar 即增加流水线的宽度(三头六臂 - 一头双臂) + 峰值IPC为N (N路超标量) - 增加了面积 (需要更多的资源)
Sandy Bridge 超标量 加宽
指令调度 Scheduling
xor r1,r2 -> r3 add r3,r4 -> r4 sub r5,r2 -> r3 addi r3,1 -> r1 指令间关系: 读后写Read-after-write RAW 互相依赖 写后写Write-after-write WAW 不依赖
措施:
寄存器重命名 Register Renaming
替换寄存器然后实现并行的目的
乱序执行 Out-of-Order OoO Execution 重排指令,获得最大的吞吐率 Fetch->Decode->Rename->Dispatch->Issue->Register-Read->Execute->Memory->Writeback->Commit + IPC接近理想状态 - 面积增加 - 功耗增加
Memory Hierarchy 存储器架构 / 层次
存储器越大越慢
粗略的估计:
大部分时间在存取,即处理数据如何存 取
缓存 caching (利用了时间和空间的临近性) 将数据放在尽可能近的位置 利用: 时间临近性 刚刚用过的东西,再次被用的概率较大(我会经常拿去我时不时要用的东西) 空间临近性 倾向于使用周围临近的数据(我更倾向于将要用的东西放在手的附近)
缓存层次Cache Hierarchy 硬件管理 L1 Instuction / Data caches L2 unified cache L3 unified cache 软件管理 Main memory Disk
存储器的另外设计考虑 分区 Banking 避免多端口(bank confict冲突) 一致性 Coherency 控制器 Memory Controller 多个通道,增加带宽
CPU内部的并行性 指令级并行 Instruction-Level (ILP) extraction 超标量 乱序执行 OoO 数据集并行 Data-Level Parallelism (DLP) 矢量计算 Vectors 线程级并行 Thread-Level Parallelism (TLP) 同步多线程 Simultaneous Multithreading (SMT) 多核 Multicore
向量运算 Vectors Motivation
for(int i=0;i < N;i++) A[i] = B[i] + C[i];
数据集并行 单指令多数据 Single Instruction Multiple Data (SIMD) 执行单元(ALU)很宽 寄存器也很宽 for(int i=0;i < N; i+= 4){ A[i] = B[i] + c[i]; }
x86的向量运算
线程级并行
多核Multicore
锁、一致性和同一性
能量墙
Power Wall
物理瓶颈?
时钟频率无法保持线性增长 结论 CPU是为串行程序优化的