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

article/2025/9/1 22:16:41

随着设备尺寸逐渐变小,使得时钟频率很难有大的提升,人们开始寻找更有效的架构。为了提高能源效率,需要引入支持向量运算的硬件和减少数据的移动。

当下的架构通常是CPU+GPU的,CPU在未来一段时间不会完全被GPU所取代,因为我们需要用CPU来进行I/O,而GPU主要来进行基础运算。当然也有很多的开发者在开发使GPU直接访问I/O的接口,但目前来看我们更倾向于二者结合的方式。

二者有两种结合的方式,如下图所示。左边是离散式架构,CPU和GPU拥有独立的内存单元,二者通过总线进行连接。右边是集成式架构,二者共享一个内存单元和缓存单元。但实际上二者的DRAM所要达成的目标是不同的,CPU中的DRAM为低延迟而优化,GPU中的DRAM为高吞吐量而优化。
在这里插入图片描述

在离散式架构中,刚开始需要考虑数据从CPU向GPU流动的问题,后来就借助虚拟内存的方式实现了。在集成式架构中,二者共享内存,所以不用考虑数据迁移问题,但需要考虑高速缓存一致性的问题。

在很多时候,CPU承担着初始化GPU的任务,并通过驱动指明GPU需要完成的任务。CPU会指明需要运行的内核程序、需要有多少线程和从哪里获得需要的数据等等。也就是我们说的CPU更多的是控制功能。

现代的GPU架构如下图所示。每个GPU会包含很多的core,英伟达称之为流多处理器(streaming multiprocessors, SM)。每个核都在执行单指令多线程的程序(single-instruction multiple-thread, SIMT)。在单个核上执行的线程可以通过暂存内存(有点像阻塞操作,保存现场)进行通信,并使用快速barrier操作进行同步。
在这里插入图片描述

每个核通常还包含一级指令和数据缓存。这些充当带宽过滤器,以减少发送到内存系统较低级别的通信量。内核上运行的大量线程用于隐藏在第一级缓存中找不到数据时访问内存的延迟。即每个控制单元总有任务分发,每个处理单元总有任务要做,被阻塞时总有任务进行切换。以此来实现了高吞吐率。
未来能量效率会是计算机架构的主要研究方向。在目前来看,访问大型的内存结构花的能量可能比计算还要多。

以下摘自:
http://planckscale.info/tag/%E5%8D%95%E6%8C%87%E4%BB%A4%E6%B5%81%E5%A4%9A%E7%BA%BF%E7%A8%8B/

CUDA是个以性能为第一目标的语言,这也决定了CUDA开发者所要面对的复杂性远远要多于CUDA语言所抽象出来的编程模型本身。这大概会是软件抽象所要面对的永恒话题,我们可以去抽象出一组逻辑上漂亮完备的功能基元,却不能保证从性能的观点看它们同样也是小开销的基本操作。具体在CUDA里,最典型的例子是内存<->显存数据交换,一个简单的拷贝操作在性能上却是让人难以接受的,这背后是PCIE总线;对性能影响稍小些的例子比如Global Memory的读写需要考虑对齐,这是由于硬件层面warp和cache机制的体现;再者如过度臃肿的kernel或block过大导致寄存器耗尽,局域变量被吐到Local Memory导致的性能损失。

所有这些,都要求我们透过CUDA简洁干净的编程模型,看到软件抽象的美丽幻影背后那个不同的世界,它存在于抽象之下我们不熟悉的另一个层次,却透过性能这一个几乎是唯一的方式来影响着我们的软件。这颇类似万有引力与我们世界的关系:引力是唯一能透入额外维度的基本相互作用,如果世界有我们所不知道的维度存在,如何才能感受到那个世界对我们的影响?答案就是用引力。看过《星际穿越》的同学们想必对此有些印象。

在深入GPU的硬件架构之前,我们不妨先探讨一下这个问题:为什么GPU具有这么高的计算能力?我们试着归纳两条最主要的原因。

目前典型的计算模式有两种,CPU式的高速低延迟串行计算,和GPU式的高延迟高吞吐大规模并行计算。CPU是人们熟知的,它具有高速的内部寄存器和Cache,现代CPU又加入了多级流水线,猜测、乱序执行,超线程等技术加速其指令吞吐能力,具有快速的响应能力,但是对于大量数据的处理却相对不够用。这一点3D游戏应用就是典型的例子,当然,这就是GPU崛起的契机。

GPU天生为数据的批量处理而生,它擅长的是在大量数据上同时做同样或几乎一致(这点很重要)的计算。为什么要求一样的计算?这一点可以从很多个角度来回答。

