2.9 深入GPU硬件架构及运行机制

五、GPU技术要点

1.SMID和SIMT

SIMD(Single Instruction Multiple Data)是单指令多数据,在GPU的ALU(在Core内)单元内,一条指令可以处理多维向量(一般是4D)的数据。比如,有以下shader指令:

float4 c = a + b; // a,b都是float4类型

对于没有SIMD的处理单元,需要4条指令将4个float数值相加,汇编伪代码如下:

ADD c.x, a.x, b.x

ADD c.y, a.y, b.y

ADD c.z, a.z, b.z

ADD c.w, a.w, b.w

但是有了SIMD技术,只需要一条指令即可处理完:

SIMD_ADD c, a, b

for(i=0; i < n ; ++i) c[i] = a[i] + b[i];

SIMT(Single Instruction Multiple Threads,单指令多线程)是SIMD的升级版,可对GPU中单个SM中的多个Core同时处理一个指令,并且每个Core存取的数据可以是不同的。

SIMT_ADD c,a,b

上述指令会被同时送入在单个SM中被编组的所有Core中,同事执行运算,但a、b、c的值可以不一样:

2.co-issue

co-issue是为了解决SIMD运行单元无法充分利用的问题。例如下图,由于float数量的不同,ALU利用率从100%依次下降为75%、50%、25%。

为了解决着色器在低维向量的利用率低的问题,可以通过合并1D与3D与2D的指令。例如下图,DP3指令用了3D数据,ADD指令只有1D数据,co-issue会自动将他们合并,在同一个ALU只需要一个指令周期即可执行完。

但是对于向量运算(Vector ALU),如果其中一个变量既是操作数又是存储数的情况,无法启用co-issue技术:

3.if-else语句

如上图,SM中有8个ALU(Core),由于SIMD的特性,每个ALU的数据都不一样,导致if-else语句在某些ALU中执行的是true分支(黄色),有些ALU执行的是false分支(灰蓝色),这样导致很多ALU的执行周期被浪费掉了(即masked out),拉长了整个执行周期。最坏的情况,同一个SM中只有1/8(8是同一个SM的线程数,不同架构的GPU有所不同)的利用率。

同样,for循环也会导致类似的情况,例如以下shader代码:

