CUDA 编程
现代 CPU 架构和性能优化
CPU的概念:
执行指令,处理数据的器件——完成基本的逻辑和算术指令
增加了复杂的接口
- 内存接口
- 外部设备接口
- 包含大量静晶体管
桌面应用
- 轻量级进程,少量线程
- 分之和交互操作
- 大量存储器访问
- 用于数值运算的指令很少
CPU结构图
取指 译码 执行 访问 写回
流水线
- 利用指令级的并行
- 极大的减小时钟周期
- 但是增加了延迟和芯片面积
分支预测
猜测下一条指令
基于过去的分支记录
如:基于全局记录的两层预测
现代预测器准确度大于 90%
- 提升性能以及能量效率
但是会导致面积增加和延迟
提升 IPC (instructions cycle)即 CPU 一个时钟周期能够处理的指令数
为了处理更多的数据—> 提出了超标量 — 增加流水线宽度
超标量
峰值 IPC 为N(N路超标量)
Peak IPC now at N( for N-way superscalar)
分支调度会产生开销
需要一些技巧来逼近峰值
增加了面积
Area increase
- N 倍资源使用
- 旁路网络
- 需要更多的寄存器的存储器宽度
乱序执行 Out-of-Order — OoO
重排指令,获得最大的吞吐量
重排缓冲区
发射队列/调度器
使得 IPC 接近理想状态
- 但使得面积增加、功耗增加
存储器架构/层次
存储器越大越慢
缓存:
- 将数据放在尽可能接近的位置
- 利用
- 时间临近性:刚刚使用过的数据很可能会被再次使用
- 空间临近性:倾向于使用周围临近的数据
- 对于L1, L2, L3级别的缓存,其级别越小容量越小,速度越快
分区:
- 避免多端口
一致性
控制器:
- 多个通道,增加带宽
CPU内部的并行性
- 指令级并行
- 超标量
- 乱序之行
- 数据级并行
- 矢量计算
- 线程级并行
- 同步多线程
- 多核
矢量操作
同时处理多个指令
多核处理
将流水线完整复制
Sandy Bridge-E:6 cores
- 完整的核,除了最后一级缓存外,不共享其他资源
- 继续保持摩尔定律
总结
CPU 为串行程序优化
- pipelines, branch prediction, superscalar, OoO
- Reduce execution time with high clock speeds and high utilization
缓慢的内存带宽将会是大问题
并行处理是一个方向
串行计算模式
常规软件是串行的
设计运行于一个中央处理器上的 CPU
通过离散的指令序列完成一个问题的解决
- 一条一条指令的执行
- 同时只有一个指令在执行
并行计算模式
- 同时应用多个计算资源来解决一个计算问题
- 设计多个计算资源或处理器
- 每个问题被分解为多个离散的部分,可以同时处理(并行)
- 每个部分可以由一系列指令完成
- 每个部分的指令在不同的处理器上执行
Flynn 矩阵
4 possible classifications according to Flynn
- SISD
- SIMD
- MISD
- MIMD
— single instruction single Data
…
…
…
存储器的架构
- shared memory
- distributed memory
- hybrid distributed shared memory
并行编程模型
- 共享存储模型
- 线程模型
- 消息传递模型
- 数据并行模型
设计并行处理程序和系统
- 自动和手动并行
- 理解问题和程序
- 分块分割
- 通信
- 同步
数据依赖
负载均衡
- 粒度
- I/O
- 成本
- 性能分析和优化
安装 CUDA
Linux
安装 NVIDIA Driver 显卡驱动
安装 CUDA Toolkit
- 使用c/c++ 编译器或者 python 拓展进行 GPU加速的 CUDA 编程
- 从官网下载安装 wet 到 包 然后 sudo sh 或者 ./ 运行
- 设置环境变量