cuda lecture1

20 阅读3分钟

粗略的学习笔记 后期会整理排版

芯片内部结构

tmp49CB.png

大部分时间在访存。

指令处理步骤:

tmpE660.png

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 存储器架构 / 层次

存储器越大越慢
粗略的估计:

tmpA7CC.png

大部分时间在存取,即处理数据如何存 取

缓存 caching (利用了时间和空间的临近性) 将数据放在尽可能近的位置 利用: 时间临近性 刚刚用过的东西,再次被用的概率较大(我会经常拿去我时不时要用的东西) 空间临近性 倾向于使用周围临近的数据(我更倾向于将要用的东西放在手的附近)

缓存层次Cache Hierarchy 硬件管理 L1 Instuction / Data caches L2 unified cache L3 unified cache 软件管理 Main memory Disk

tmp5E63.png

存储器的另外设计考虑 分区 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的向量运算

tmp6D47.png

线程级并行

tmp6F08.png

多核Multicore

tmpC789.png

锁、一致性和同一性

tmp8920.png

能量墙

Power Wall

物理瓶颈?

时钟频率无法保持线性增长 结论 CPU是为串行程序优化的

tmp22D5.png