CUDA10.0官方文档的翻译与学习之硬件实现

article/2025/9/1 20:23:31

背景

在之前的文章中,我翻译了cuda10.0官方文档的前三章,这次就来翻译第四章——硬件实现

英伟达GPU架构通过由多线程的流式多处理器(SM)组成的可变数组编译,当一个主机CPU上的cuda程序调用了一个核网格,网格内的线程块将会被枚举,并被分发到具有合适执行能力的多处理器上。线程块内的线程在一个处理器上并发执行,多个线程块也可以在一个处理器上并发执行。当线程块结束时,新的块就会在腾出来的处理器上启动。多处理器被设计用来并发执行上百个线程,为了管理这么多的线程,它使用了一个单独的称为SIMT(单指令多线程)架构。指令通过使用线程内的指令级并行和通过硬件多线程的线程级并行来调度。不像CPU核是按序调度的,在GPU的多处理器里,没有分支预测和推测执行(speculative execution)。另外英伟达GPU架构使用了小端表示法。接下来,我们讲解所有设备共有的架构特征和流式多处理器。

SIMT架构

多处理器以伪线程的形式创建、管理、调度和执行线程,伪线程就是一组32个并行线程的集合。组成伪线程的独立线程在程序的同一地址开始,但它们有各自的指令地址计数器和寄存器状态,因此可以自由分支,独立执行。起源于波的伪线程属于是第一个并行线程技术,半伪线程是均分伪线程后的第一或第二部分,四分之伪线程就是伪线程四等分后的其中一部分。

当多处理器拥有了一个或多个要执行的线程块,它会把线程块分区成伪线程,每个伪线程被伪线程调度器调度执行。将线程块分割成伪线程的方法总是一样的:每个伪线程包含连续递增的线程id,第一个伪线程会包含线程id为0的线程。第二章中线程层次一节描述了线程id和块中线程索引的关系(线程索引和块索引可以用来计算线程id)

一个伪线程同时执行一个指令,所以当线程块内的所有32个线程都对它们自己的执行逻辑没有异议时,效率也就拉满了。如果伪线程中的某些线程因为数据依赖的条件分支而另辟蹊径,伪线程也会执行每个条件分支,但是不在这条支路上的线程就不会被执行。分支分散只会在伪线程内出现,不同的伪线程不管在执行的代码路径是否相同,都会并行执行。

SIMT架构类似于SIMD(单指令多数据)向量架构,这个架构中一条指令控制多个待处理的元素。这两种架构的关键区别时SIMD向量架构把SIMD宽度暴露给了软件,而SIMT指令是在单个线程内指定执行和分支行为的。和SIMD向量机相反,SIMT允许程序员为独立、可变的线程写出线程级并行的代码,也可以为合作线程写出数据并行的代码。为了考虑正确性,程序员基本可以忽略SIMT的行为,但是当心代码很少要求伪线程内的线程分散,注意到这一点可以提高程序的性能。在实践中,这和传统代码里缓存线的角色类似:当考虑正确性时,缓存线的大小可以被安全的忽略,但如果要求性能极佳,那就得在代码结构中考虑缓存线的大小。而另一方面,向量架构要求软件把装载合并成向量,然后手动管理分支分散。

在Volta架构之前,伪线程使用被32个线程和指定活跃线程的活跃掩码所共享的程序计数器,结果同一伪线程中不同区域或者不同执行状态的线程不能相互发送信号或者交换数据,要求锁控数据细粒度共享的算法很容易因此死锁,这种死锁取决于竞争线程来自于哪个伪线程。

从Volta架构开始,独立线程调度允许线程间的完全并发,而不用考虑是否来自同一伪线程。这时,GPU持有每个线程的运行状态,包括程序计数器和调用栈,所以可以在线程粒度上进行并行,如此既更好地利用了执行资源,也允许线程等待其他线程生产的数据。调度优化器决定如何把来自同一伪线程的活跃线程组到一个SIMT单元里,这样既保留了过往英伟达GPU中SIMT调度的高吞吐量,又提高了灵活性:线程可以以比伪线程更小的粒度下分散和重新汇聚。

如果开发者要在之前的硬件架构中做出伪线程同步的假设,独立线程调度可能会导致一个与预期大相径庭的参与执行代码的线程集合。具体地,任何伪线程同步代码(比如同步释放、伪线程内合并等)应该被重新审视以确保在Volta及更高版本的架构中的适配性。

注意:
一个伪线程中参与当前指令执行的线程称之为活跃线程,反之不参与执行的就是不活跃线程。线程不活跃的因素有很多,包括比伪线程内其他线程更早结束、身处和伪线程正在执行的分支不同的代码路径上,或者是线程数不能被伪线程容量整除的线程块中的最后一个线程。
如果被伪线程内多个线程执行的非原子性操作向全局或共享内存的同一个地址进行了写操作,发生在那个地址上的串行写此时取决于设备的计算能力,而且哪个线程执行最后一次写是不确定的。
如果被伪线程内多个线程执行的原子操作对全局内存的一个地址进行了读、写和修改,每个读写或修改都会发生,并且是串行执行的,但是它们发生的顺序不得而知。