最重要的一个回答是,多个线程同步执行一致的运算,使得我们可以用单路指令流对多个执行单元进行控制,大幅度减少了控制器的个数和系统的复杂度(设想成千上万的线程各自做不同的事情,如果再有线程间通讯/同步,将会是怎样的梦魇)。

另一方面,现实世界中应用在大规模数据上的计算,通常都涵盖在这一计算模式之中,因而考虑更复杂的模式本质上是不必要的。比如计算大气的流动,每一点的风速仅仅取决于该点邻域上的密度和压强分布;再如计算图像的卷积,每一个输出像素都仅是对应源点邻域和一个卷积核的内积。从这些例子中我们可以看到,除了各个数据单元上进行的计算是一样的,计算中数据之间的相互影响也具有某种“局域性”,一个数据单元上的计算最多需要它某个邻域上的数据。这一点意味着线程之间是弱耦合的,邻近线程之间会有一些共享数据(或者是计算结果),远距离的线程间则独立无关。

这个性质反映在CUDA里,就是Block划分的两重天地:Block内部具有Shared Memory,线程间可以共享数据、通讯和同步,Block外部则完全独立,Block间没有通讯机制,相互执行顺序不影响计算结果。这一划分使得我们既可以利用线程间通讯做一些复杂的应用和算法加速,又可以在Block的粒度上自由调度计算任务,在不同计算能力的硬件平台上自适应的调整任务安排。

现在我们把注意力放在“几乎一致”这里。最简单的并行计算方案是多路数据上同时进行完全一致的计算,即SIMD(单指令流多数据流)。这种方案是非常受限的。事实上我们可以看出,“完全一致”是不必要的。只要这些计算在大多数时候完全一致,就可以对它们做SIMD加速,而在计算分叉,各个线程不一致的特殊情况下,只需要分支内并行,分支间串行执行即可,毕竟这些只是很少出现的情况。这样,把“完全一致”这个限制稍微放松,就可以得到更广阔的应用范围和不输于SIMD的计算性能,即SIMT(单指令流多线程)的一个重要环节,这是GPU强大处理能力的第一个原因。

一个或许让每个初学者都惊讶的事实是这样一组数据:Global Memory访存延迟可以达到数百个时钟周期,即便是最快的Shared Memory和寄存器在有写后读依赖时也需要数十个时钟周期。这似乎和CUDA强大的处理能力完全相悖——如果连寄存器都这么慢,怎么会有高性能呢?难道这不会成为最大的瓶颈吗?

答案恰恰就出乎意料:不,这不是瓶颈,这个高延迟的开销被掩盖了,掩盖在大量线程之下。更清楚的说,当一组线程(同步执行,类似于SIMD的一个线程组,在CUDA里叫做warp)因为访存或其他原因出现等待时,就将其挂起,转而执行另一组线程,GPU的硬件体系允许同时有大量线程存活于GPU的SM(流多处理器)之中,控制单元在多组线程之间快速切换,从而保证资源的最大利用率——控制单元始终有指令可以发放,执行单元始终有任务可以执行,仍然可以保持最高的指令吞吐,每个单元基本都能保持充分的忙碌。

这就是GPU硬件设计中非常有特色的基本思想:用多线程掩盖延迟。这一设计区别于CPU的特点是,**大量高延迟寄存器取代了少量低延迟寄存器,寄存器的数量保证了可以有大量线程同时存活,且可以在各组线程间快速切换。尽管每个线程是慢的,但庞大的线程数成就了GPU的数据吞吐能力。**此为高性能的第二个原因。


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

相关文章

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)是指所有记录中字段的值不能重复出现…

添加唯一约束

– 1.添加唯一约束 – 方式1&#xff1a;创建表时指定 use mydb1; create table user1( id int, phone_number varchar(20)unique – 指定唯一约束 ); insert into user1 values(1001,‘123’); – insert into user1 values(1001,‘123’); --不是唯一会报错 – 在MySQL中&…

SQL Server 2012 唯一约束(定义唯一约束、删除唯一约束)

文章目录 准备知识定义唯一约束使用SSMS工具定义唯一约束使用SQL方式定义唯一约束方式一&#xff1a;在创建数据表的时候定义唯一约束方式二&#xff1a;修改数据表定义唯一约束 删除唯一约束使用SSMS工具删除唯一约束方式一&#xff1a;在对象资源管理器中删除唯一约束方式二&…

数据库----------唯一约束、默认约束、零填充约束

目录 1.唯一约束&#xff08;Unique&#xff09; 1.概念 2.语法 3.添加唯一约束 4.删除唯一约束 2.默认约束(default) 1.概念 2.语法 3.添加默认约束 4.删除默认约束 3.零填充约束&#xff08;zerofill&#xff09;了解即可 1.概念 2.操作 3.删除 1.唯一约束&…

