CUDA C编程手册:硬件实施

CUDA C编程手册:硬件实施


NVIDIA GPU 架构是围绕着一组可扩展的多线程流式多处理器(SMs: Streaming Multiprocessors)来组建的。当一个CPU上的一个CUDA程序调用一个核函数的网络(grid), 那么网格中的块(block)就会被枚举并并在满足执行条件的情况下分发至多处理器上进行执行。线程块中的线程在同一个多处理器上同时执行, 并且多个线程块可以同时在同一个多处理器上执行。当一个线程块执行完毕之后,新的线程块将会在有 “空闲”的多处理器上进行执行。

多处理器被设计为可以同时执行成百上千个线程。为了管理数量如此多的线程, 它使用了一种特殊的架构: 单指令多线程(SIMT: single-Instruction, Multiple-Thread)。指令是被流水线化处理后使得可以使得可以在单个线程中进行指令级的并行。同样地通过硬件多线程可以实现线程级的并行。与CPU核心不同的是,CPU中的指令是顺序执行的,并没有分支预测。

SIMT 架构

多处理器(multiprocessor)创建、管理、调度和执行线程是以32个线程为一个单元来进行的,这样的一组线程称为warp。 多个独立的线程构成了线程束,开始与程序地址中的同一个位置,但它们有自己的指令地址计数器和寄存器。因此可以实现单独的分支和执行。 词语 warp源于织造。 half-warp指的是线程束的第一个或者第二个的半线程束。quarter-warp指的是将线程束分为四份后其中的第一、二、三、四份。

当一个多处理器被分配执行一个或者多个线程块的时候,它会将这些线程块分为线程束,每个线程束都通过线程束调度器(warp scheduler)进行调度。线程块划分线程束的方式是一样的,每个线程束拥有连续的线程编号,第一个线程束的线程编号从0开始。

一个线程束中的线程同时执行同一个指令, 所以当线程束中的所有线程拥有同样的执行路径时才有最高的执行效率。如果线程束的线程出现分化, 如存在对数据依赖的条件分支, 那么整个线程束中对满足条件的线程会执行分支,不满足条件的线程则会停止等待。分支分化仅会出现在线程束中,不同的线程束执行是相互独立的,并不会受不同的执行路径所影响。

单指令多线程(SIMT) 架构类似于单指令多数据架构(SIMD: Single-Instruction, Multi-Data)。一个关键的不同点就是SIMD向量结构向软件暴露了SIMD的宽度, 然而SIMT架构指定了单个线程的执行和分支行为。 与SIMD向量相比, SIMT使得程序员可以编写对于单个或者多个线程的线程级并行代码, 也可以编写对应线程的数据并行代码。为了准确性,程序员可以基本忽略SIMT的行为,然而,注意线程束中的分化可以有效地提升性能。实际上,这有点类似于传统代码中的缓存线(cache line): 缓存线的大小在为了正确性进行设计时候可以被忽略,但是在追求极致性能的时候必须加以考虑。另一方面,向量化结构需要软件进行合并加载至向量并手动管理分化。

在Volta 架构以前,线程束中的所有32个线程共享使用一个程序计数器, 用来指定线程束中哪些线程是活跃的,哪些是挂起的。结果就是, 同一个线程束中的分化区域或者不同执行状态的线程之间不能传递信息或者交换数据。并且,算法在进行细粒度的数据共享时需要通过锁和互斥来保证,这很容易导致"死块"(dead block)。

从Volta架构之后,独立线程调度可以使得完全地同时触发,而不再考虑线程束。在独立线程调度之下,GPU保留对了每个线程的执行状态,包括程序计数器、调用堆栈;能够在线程粒度的进行执行;能更好地使用执行资源;能够让单个线程等待其他线程产生的数据。调度优化器决定了如何组织线程束中活跃的线程至SIMT单元。这相较于之前的GPU架构,保留了更高的SIMT执行吞吐量并且有更多的灵活性:线程可以在亚线程束的细粒度下分化并且再聚拢。

硬件多线程

多处理器上线程束的执行上下文(程序计数器、寄存器等)在线程束的整个生命周期内会被在片上进行保存。因此,在执行上下文之间进行切换时没有开销的, 且每个取指令时间,线程调度器会选择一个准好的线程束进行执行它的下一个指令并同时为下其他的线程进行取指令。

特别地,每个多处理器拥有一组32位的寄存器并分配给了所有的线程束。且并行数据缓存或者共享内存也在线程块之间进行了分配。

多处理器所能同时驻留或者处理的线程块和线程束的数量,取决于一个核函数所占用的寄存器、共享内存数量以及多处理器所能使用的寄存器和共享内存数量。每个多处理器也有最大驻留线程块数和线程束数。如果多处理器没有足够的寄存器或者共享内存来执行至少一个线程块, 那么核函数就会执行失败。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值