硬件多线程

被多处理器处理的伪线程执行环境(程序计数器、寄存器等,每个伪线程都有)在伪线程的整个生命周期中是片上持有(on-chip maintained)的。因此从一个执行上下文切换到另一个没有开销,在每个指令发起时,伪线程调度器会选择其线程已经准备好执行下一条指令的伪线程(请参见上一小节中关于活跃线程的记载)来进行指令的分配。

具体地,每个多处理器都有一个在伪线程之间分区的32位寄存器的集合,以及在线程块间被分区的并行数据缓存或共享内存

对于一个要执行的核函数而言,在一个多处理器上能够并存和同时处理的线程块数和伪线程数取决于此处理器上可用的寄存器和共享内存数以及此核函数要求的寄存器数和共享内存数。此外,每个多处理器上可共存的线程块和伪线程数也有一个最大值限制,这些限制和多处理器可用的寄存器与共享内存数是设备计算能力的函数,具体请参见下表:
在这里插入图片描述
如果每个多处理器没有足够的寄存器或者共享内存来至少处理一个线程块,那这个核函数就会启动失败。

一个线程块内的伪线程数 = ceil(T / Wsize, 1),其中T是每个线程块的线程数,Wsize为伪线程容量(32),ceil(x, y)会把x舍入到最近的y的整数倍,而后返回x。

一个线程块内的寄存器总数和分配给这个线程块的共享内存数可以参考cuda工具包中的CUDA Occupancy Calculator.
位于cuda安装目录的tools目录下
在这里插入图片描述
打开后内容如下图所示
在这里插入图片描述
在Calculator标签下,选择自己设备的计算能力,就可以看到一些详细信息
在这里插入图片描述

结语

第四章就翻译完了,下周翻译第五章——性能指南


http://chatgpt.dhexx.cn/article/u2vpQePg.shtml

相关文章

近距离看GPU计算(3)

在先前文章《近距离看GPU计算(2)》中,我们谈到现代GPU发展出SIMT(Single Instruction Multiple Thread)的执行结构,硬件线程池的线程们有相对独立的运行上下文,以Warp为单位分发到一组处理单元按SIMD的模式运行。这些W…

CPU线程与超线程技术

