Nvidia CUDA初级教程1 CPU体系架构综述
视频:https://www.bilibili.com/video/BV1kx411m7Fk?p=2本节内容:了解现代CPU的架构和性能优化:
【GPU|Nvidia CUDA初级教程1 CPU体系架构综述】讲师:周斌
- 流水线 Pipelining
- 分支预测 Branch Prediction
- 超标量 Superscalar
- 乱序执行 Out-of-Order (OoO) Excution
- 存储器层次 Memeory Hierarchy
- 矢量操作 Vertor Operations
- 多核处理 Multi-Core
- 执行指令、处理数据的器件
- 完成基本的逻辑和算术指令
- 现在增加了复杂功能
- 内存接口
- 外部设备接口
- 包含大量的晶体管
非常大(上亿…)
- 算术:add r4, r4 -> r4
- 访存:load [r4] -> r7
- 控制:jz end
c y c l e s i n s t r u c t i o n × s e c o n d s c y c l e \frac{cycles}{instruction}\times \frac{seconds}{cycle} instructioncycles?×cycleseconds?
CPI(每条指令的时钟数)&时钟周期
这两个指标彼此并不独立,会存在 trade-off。
桌面应用
桌面应用有以下特点:
- 轻量级进程,少量线程
- 大量分支和交互操作
- 大量的存储器访问
- 真正用于数值计算的指令很少
CPU性能优化 流水线
取指、译码、执行、访存、写回,逻辑上是串行的,但是在实际的CPU实现中,有大量并行优化的部分。流水线利用指令级并行 (instruction-level parallelism, ILP)
Pros: 极大地减小时钟周期
Cons: 但是会增加一些延迟和芯片面积
流水线带来的其他的问题:
- 具有依赖关系的指令怎样处理
- 分支怎么处理
- 流水线的长度,14级/20级?并不是越高越好
- 旁路 Bypassing
- 停滞 Stalls
- 分支 Branches
基于果蛆的分支记录,猜测下一条指令
现代分支预测器的准确度大于90%
Pros: 提升性能及能量效率
Cons: 面积增加、可能会增加延迟
分支断定
用条件语句替换分支
Pros:不适用分支预测器,减小面积,减少错误预测
超标量
常规 IPC (instructions/cycle) 受限于 1 instuction / clock
超标量:增加流水线的宽度
峰值IPC为N(N路超标量),但实际中,会有分支和调度产生的开销,需要一些技巧来接近峰值
Pros: 提升IPC
Cons: 增加了面积、N倍资源占用、旁路网络 N^2、需要更多寄存器和存储器带宽
指令调度
考虑如下指令:
xor r1, r2 -> r3
add r3, r4 -> r4
sub r5, r2 -> r3
addi r3, 1 -> r1
- xor与add互相依赖 (Read-After-Write, RAW)
- sub与addi互相依赖 (RAW)
- xor与sub不依赖 (WAW) ,但是它们会用到同一个寄存器 r3
替换寄存器:
xor p1, p2 -> p6
add p6, p4 -> p7
sub p5, p2 -> p8
addi p8, 1 -> p9
现在xor与sub可以并行执行
乱序执行
重排指令,获得最大的吞吐率
- 重排缓冲区 Reorder Buffer,记录所有执行中的指令状态
- 发射队列/调度器 Issue Queue/Scheduler ,选择下一条执行的指令
Cons: 面积增加、功耗增加
存储器层次
- 存储器越大越慢
- 将数据放在尽可能接近的位置
- 利用:
- 时间临近性:刚刚使用过的数据很可能会被再使用
- 空间临近性:倾向于使用周围的临近的数据
- 硬件管理
- L1、L2、L3缓存
- 软件管理
内存、磁盘
- 分区 banking
- 避免多端口
- 一致性 coherency
- 控制器 memory controller
- 多个通道,增加带宽
- 指令级并行 ILP
- 超标量
- 乱序执行
- 数据级并行 DLP
- 矢量计算
- 线程级并行 TLP
- 同步多线程 SMT
- 多核
for (int i=0;
i
数据级并行:
- 单指令多数据 Single Instruction Multiple Data (SIMD)
- 执行单元(ALU)很宽
- 寄存器也很宽
for (int i=0;
i
x86的向量运算
- SSE2
- AVX
- 线程组成
- 指令流 instruction streams
- 私有寄存器,程序计数器,栈
- 共享全局变量
- 程序员可以创建和销毁
- 程序员或者OS都可以调度
- 将流水线完整复制
- Sandy Bridge-E: 6 cores
- 完整的核,除了最后一级缓存外,不共享其他资源
- 继续保持摩尔定律
- 多核程序核利用率的问题
锁 lock
- 问题:多个线程读写同一块数据
- 解决方法:加锁
- 问题:谁的数据是正确的?
- 解决方法:缓存一致性协议
- 问题:什么样的数据是正确的
- 存储器同一性模型
- 能量墙
- 常规传统单核处理器遇到物理约束,时钟频率 (perf/clock) 无法保持线性增长,免费的午餐要消失了
- 处理器越来越胖,核越来越多
- 单核的性能不会大幅提升
- 另外一堵墙:存储器墙
结论
- CPU为串行程序优化:
- 流水线、分支预测、超标量、乱序执行、…
- 通过高时钟频率和高利用率来降低执行时间
- 缓慢的内存带宽(存储器带宽)将会是大问题
- 并行处理是方向
- Sandy Bridge-E 6-12 活动线程
- 如果有成千上万的活动线程并发执行呢?
https://www.bilibili.com/video/BV1kx411m7Fk?p=2
推荐阅读
- #|【数字IC】深入浅出理解AXI协议
- 程序人生|IDEA 版 Postman 面世了,功能真强大
- 面试|如何实现丝滑般的数据库扩容
- 后端|分布式锁用 Redis 还是 Zookeeper(看完你就明白了)
- AI芯片|存算一体——后摩尔时代的AI芯片架构
- 阅读笔记|GIN(图神经网络有多强大? HOW POWERFUL ARE GRAPH NEURALNET WORKS)
- 后台|nginx网关与gateway网关的区别
- spring|Spring Cloud构建分布式微服务架构 - 企业分布式微服务云架构构建
- java|SpringCloud 分布式微服务架构