GuoXin Li's Blog

CUDA coding

字数统计: 973阅读时长: 3 min
2021/04/24 Share

CUDA 编程

现代 CPU 架构和性能优化

CPU的概念:

  • 执行指令,处理数据的器件——完成基本的逻辑和算术指令

  • 增加了复杂的接口

    • 内存接口
    • 外部设备接口
  • 包含大量静晶体管

桌面应用

  • 轻量级进程,少量线程
  • 分之和交互操作
  • 大量存储器访问
  • 用于数值运算的指令很少

CPU结构图

enter image description here

取指 译码 执行 访问 写回

流水线

  • 利用指令级的并行
    • 极大的减小时钟周期
    • 但是增加了延迟和芯片面积

分支预测

猜测下一条指令

基于过去的分支记录

如:基于全局记录的两层预测

现代预测器准确度大于 90%

  • 提升性能以及能量效率

但是会导致面积增加和延迟


提升 IPC (instructions cycle)即 CPU 一个时钟周期能够处理的指令数

为了处理更多的数据—> 提出了超标量 — 增加流水线宽度

Screen Shot 2021-04-25 at 06.19.27


超标量

峰值 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 或者 ./ 运行
  • 设置环境变量
CATALOG
  1. 1. CUDA 编程
    1. 1.1. 现代 CPU 架构和性能优化
      1. 1.1.1. CPU的概念:
      2. 1.1.2. 桌面应用
      3. 1.1.3. CPU结构图
      4. 1.1.4. 流水线
      5. 1.1.5. 分支预测
      6. 1.1.6. 超标量
      7. 1.1.7. 乱序执行 Out-of-Order — OoO
      8. 1.1.8. 存储器架构/层次
      9. 1.1.9. 矢量操作
      10. 1.1.10. 多核处理
      11. 1.1.11. 总结
      12. 1.1.12. 串行计算模式
      13. 1.1.13. 并行计算模式
      14. 1.1.14. Flynn 矩阵
      15. 1.1.15. 存储器的架构
      16. 1.1.16. 并行编程模型
      17. 1.1.17. 设计并行处理程序和系统
    2. 1.2. 安装 CUDA