0%

CUDA_02执行模型概述

GPU架构学习

参考1: CUDA执行模型概述

参考2: 深入GPU硬件架构及运行机制

CUDA 编程模型和硬件模型对应

线程块中通过共享内存和寄存器相互通信协调,寄存器和共享内存的分配可以严重影响性能。

因为SM有限,虽然在编程模型看所有线程都是并行执行,但是在微观上看,所有线程也是分批次在物理层面的机器上执行,线程块(block)里不同的线程可能进度都不一样,但是同一个线程束的线程拥有相同的进度。

并行就会引起竞争,多线程以未定义的顺序访问同一个数据,就导致了不可预测的行为,CUDA只提供了一种块内(块内线程间)同步的方式,块之间没办法同步!

同一个SM上可以有不止一个常驻的线程束,有些在执行,有些在等待,他们之间状态的转换是不需要开销的。每个SM 都将 分配给它的线程块 划分到包含32个线程(我的理解,这32 个线程就是对应到SM硬件图中的core)的线程束中,然后在可用的硬件资源上调度执行。

Nvidia Fermi架构

解释:

  • Fermi架构

    1. L2 Cache: 768 KB 的二级缓存,被所有SM共享;

    2. DRAM: 6 个 384-bits 的GDRR5内存接口;

    3. GigaThread引擎: 全局调度器,分配线程块到SM线程束调度器上;

    4. SM(流多处理器器Stream Multiprocessor): 16个SM,每个SM支持数百个线程并发执行,当一个核函数的网格被启动的时候,多个block会被同时分配给可用的SM上执行。

  • SM

    1. 2 个 Warp(线程束): 采用单指令多线程 SIMT 架构管理执行线程,每个线程束中包括 16个Core, Warp编排器(Warp Scheduler),分发单元(Dispatch Unit);

    2. Warp编排器(Warp Scheduler), 线程束调度器,

    3. 分发单元(Dispatch Unit), 指令调度(分配)单元,存储两个线程束要执行的命令,

    4. 寄存器文件(Register File)

    5. 16组加载存储单元(LD/ST)

    6. 4 个特殊函数单元(SFU) 执行固有指令,如正弦、余弦、平方根和差值

    7. 共享内存/一级缓存

    8. CUDA核心

  • CUDA核心

    1. 一个 FP Unit: 浮点数运算单元FPU;

    2. 一个 INT Unit: 全流水线的整数算数逻辑单元 ALU;

SM 的中文对照:

Kepler 架构

是Fermi的后代

- 强化了SM

- 动态并行

- Hyper-Q 技术

SMX是改进的架构,支持动态创建渲染线程,以降低延迟。

Hyper-Q技术主要是CPU和GPU之间的同步硬件连接,以确保CPU在GPU执行的同事做更多的工作。Fermi架构下CPU控制GPU只有一个队列,Kepler架构下可以通过Hyper-Q技术实现多个队列:

最后

想要优化速度,先要学好使用使用性能优化工具:

  • nvvp

  • nvprof

限制内核性能的主要包括但不限于y一下因素:

  • 存储宽带

  • 计算资源

  • 指令和内存延迟