void func(int count, int breakNum)
{ 	for(int i = 0; i < count; ++i) 	{ 		if (i == breakNum) 			break; 		else 			// do something 	} 
}

由于每个ALU的count不一样,加上有break分支,导致最快执行完shader的ALU可能是最慢的N分之一的时间,但由于SIMD的特性,最快的那个ALU依然要等待最慢的ALU执行完毕,才能接下一组指令的活!也就是白白浪费了很多时间周期。

4.Early-Z

早期GPU的渲染管线的深度测试是在像素着色器之后才执行(下图),这样会造成很多本不可见的像素执行了耗性能的像素着色器计算。

后来,为了减少像素着色器的额外消耗,将深度测试提至像素着色器之前(下图),这就是Early-Z技术的由来。

Early-Z技术可以将很多无效的像素提前剔除,避免它们进入耗时严重的像素着色器。Early-Z剔除的最小单位不是1像素,而是像素块(pixel quad,2x2个像素)。

但是,以下情况会导致Early-Z失效:

  • 开启Alpha Test:由于Alpha Test需要在像素着色器后面的Alpha Test阶段比较,所以无法在像素着色器之前就决定该像素是否被剔除。
  • 开启Alpha Blend:启用了Alpha混合的像素很多需要与frame buffer做混合,无法执行深度测试,也就无法利用Early-Z技术。
  • 开启Tex Kill:即在shader代码中有像素摒弃指令(DX的discard,OpenGL的clip)。
  • 关闭深度测试。Early-Z是建立在深度测试看开启的条件下,如果关闭了深度测试,也就无法启用Early-Z技术。
  • 开启Multi-Sampling:多采样会影响周边像素,而Early-Z阶段无法得知周边像素是否被裁剪,故无法提前剔除。
  • 以及其它任何导致需要混合后面颜色的操作。

此外,Early-Z技术会导致一个问题:深度数据冲突(depth data hazard)。

例子要结合上图,假设数值深度值5已经经过Early-Z即将写入Frame Buffer,而深度值10刚好处于Early-Z阶段,读取并对比当前缓存的深度值15,结果就是10通过了Early-Z测试,会覆盖掉比自己小的深度值5,最终frame buffer的深度值是错误的结果。

避免深度数据冲突的方法之一是在写入深度值之前,再次与frame buffer的值进行对比:

5.统一着色器架构(Unitfied shader Architecture)

在早期的GPU,顶点着色器和像素着色器的硬件结构是独立的,它们各有各的寄存器、运算单元等部件。这样很多时候,会造成顶点着色器与像素着色器之间任务的不平衡。对于顶点数量多的任务,像素着色器空闲状态多;对于像素多的任务,顶点着色器的空闲状态多(下图)。

于是,为了解决VS和PS之间的不平衡,引入了统一着色器架构(Unified shader Architecture)。用了此架构的GPU,VS和PS用的都是相同的Core。也就是,同一个Core既可以是VS又可以是PS。

6.像素块

5.4中提到的:

32个像素线程将被分成一组,或者说8个2x2的像素块,这是在像素着色器上面的最小工作单元,在这个像素线程内,如果没有被三角形覆盖就会被遮掩,SM中的warp调度器会管理像素着色器的任务。

也就是说,在像素着色器中,会将相邻的四个像素作为不可分隔的一组,送入同一个SM内4个不同的Core。

为什么像素着色器处理的最小单元是2x2的像素块?

推测有以下原因:

1、简化和加速像素分派的工作。

2、精简SM的架构,减少硬件单元数量和尺寸。

3、降低功耗,提高效能比。

4、无效像素虽然不会被存储结果,但可辅助有效像素求导函数。

这种设计虽然有其优势,但同时,也会激化过绘制(Over Draw)的情况,损耗额外的性能。比如下图中,白色的三角形只占用了3个像素(绿色),按我们普通的思维,只需要3个Core绘制3次就可以了。

但是,由于上面的3个像素分别占据了不同的像素块(橙色分隔),实际上需要占用12个Core绘制12次(下图)。

这就会额外消耗300%的硬件性能,导致了更加严重的过绘制情况。

更多详情可以观看虚幻官方的视频教学:实时渲染深入探究。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/105684.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

宅在家里也能干的副业,每天挣60—300元,人人可做

想在家搞副业&#xff0c;每天挣60-300元&#xff0c;大家觉得难吗&#xff1f;我告诉你&#xff0c;一点也不难。找对路子&#xff0c;足不出户也能搞钱。今天我就给大家分享一下三个网上靠谱的副业&#xff0c;门槛低上手快&#xff0c;只需一部手机&#xff0c;每天利用碎片…

Hazelcast系列(三):hazelcast集成(服务器/客户端)

系列文章 Hazelcast系列(一)&#xff1a;初识hazelcast Hazelcast系列(二)&#xff1a;hazelcast集成&#xff08;嵌入式&#xff09; Hazelcast系列(三)&#xff1a;hazelcast集成&#xff08;服务器/客户端&#xff09; Hazelcast系列(四)&#xff1a;hazelcast管理中心 …

动态规划:918. 环形子数组的最大和

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《算法》 文章目录 前言一、题目解析二、解题思路解题思路状态表示状态转移方程初始化填表顺序返回值 三、代码实现总结 前言 本篇文章仅是作为小白的我的一些理解&#xff0c;&#xff0c;…

docker安装skyWalking笔记

确保安装了docker和docker-compose sudo docker -v Docker version 20.10.12, build 20.10.12-0ubuntu4 sudo docker-compose -v docker-compose version 1.29.2, build unknown 编写docker-compose.yml version: "3.1" services: skywalking-oap:image: apach…

ELF和静态链接:为什么程序无法同时在Linux和Windows下运行?

目录 疑问 编译、链接和装载&#xff1a;拆解程序执行 ELF 格式和链接&#xff1a;理解链接过程 小结 疑问 既然我们的程序最终都被变成了一条条机器码去执行&#xff0c;那为什么同一个程序&#xff0c;在同一台计算机上&#xff0c;在 Linux 下可以运行&#xff0c;而在…

《机器学习》第5章 神经网络

文章目录 5.1 神经元模型5.2 感知机与多层网络5.3 误差逆传播算法5.4 全局最小与局部最小5.5 其他常见神经网络RBF网络ART网络SOM网络级联相关网络Elman网络Boltzmann机 5.6 深度学习 5.1 神经元模型 神经网络是由具有适应性的简单单元组成的广泛并行互连的网络&#xff0c;它…

如何做好数据分析中的数据可视化?

数据可视化在数据分析中扮演着重要的角色&#xff0c;它帮助我们更好地理解和传达数据的特征、趋势和规律。以下是关于如何做好数据分析中的数据可视化的详细介绍。 一、准备工作 1. 理解数据 在进行数据可视化之前&#xff0c;首先要对数据有一个清晰的理解。了解数据的来源…

Yakit工具篇:简介和安装使用

简介(来自官方文档) 基于安全融合的理念&#xff0c;Yaklang.io 团队研发出了安全领域垂直语言Yaklang&#xff0c;对于一些无法原生集成在Yak平台中的产品/工具&#xff0c;利用Yaklang可以重新编写 他们的“高质量替代”。对于一些生态完整且认可度较高的产品&#xff0c;Y…

JavaScript 通过数组对JSON key字段进行排序

这里我以vue为例 不过json排序用的js方式 任何前端项目都可以通过js完成 我们组件代码现在是这样的 <template><div><div v-for "item in navCateList" :key "item.id">{{ item.name }}</div></div> </template>&…

使用.NET实现WOL唤醒远程开机

文章目录 1. 背景2. 关于 WOL2.1 WOL 工作原理2.2 开启网卡唤醒功能 3. 快速验证3.1 局域网 Wake on Lan 应用3.2 Ubuntu 的 etherwake 命令4. 代码实现4.1 创建.NET控制台应用程序4.2 编写代码4.3 运行应用程序 5. 最后 1. 背景 家居自动化是现代智能家居的重要组成部分&…

[ROS2系列] ubuntu 20.04测试rtabmap

目录 背景&#xff1a; 一、配置 turtlebot3 二、安装RTAB-Map ROS2包&#xff1a; 三、启动 Turtlebot3 模拟器&#xff1a; 四、启动 RTAB 地图&#xff1a; 五、启动导航&#xff08;nav2_bringup应安装软件包&#xff09;&#xff1a; 背景&#xff1a; 1、设备&…

杀死僵尸进程ZooKeeperMain

关闭Hadoop后jps发现还有个进程ZooKeeperMain没有关闭&#xff0c;使用kill -9 <>也没有用&#xff0c;这种就是僵尸进程&#xff0c;需要用父进程ID来杀死 解决方法 话不多说&#xff0c;直接上解决方案&#xff0c; 1. 第一步 清楚需要关闭的进程ID&#xff0c;我…

项目配置vue.config jsconfig babel.config .prettierc .env .eslintrc

.env 在一个产品的前端开发过程中&#xff0c;一般来说会经历本地开发、测试脚本、开发自测、测试环境、预上线环境&#xff0c;然后才能正式的发布。对应每一个环境可能都会有所差异&#xff0c;比如说服务器地址、接口地址、websorket地址…… 等等。在各个环境切换的时候&am…

小程序 | 小程序后端用什么语言开发比较好

目录 ♣️ 引言 选择合适的后端语言 推荐使用Node.js Node.js 的优点 其他备选语言 ♣️ 小结 ♣️ 引言 小程序的兴起已经成为了当今移动互联网时代的热点之一&#xff0c;而小程序后端的好坏直接影响着小程序的使用体验&#xff0c;因此&#xff0c;选择一种好的语言来…

一键批量转换,轻松将TS视频转为MP4视频,实现更广泛的播放和分享!

在享受精彩视频内容的同时&#xff0c;有时我们可能会面临一个问题&#xff1a;某些视频格式可能不太适合我们的播放设备或分享平台。特别是TS格式的视频&#xff0c;在一些情况下可能无法直接播放或上传。但是不用担心&#xff0c;因为我们为您提供了一款强大的视频剪辑工具&a…

数据特征选择 | Lasso特征选择(Python)

文章目录 效果一览文章概述源码设计小结效果一览 文章概述 Lasso算法是一种经典的线性回归算法,被广泛应用于特征选择和降维问题。相较于传统的线性回归算法,Lasso算法能够在保持预测准确性的同时,自动筛选出对目标变量影响较大的特征变量,从而达到降低模型复杂度、提高泛化…

Python文件读写实战:处理日常任务的终极工具!

更多资料获取 &#x1f4da; 个人网站&#xff1a;涛哥聊Python Python文件的读写操作时&#xff0c;有很多需要考虑的细节&#xff0c;这包括文件打开方式、读取和写入数据的方法、异常处理等。 在本文中&#xff0c;将深入探讨Python中的文件操作&#xff0c;旨在提供全面的…

TSINGSEE青犀智慧城市数字基座解决方案,助力城市数字化转型

一、行业背景 我国“十四五”规划纲要中提出&#xff0c;分级分类推进新型智慧城市建设&#xff0c;将物联网感知设施、通信系统等纳入公共基础设施统一规划建设&#xff0c;推进市政公用设施、建筑等物联网应用和智能化改造。完善城市信息模型平台和运行管理服务平台&#xf…

Godot2D角色导航-自动寻路教程(Godot设置导航代理的目标位置)

文章目录 创建导航NavigationAgent2D节点设置目标位置其他文章 创建导航 首先&#xff0c;创建一个基本的场景&#xff0c;下面的文章讲解了如何创建一个基本的导航场景&#xff0c;点击如下链接前往该文章&#xff1a; Godot2D角色导航-自动寻路教程 NavigationAgent2D节点 …

蓝桥杯(迷宫,C++)

输入&#xff1a; 思路&#xff1a; 1、注意输入用字符串。 2、采用广度搜素的方法来求解。 3、因为最后要求字典序最小且D<L<R<U,所以在遍历四个方向的时候&#xff0c; 先向下&#xff0c;再向左、右&#xff0c;最后向上。 #include<iostream> #include…