文章目录 一、CPU线程与OS线程1. CPU中的thread2. OS中的thread 二、HT/SMT技术1. 定义2. 原理3. 带来的问题 三、SIMT与SIMD1. SIMT2. SIMD3. 对比 一、CPU线程与OS线程 1. CPU中的thread CPU中的线程来自同步多线程(SMT,Simultaneous Multi-threadin…

GPU 软硬件基本概念

术语: single instruction, multiple thread (SIMT): a single instruction is executed on several function units in parallel GPU的硬件结构中与CUDA相关的几个概念:thread block grid warp sp sm streaming processor(sp): 最基本的处理单元&…

GPU异构计算基础知识

CUDA Toolkit Documentation (nvidia.com) host CPU和内存 (host memory)Device GPU和显存 (device memory) SIMT模型与SIMD模型的区别 SIMD(Single Instruction Multi Data,单指令多数据)模型要求同一个向量中的所有元素要在统一的同步组中一起执行,…

GPU硬件架构以及运行机制笔记

本文是对向往大神的文章的一个笔记。 想阅读原文章移步博客园搜索向往 原文章比较长,这是一个精简和自己的一些理解 这篇文章要带着下面的问题去看 1、GPU是如何与CPU协调工作的? 2、GPU也有缓存机制吗?有几层?它们的速度差异多…

4. CUDA编程手册中文版---硬件实现

第四章 硬件实现 更多精彩内容,请扫描下方二维码或者访问https://developer.nvidia.com/zh-cn/developer-program 来加入NVIDIA开发者计划 NVIDIA GPU 架构围绕可扩展的多线程流式多处理器 (SM: Streaming Multiprocessors) 阵列构建。当主机 CPU 上的 CUDA 程序调…

SMIT介绍

System Management Interface Tool(系统管理界面工具) 软件安装与维护(Sofeware Installation and Maintenance) 软件许可管理(Sofeware License Management) 版本管理(Manage Editions) 设备管理&#…

GPU硬件结构和编程模型(源于nvidia的CUDA文档)

GPU的硬件结构 GPU通过一个可扩展的多线程流式多处理器(SMs)构建。一个multiprocessor可以在同一时间处理上百个线程。为了管理这些线程,使用一个特殊的结构SIMT。利用单线程中指令级的并行,以及同步硬件多线程实现的广泛线程级并行性。 SIMT Architec…

实例分割文献阅读笔记(一)SimT

阅读 SimT: Handling Open-set Noise for Domain Adaptive Semantic Segmentation 原作者知乎文章链接:知乎文章 GitHub链接:开源数据 SimT (CVPR22):为了解决域自适应(包含UDA和SFDA)任务中目标域数据伪标签中存在…

第三章 SIMT 内核:指令和寄存器数据流

在本章和下一章中,我们将研究现代 GPU 的架构和微架构。 我们将对 GPU 架构的讨论分为两部分:(1) 在本章中研究实现计算部分的 SIMT 内核,然后 (2) 在下一章中研究内存系统。 在其传统的图形渲染角色中,GPU 访问数据集&#xff0…

从GPU编程到SIMT核心

本文转自:从GPU编程到SIMT核心 - 知乎 (zhihu.com) 1、前言&本文重点 在 GPGPU 显得愈发重要的今天,仅凭 nVidia, AMD 提供的编程接口来了解 GPU 未免显得太单薄了些。时至今日, GPU 内部如何执行一条指令的对程序员来说依然是透明的、…

并行计算范式-SIMD vs SIMT vs SMT: What’s the Difference Between Parallel Processing Models?

Modern processor architectures utilize various execution models. Out of these, two are most popular: SIMD (Single Instruction Multiple Data) and SIMT (Single Instruction Multiple Threads). There’s also SMT (Simultaneous Multithreading), but that’s someth…

SIMD<SIMT<SMT: NVIDIA GPU的并行机制

原文出处&#xff1a; SIMD < SIMT < SMT: parallelism in NVIDIA GPUs 目录 1、概述 1.1、SIMD 2、SIMD vs SIMT 2.1 单指令、多套寄存器组 2.2 单指令、多个数据访问单元 2.3 单指令、多种运算逻辑路径 3、SIMD vs SIMT 3.1 GPU通过多thread来实现高thro…

关于GPU一些笔记(SIMT方面)

GPU组成 《计算机组成原理 — GPU 图形处理器》已经大概说明出GPU一般都是由比CPU多的core组成&#xff0c;而每个core 相当于一个单独线程进行计算&#xff0c;并且可以同时触发执行相同的单一指令但是每个计算单元数据不同(称之为SIMD)的指令执行。在英伟达GPU中 core一般称…

如何理解GPU中的SIMT(单指令流多线程模型)

随着设备尺寸逐渐变小&#xff0c;使得时钟频率很难有大的提升&#xff0c;人们开始寻找更有效的架构。为了提高能源效率&#xff0c;需要引入支持向量运算的硬件和减少数据的移动。 当下的架构通常是CPUGPU的&#xff0c;CPU在未来一段时间不会完全被GPU所取代&#xff0c;因…

mysql怎么设置主键唯一性约束_MySQL主键约束和唯一性约束

MySQL主键约束和唯一性约束都是索引&#xff0c;它们的区别是&#xff1a; 主键字段可以确保唯一性&#xff0c;但主键字段不能为NULL. 唯一性约束可以确保唯一性&#xff0c;但唯一性约束的字段可以为NULL 唯一性约束对含有NULL的记录不起作用&#xff0c;即可以重复加入含有N…

mysql唯一性约束的作用_sql唯一约束有什么用

SQL中唯一约束的作用是保证每个记录中都有一个唯一的标识&#xff0c;使得该列上没有相同的两个记录值&#xff1b;其中表的主键就是一个唯一性约束&#xff0c;不过主键只能有一个&#xff0c;所以如果其他列的数据不允许重复的话&#xff0c;就可以建立唯一性约束。 SQL中唯一…

mysql多字段唯一约束_mysql多字段唯一约束

MySQL唯一约束(Unique Key)要求该列唯一,允许为空,但只能出现一个空值。唯一约束可以确保一列或者几列不出现重复值。 在创建表时设置唯一约束 在定义完列之后直接使用 UNIQUE 关键字指定唯一约束,语法规则如下: UNIQUE 创建数据表 tb_dept2,指定部门的名称唯一,输入的 S…

mysql 修改唯一约束_mysql如何修改唯一性约束跟主键约束

一、如何添加主键约束和唯一性约束 1、添加主键约束 执行语法: alter table tableName add primarykey(column_name);#千万别忘了加(),同时要保证表结构中没有其他的主键,因为一个表中只能有一个主键。 2、添加唯一性约束 执行语法: alter table tableName addunique(colum…

在mysql中怎么样添加唯一约束_mysql怎么添加唯一约束?

方法:1、创建表时,使用“CREATE TABLE 表名(字段名 数据类型 UNIQUE);”语句来添加;2、修改表时,使用“ALTER TABLE 表名 ADD CONSTRAINT 唯一约束名 UNIQUE(列名);”语句来添加。 (推荐教程:mysql视频教程) MySQL 唯一约束(Unique Key)是指所有记录中字段的值不能重复出现…