window连接远程桌面快捷键

1、使用window R 打开运行界面&#xff0c;输入mstsc按回车 2、或者按window键打开开始界面&#xff0c;在搜索框输入mstsc按回车 3、效果

远程桌面快捷键的使用

AltPage Up 从左到右切换程序。   AltPage Down从右到左切换程序。   AltInsert按照程序的打开顺序&#xff0c;依次切换程序。   AltHome 显示“开始”菜单。   CtrlAltEnd 跳转到“window 安全”界面&#xff0c; 类似于本地机器的CtrlAltDelete   Alt Delete 相当…

Windows常用快捷键,打开记事本,打开我的电脑,屏幕投影扩展,远程桌面快捷键

网上很多windows快捷键的说明&#xff0c;这里不多记录&#xff0c;本文主要记录开发者使用windows比较常用的快捷键&#xff0c;尤其是多个显示器或者打开多个应用。 切到桌面 ------点击最右下叫可以一键切到桌面或者wind 打开记事本 记事本打开没有快捷键&#xff0c;这…

计算机开启远程桌面服务,远程桌面服务 教您开启远程桌面服务

远程桌面服务是两台电脑通过互联网建立连接的一种系统必要服务&#xff0c;可以用电脑A控制电脑B的桌面&#xff0c;还可以利用电脑B还控制电脑A的桌面&#xff0c;如果远程桌面服务没有开启就会无法连接到远程计算机&#xff0c;下面玉米系统小编教大家远程桌面服务开启方法。…

树莓派4B Ubuntu 远程桌面 步骤

文章目录 准备更换国内源更新软件列表和软件安装SSH安装ubuntu-desktopxrdp方法VNC方法问题故障解决花屏蓝屏/黑屏无法修正错误&#xff0c;因为您要求某些软件包保持现状&#xff0c;就是它们破坏了软件包间的依赖关系 参考 准备 Ubuntu Mate / Ubuntu Desktop版本为22.04 官…

android远程桌面源码,ARDC Android远程桌面助手 简介(示例代码)

我的GitHub 我的博客 我的微信 我的邮箱 bqt20094 baiqiantao@sina.com 目录 界面功能与快捷键 依赖adb,无需root,画面显示清晰且可调,支持自动保存截图,支持Ctrl+C复制画面到剪贴板,画面显示可缩放可全屏,支持拖拽文件到/sdcard/Download目录,Ctrl+拖拽APK可直接安装ap…

远程桌面按键失效变成快捷键

一直在使用远程桌面连接Windows 2008操作系统&#xff0c;发现一个很烦的问题&#xff0c;经常发现某些时间&#xff0c;输入的按键变成了快捷键。 如弹出“辅助功能选项”、某些程序被快捷启动、按e出现资源管理器等。 又如按L键就直接回到登录界面要求重新登录&#xff1a;…

windows开启远程桌面

现在的远程桌面工具很丰富&#xff0c;向日葵&#xff0c;ToDesk,TeamViewer 都是很简单易用的。但是在没有外网的场景下这些软件就不太好用了。今天来简单讲一下如果开启windows自带的远程桌面功能。 环境 我这里以windows 2008 R2做演示&#xff0c;其他的操作系统版本也是…

从远程桌面连接切换回主屏幕的快捷键

环境是在 windows 使用远程桌面连接之后&#xff08;远程桌面处于全屏的状态下&#xff09;&#xff0c;如何使用快捷键 Alt Tab 键返回主机。 按下 Ctrl Alt Home 键即可使用快捷键 Alt Tab 键返回主机 或者在远程连接时选择&#xff1a; 这样大部分的键盘快捷键都是主机的…

OpenCV变脸大法--‘让妖怪现原形‘(附源码)

导读 本文将介绍如何使用OpenCV和Dlib实现人脸变形(人脸->人脸和人脸->动物脸)。&#xff08;公众号&#xff1a;OpenCV与AI深度学习&#xff09; 背景介绍 我们常常在影视作品中看到一些类似的特效&#xff0c;比如一张人脸慢慢变成另一张人脸或者动物的脸&#xff0c;…

利用CImg实现人脸融合

实验目的 输入两张人脸图像&#xff0c;根据Image Morphing的方法完成中间 11 帧的差值&#xff0c;得到一张人脸渐变的动图。 实验原理 Cross-Dissolve 交叉融合&#xff0c;对两张图片每个像素点按一定的比例进行混合&#xff0c; 公式&#xff1a;Imagehalfway (1-t) * …