当前位置: 首页 > news >正文

金融理财管理网站源码 dedecms资源型网站建设 需要多大硬盘

金融理财管理网站源码 dedecms,资源型网站建设 需要多大硬盘,可以开发哪些网站,国外做免费的视频网站这张费米管线架构图能看懂了#xff0c;整个GPU的架构基本就熟了。市面上有很多GPU厂家#xff0c;他们产品的架构各不相同#xff0c;但是核心往往差不多#xff0c;整明白一了个基本上就可以触类旁通了。下面这张图信息量很大#xff0c;可以结合博客GPU 英伟达GPU架构回…这张费米管线架构图能看懂了整个GPU的架构基本就熟了。市面上有很多GPU厂家他们产品的架构各不相同但是核心往往差不多整明白一了个基本上就可以触类旁通了。下面这张图信息量很大可以结合博客GPU 英伟达GPU架构回顾-CSDN博客一点点看。 费米架构管线图 1. GPU概念 GPU 是 Graphics Processing Unit图形处理器的简称它是计算机系统中负责处理图形和图像相关任务的核心组件。GPU 的发展历史可以追溯到对计算机图形处理需求的不断增长以及对图像渲染速度和质量的不断追求。从最初的简单图形处理功能到如今的高性能计算和深度学习加速器GPU 经历了一系列重要的技术突破和发展转折。 在接下来的内容中除了给出GPU硬件基本概念还将探讨 GPU 与 CPU 的区别了解它们在设计、架构和用途上存在显著差异。此外我们还将简短介绍一下 AI 发展和 GPU 的联系并探讨 GPU 在各种领域的应用场景。 除了图形处理和人工智能GPU 在科学计算、数据分析、加密货币挖矿等领域也有着广泛的应用。深入了解这些应用场景有助于我们更好地发挥 GPU 的潜力解决各种复杂计算问题。现在让我们深入了解 GPU 的发展历史、与 CPU 的区别、AI 所需的重要性以及其广泛的应用领域。 1.1 GPU背景 GPU全称是Graphics Processing Unit。在最开始的时候它的功能与名字一致是专门用于绘制图像和处理图元数据的特定芯片。在没有GPU的时候人们想将计算机中的数据显示在屏幕上是使用CPU来进行相关运算的。我们要做的事情简单概括一下就是通过对数据进行相应的计算把数据转换成一个又一个图片上的像素然后将这张图片显示在屏幕上。整个流程中的计算并不复杂但是数量大且计算流程重复如果全盘交给CPU的话会给其造成很大的性能负担。于是乎GPU诞生了。 在GPU出现以前显卡和CPU的关系有点像“主仆”简单地说这时的显卡就是画笔根据各种有CPU发出的指令和数据进行着色材质的填充、渲染、输出等。较早的娱乐用的3D显卡又称“3D加速卡”由于大部分坐标处理的工作及光影特效需要由CPU亲自处理占用了CPU太多的运算时间从而造成整体画面不能非常流畅地表现出来。 例如渲染一个复杂的三维场景需要在一秒内处理几千万个三角形顶点和光栅化几十亿的像素。早期的3D游戏显卡只是为屏幕上显示像素提供一个缓存所有的图形处理都是由CPU单独完成。图形渲染适合并行处理擅长于执行串行工作的CPU实际上难以胜任这项任务。所以那时在PC上实时生成的三维图像都很粗糙。不过在某种意义上当时的图形绘制倒是完全可编程的只是由CPU来担纲此项重任速度上实在是达不到要求。 随着时间的推移CPU进行各种光影运算的速度变得越来越无法满足游戏开发商的要求更多多边形以及特效的应用榨干了几乎所有的CPU性能矛盾产生了······ 那么GPU的工作原理是什么 简单的说GPU就是能够从硬件上支持TLTransform and Lighting多边形转换与光源处理的显示芯片因为TL是3D渲染中的一个重要部分其作用是计算多边形的3D位置和处理动态光线效果也可以称为“几何处理”。一个好的TL单元可以提供细致的3D物体和高级的光线特效只不过大多数PC中TL的大部分运算是交由CPU处理的这就也就是所谓的软件TL由于CPU的任务繁多除了TL之外还要做内存管理、输入响应等非3D图形处理工作因此在实际运算的时候性能会大打折扣常常出现显卡等待CPU数据的情况其运算速度远跟不上今天复杂三维游戏的要求。即使CPU的工作频率超过 1GHz或更高对它的帮助也不大由于这是PC本身设计造成的问题与CPU的速度无太大关系。 1.2 GPU发展历史 在 GPU 发展史上第一代 GPU 可追溯至 1999 年之前。这一时期的 GPU 在图形处理领域进行了一定的创新部分功能开始从 CPU 中分离出来实现了针对图形处理的硬件加速。其中最具代表性的是几何处理引擎即 GEOMETRY ENGINE。该引擎主要用于加速 3D 图像处理但相较于后来的 GPU它并不具备软件编程特性。这意味着它的功能相对受限只能执行预定义的图形处理任务而无法像现代 GPU 那样灵活地适应不同的软件需求。 然而尽管功能有限第一代 GPU 的出现为图形处理领域的硬件加速打下了重要的基础奠定了后续 GPU 技术发展的基石。 第二代 GPU 的发展跨越了 1999 年到 2005 年这段时期其间取得了显著的进展。1999 年英伟达发布了 GeForce256 图像处理芯片这款芯片专为执行复杂的数学和几何计算而设计。与此前的 GPU 相比GeForce256 将更多的晶体管用于执行单元而不是像 CPU 那样用于复杂的控制单元和缓存。它成功地将诸如变换与光照TRANSFORM AND LIGHTING等功能从 CPU 中分离出来实现了图形快速变换标志着 GPU 的真正出现。 随着时间的推移GPU 技术迅速发展。从 2000 年到 2005 年GPU 的运算速度迅速超越了 CPU。在 2001 年英伟达和 ATI 分别推出了 GeForce3 和 Radeon 8500这些产品进一步推动了图形硬件的发展。图形硬件的流水线被定义为流处理器顶点级可编程性开始出现同时像素级也具有了有限的编程性。 尽管如此第二代 GPU 的整体编程性仍然相对有限与现代 GPU 相比仍有一定差距。然而这一时期的 GPU 发展为后续的技术进步奠定了基础为图形处理和计算领域的发展打下了坚实的基础。 从长远看英伟达的 GPU 在一开始就选择了正确的方向 MIMD通过 G80 SeriesFermiKepler 和 Maxwell 四代下一章节会有解析大跨步进化形成了完善和复杂的储存层次结构和指令派发/执行管线。ATI/AMD 在一开始选择了 VLIW5/4即 SIMD通过 GCN 向 MIMD 靠拢但是进化不够完全GCN 一开始就落后于 Kepler所以图形性能和 GPGPU 效率低于对手。 英伟达和 ATI 之争本质上是 shader 管线与其他纹理ROP 单元配置比例之争A 认为计算用 shader 越多越好计算性能强大N 认为纹理单元由于结构更简单电晶体更少单位面积配置起来更划算至于游戏则是越后期需要计算的比例越重。 第三代 GPU 的发展从 2006 年开始带来了方便的编程环境创建使得用户可以直接编写程序来利用 GPU 的并行计算能力。在 2006 年英伟达和 ATI 分别推出了 CUDACompute Unified Device Architecture和 CTMCLOSE TO THE METAL编程环境。 这一举措打破了 GPU 仅限于图形语言的局限将 GPU 变成了真正的并行数据处理超级加速器。CUDA 和 CTM 的推出使得开发者可以更灵活地利用 GPU 的计算能力为科学计算、数据分析等领域提供了更多可能性。 2008 年苹果公司推出了一个通用的并行计算编程平台 OPENCLOpen Computing Language。与 CUDA 不同OPENCL 并不与特定的硬件绑定而是与具体的计算设备无关这使得它迅速成为移动端 GPU 的编程环境业界标准。OPENCL 的出现进一步推动了 GPU 在各种应用领域的普及和应用为广大开发者提供了更广阔的创新空间。 第三代 GPU 的到来不仅提升了 GPU 的计算性能更重要的是为其提供了更便捷、灵活的编程环境使得 GPU 在科学计算、深度学习等领域的应用得以广泛推广成为现代计算领域不可或缺的重要组成部分。 下图分别展示了英伟达和 AMD 的工具链架构我们可以看到两者的层次架构都是十分相像的最核心的区别实则在于中间的 libraries 部分两家供应商均根据自己的硬件为基础 library 做了优化此外在编译层面两方也会针对自身架构在比如调度算子融合等方面实现各自的编译逻辑而在对外接口上双方都在争取提供给当今热门的框架和应用以足够的支持。 以及从下方二者的细粒度对比图中我们更能看出两方工具链架构间的一一映射和具体细节实现上的区别 1.3GPU与CPU差异 现在探讨一下 CPU 和 GPU 在架构方面的主要区别 CPU 即中央处理单元Central Processing Unit负责处理操作系统和应用程序运行所需的各类计算任务需要很强的通用性来处理各种不同的数据类型同时逻辑判断又会引入大量的分支跳转和中断的处理使得 CPU 的内部结构异常复杂。GPU 即图形处理单元Graphics Processing Unit可以更高效地处理并行运行时复杂的数学运算最初用于处理游戏和动画中的图形渲染任务现在的用途已远超于此。两者具有相似的内部组件包括核心、内存和控制单元。下图是GPU与CPU的构成差异图 上图有几个重点的元素也是我们下文重点要阐述的概念绿色代表的是computational units(可计算单元) 或者称之为 cores(核心)橙色代表memories内存 黄色代表的是control units控制单元。因此想要理解GPU的底层核心构成就必须明确这几个元素的作用下文会逐一讲解每个元素的作用。 GPU采用了数量众多的计算单元和超长的流水线但只有非常简单的控制逻辑并省去了Cache。而CPU不仅被Cache占据了大量空间而且还有有复杂的控制逻辑和诸多优化电路相比之下计算能力只是CPU很小的一部分。CPU需要很强的通用性来处理各种不同的数据类型同时又要逻辑判断又会引入大量的分支跳转和中断的处理。这些都使得CPU的内部结构异常复杂。而GPU面对的则是类型高度统一的、相互无依赖的大规模数据和不需要被打断的纯净的计算环境。 GPU 和 CPU 在架构方面的主要区别包括以下几点 并行处理能力 CPU 拥有少量的强大计算单元ALU更适合处理顺序执行的任务可以在很少的时钟周期内完成算术运算时钟周期的频率很高复杂的控制逻辑单元Control可以在程序有多个分支的情况下提供分支预测能力因此 CPU 擅长逻辑控制和串行计算流水线技术通过多个部件并行工作来缩短程序执行时间。GPU 控制单元可以把多个访问合并成采用了数量众多的计算单元ALU和线程Thread大量的 ALU 可以实现非常大的计算吞吐量超配的线程可以很好地平衡内存延时问题因此可以同时处理多个任务专注于大规模高度并行的计算任务。内存架构 CPU 被缓存 Cache 占据了大量空间大量缓存可以保存之后可能需要访问的数据可以降低延时 GPU 缓存很少且为线程Thread服务如果很多线程需要访问一个相同的数据缓存会合并这些访问之后再去访问 DRMA获取数据之后由 Cache 分发到数据对应的线程。 GPU 更多的寄存器可以支持大量 Thread。指令集 CPU 的指令集更加通用适合执行各种类型的任务 GPU 的指令集主要用于图形处理和通用计算如 CUDA 和 OpenCL。功耗和散热 CPU 的功耗相对较低散热要求也相对较低由于 GPU 的高度并行特性其功耗通常较高需要更好的散热系统来保持稳定运行。 因此CPU 更适合处理顺序执行的任务如操作系统、数据分析等而 GPU 适合处理需要大规模并行计算的任务如图形处理、深度学习等。在异构系统中 GPU 和 CPU 经常会结合使用以发挥各自的优势。 GPU 起初用于处理图形图像和视频编解码相关的工作。 GPU 跟 CPU 最大的不同点在于 GPU 的设计目标是最大化吞吐量Throughput相比执行单个任务的快慢更关心多个任务的并行度Parallelism即同时可以执行多少任务CPU 则更关心延迟Latency和并发Concurrency。 CPU 优化的目标是尽可能快地在尽可能低的延迟下执行完成任务同时保持在任务之间具体快速切换的能力。它的本质是以序列化的方式处理任务。 GPU 的优化则全部都是用于增大吞吐量的它允许一次将尽可能多的任务推送到 GPU 内部。然后 GPU 通过大数量的 Core 并行处理任务。 带宽、延迟与吞吐 处理器带宽Bandwidth、延时Lantency和吞吐Throughput 带宽处理器能够处理的最大的数据量或指令数量单位是 Kb、Mb、Gb延时处理器执行指令或处理数据所需的时间传送一个数据单元所需要的时间单位是 ms、s、min、h 等吞吐处理器在一定时间内从一个位置移动到另一个位置的数据量单位是 bps每秒比特数、Mbps每秒兆比特数、Gbps每秒千比特数比如在第 10s 传输了 20 bit 数据因此在 t10 时刻的吞吐量为 20 bps。 解决带宽相比较解决延时更容易线程的数量与吞吐量成正比吞吐量几乎等于带宽时说明信道使用率很高处理器系统设计所追求的目标是提高带宽的前提下尽可能掩盖传送延时组成一个可实现的处理器系统。 并发与并行 并行和并发是两个在计算机科学领域经常被讨论的概念它们都涉及到同时处理多个任务的能力但在具体含义和应用上有一些区别。 并行Parallelism 并行指的是同时执行多个任务或操作通常是在多个处理单元上同时进行。在计算机系统中这些处理单元可以是多核处理器、多线程、分布式系统等。并行计算可以显著提高系统的性能和效率特别是在需要处理大量数据或复杂计算的情况下。例如一个计算机程序可以同时在多个处理器核心上运行加快整体计算速度。 2. 并发Concurrency 并发指的是系统能够同时处理多个任务或操作但不一定是同时执行。在并发系统中任务之间可能会交替执行通过时间片轮转或事件驱动等方式来实现。并发通常用于提高系统的响应能力和资源利用率特别是在需要处理大量短时间任务的情况下。例如一个 Web 服务器可以同时处理多个客户端请求通过并发处理来提高系统的吞吐量。 因此并行和并发的主要区别如下 并行是指同时执行多个任务强调同时性和并行处理能力常用于提高计算性能和效率。并发是指系统能够同时处理多个任务强调任务之间的交替执行和资源共享常用于提高系统的响应能力和资源利用率。 在实际应用中并行和并发通常结合使用根据具体需求和系统特点来选择合适的技术和策略。同时理解并行和并发的概念有助于设计和优化复杂的计算机系统和应用程序。在实际硬件工作的过程当中更倾向于利用多线程对循环展开来提高整体硬件的利用率这就是 GPU 的最主要的原理。 以三款芯片为例对比在硬件限制的情况下一般能够执行多少个线程对比结果增加了线程的请求Threads required、线程的可用数Threads available和线程的比例Thread Ration主要对比到底需要多少线程才能够解决内存时延的问题。从表中可以看到几个关键的数据 GPUNVIDIA A100的时延比 CPU AMD Rome 7742Intel Xeon 8280高出好几个倍数GPU 的线程数是 CPU 的二三十倍GPU 的可用线程数量是 CPU 的一百多倍。计算得出线程的比例GPU 是 5.6 CPU 是 1.2~1.3这也是 GPU 最重要的一个设计点它拥有非常多的线程为大规模任务并行去设计。 AMD Rome 7742 Intel Xeon 8280 NVIDIA A100 Memory B/W(GB/sec) 204 143 1555 DRAM Latency(ns) 122 89 404 Peak bytes per latency 24,888 12,727 628,220 Memory Efficiency 0.064% 0.13% 0.0025% Threads required 1,556 729 39,264 Threads available 2048 896 221,184 Thread Ration 1.3X 1.2X 5.6X CPU 和 GPU 的典型架构对比可知 GPU 可以比作一个大型的吞吐器一部分线程用于等待数据一部分线程等待被激活去计算有一部分线程正在计算的过程中。GPU 的硬件设计工程师将所有的硬件资源都投入到增加更多的线程而不是想办法减少数据搬运的延迟指令执行的延迟。 相对应的可以把 CPU 比喻成一台延迟机主要工作是为了在一个线程里完成所有的工作因为希望能够使用足够的线程去解决延迟的问题所以 CPU 的硬件设计者或者硬件设计架构师就会把所有的资源和重心都投入到减少延迟上面因此 CPU 的线程比只有一点多倍这也是 SIMDSingle Instruction, Multiple Data和 SIMTSingle Instruction, Multiple Threads架构之间最大的区别。 CPU 不是通过增加线程来去解决问题而是使用相反的方式去优化线程的执行速率和效率这就是 CPU 跟 GPU 之间最大的区别也是它们的本质区别。 CPU 和 GPU 典型架构图 SIMD (Single Instruction, Multiple Data) 和 SIMT (Single Instruction, Multiple Threads) SIMD 架构是指在同一时间内对多个数据执行相同的操作适用于向量化运算。例如对于一个包含多个元素的数组SIMD 架构可以同时对所有元素执行相同的操作从而提高计算效率。常见的 SIMD 架构包括 SSE (Streaming SIMD Extensions) 和 AVX (Advanced Vector Extensions)。 SIMT 架构是指在同一时间内执行多个线程每个线程可以执行不同的指令但是这些线程通常会执行相同的程序。这种架构通常用于 GPU (Graphics Processing Unit) 中的并行计算。CUDA (Compute Unified Device Architecture) 和 OpenCL 都是支持 SIMT 架构的 编程模型。 SIMD 适用于数据并行计算而 SIMT 适用于任务并行计算。在实际应用中根据具体的计算需求和硬件环境选择合适的架构可以提高计算性能。 1.4 GPU与DSP差异 GPU和DSP的主要区别在于它们的设计目的和应用场景。 GPU图形处理单元主要用于处理大规模并行计算任务如图形渲染和深度学习而DSP数字信号处理器则专门用于处理高密集型、重复性的数据如音频、视频和无线通信中的信号处理任务12。 在架构方面GPU采用SIMD单指令多数据流架构能够同时处理多个数据点非常适合进行大规模并行计算。相比之下DSP则采用专用的数字信号处理架构优化了密集型数学运算如乘法和累加操作适用于处理连续的数据流14。 在性能和应用场景上GPU的核心计算能力远超通用处理器特别适合进行大规模并行计算任务如深度学习和科学计算。而DSP则以其高效能和低功耗的特点适用于音频、视频和无线通信等领域的信号处理任务23。 在指令集和存储结构上GPU的指令集和存储结构为并行计算进行了优化而DSP则采用专门的硬件来实现单周期乘法累加操作并且通常采用哈佛结构允许同时对程序和数据进行访问提高了处理效率45。 GPU在几个主要方面有别于DSPDigital Signal Processing简称DSP数字信号处理架构。其所有计算均使用浮点算法而且目前还没有位或整数运算指令。此外由于GPU专为图像处理设计因此存储系统实际上是一个二维的分段存储空间包括一个区段号从中读取图像和二维地址图像中的X、Y坐标。此外没有任何间接写指令。输出写地址由光栅处理器确定而且不能由程序改变。这对于自然分布在存储器之中的算法而言是极大的挑战。最后一点不同碎片的处理过程间不允许通信。实际上碎片处理器是一个SIMD数据并行执行单元在所有碎片中独立执行代码。 尽管有上述约束但是GPU还是可以有效地执行多种运算从线性代数和信号处理到数值仿真。虽然概念简单但新用户在使用GPU计算时还是会感到迷惑因为GPU需要专有的图形知识。这种情况下一些软件工具可以提供帮助。两种高级描影语言CG和HLSL能够让用户编写类似C的代码随后编译成碎片程序汇编语言。Brook是专为GPU计算设计且不需要图形知识的高级语言。因此对第一次使用GPU进行开发的工作人员而言它可以算是一个很好的起点。 Brook是C语言的延伸整合了可以直接映射到 GPU的简单数据并行编程构造。经GPU存储和操作的数据被形象地比喻成“流”stream类似于标准C中的数组。核心Kernel是在流上操作的函数。在一系列输入流上调用一个核心函数意味着在流元素上实施了隐含的循环即对每一个流元素调用核心体。Brook还提供了约简机制例如对一个流中所有的元素进行和、最大值或乘积计算。 Brook还完全隐藏了图形API的所有细节并把GPU中类似二维存储器系统这样许多用户不熟悉的部分进行了虚拟化处理。用Brook编写的应用程序包括线性代数子程序、快速傅立叶转换、光线追踪和图像处理。利用ATI的X800XT和Nvidia的GeForce 6800 Ultra型GPU在相同高速缓存、SSE汇编优化Pentium 4执行条件下许多此类应用的速度提升高达7倍之多。 对GPU计算感兴趣的用户努力将算法映射到图形基本元素。类似Brook这样的高级编程语言的问世使编程新手也能够很容易就掌握GPU的性能优势。访问GPU计算功能的便利性也使得GPU的演变将继续下去不仅仅作为绘制引擎而是会成为个人电脑的主要计算引擎。 2. GPU硬件框架 GPU的基本底层构成主要是以GPU计算核心 Cores以及Memory以及控制单元三大组成要素组成。 GPU整个架构演进可以查看博客GPU 英伟达GPU架构回顾-CSDN博客这里整合当前最先进的硬件框架来说明硬件关系具体实例是使用Maxwell框架 架构中 GPCGraphic Processing Cluster表示图像处理簇一共有 8 个。共有两个 L2 Cache 并且可以互相实现数据同步通过 Memory Controller 实现与高带宽存储器 HBM2High Bandwidth Memory进行数据交换。每个 GPC 中包含 TPCTexture processing cluster表示纹理处理簇每个处理簇被分为多个 SMSMX、SMMStreaming Multiprocessor 流式多处理器 是GPU的基础单元隔壁AMD叫CU 流处理器和一个****光栅化引擎(Raster Engine)SM 中包含多个 CUDA Core 和 Tensor Core用于处理图形图形和 AI 张量计算。SMStreaming Multiprocessors称作流式多处理器核心组件包括 CUDA 核心、共享内存、寄存器等。SM 包含很多为线程执行数学运算的 core是英伟达 GPU 的核心在 CUDA 中可以执行数百个线程、一个 block 上线程放在同一个 SM 上执行一个 SM 有限的 Cache 制约了每个 block 的线程数量。 2.1 SM 程序员编写的shader代码是在SM上执行的。每个SM包含许多为线程执行数学运算的Core。一个线程对应一个Core同时一个线程可以被shader代码调用进行运算。这些Core和其它部件由Warp Scheduler驱动Warp Scheduler管理一个由32个线程组成Warp线程束其通过将要执行的shader指令移交给**Instruction Dispatch Units(指令调度单元)**来驱动Core和其他部件。GPU有多少这些单元不同的芯片不一样总的来说越贵的越多性能也就越好。 上图为一个SM的构成图从上到下依次是 PolyMorph Engine多边形引擎负责属性装配attribute Setup、顶点拉取(VertexFetch)、曲面细分、栅格化这个模块可以理解专门处理顶点相关的东西。指令缓存Instruction Cache2个Warp Schedulers这个模块负责warp调度一个warp由32个线程组成warp调度器的指令通过Dispatch Units送到Core执行。指令调度单元(Dispatch Units) 负责将Warp Schedulers的指令送往Core执行128KB Register File寄存器16个LD/STload/store用来加载和存储数据Core Core也叫流处理器Stream Processor4个**SFUSpecial function units 特殊运算单元**执行特殊数学运算sin、cos、log等内部链接网络Interconnect Network64KB 共享缓存全局内存缓存Uniform Cache纹理读取单元(Tex)纹理缓存Texture Cache SMM,SMX是之后对SM的升级区别不是很大。SPStreaming Processor流处理器是最基本的处理单元最后线程具体的指令和任务都是在 SP 上进行处理的GPU 在进行并行计算时就是很多个 SP 同时处理。在 Fermi 架构之后SP 被改称为 CUDA Core通过 CUDA 来控制具体的指令执行。 GPU 工作原理 本章将从 GPU 硬件基础和英伟达 GPU 架构两个方面讲解 GPU 的工作原理。英伟达 GPU 有着很长的发展历史整体架构从 Fermi 到 Blankwell 架构演变了非常多代其中和 AI 特别相关的就有 Tensor Core 和 NVLink。 本节首先讲解 CPU 和 GPU 架构的区别之后以 A X Y AXY AXY这个例子来探究 GPU 是如何做并行计算的为了更好地了解 GPU 并行计算对并发和并行这两个概念进行了区分。此外会讲解 GPU 的缓存机制因为这将涉及到 GPU 的缓存Cache和线程Thread。 GPU 工作原理 基本工作原理 首先通过 A X Y AXY AXY这个加法运算的示例了解 GPU 的工作原理 A X Y AXY AXY 的示例代码如下 void demo(double alpha, double *x, double *y) {int n 2000;for (int i 0; i n; i){y[i] alpha * x[i] y[i];} }示例代码中包含 2 FLOPS 操作分别是乘法Multiply和加法Add对于每一次计算操作都需要在内存中读取两个数据KaTeX parse error: Undefined control sequence: \[ at position 2: x\̲[̲i\] 和 KaTeX parse error: Undefined control sequence: \[ at position 2: y\̲[̲i\]最后执行一个线性操作存储到 KaTeX parse error: Undefined control sequence: \[ at position 2: y\̲[̲i\] 中其中把加法和乘法融合在一起的操作也可以称作 FMAFused Multiply and Add。 在 O(n) 的时间复杂度下根据 n 的大小迭代计算 n 次在 CPU 中串行地按指令顺序去执行 A X Y AXY AXY 程序。以 Intel Exon 8280 这款芯片为例其内存带宽是 131 GB/s内存的延时是 89 ns这意味着 8280 芯片的峰值算力是在 89 ns 的时间内传输 11659 个比特byte数据。 A X Y AXY AXY 将在 89 ns 的时间内传输 16 比特C/C中 double 数据类型所占的内存空间是 8 bytes数据此时内存的利用率只有 0.14%16/11659存储总线有 99.86% 的时间处于空闲状态。 内存总线 99.86%时间处于空闲状态 不同处理器计算 A X Y AXY AXY 时的内存利用率不管是 AMD Rome 7742、Intel Xeon 8280 还是 NVIDIA A100对于 A X Y AXY AXY 这段程序的内存利用率都非常低基本 ≤0.14%。 AMD Rome 7742 Intel Xeon 8280 NVIDIA A100 Memory B/W(GB/sec) 204 131 1555 DRAM Latency(ns) 122 89 404 Peak bytes per latency 24,888 11,659 628,220 Memory Efficiency 0.064% 0.14% 0.0025% 由于上面的 A X Y AXY AXY 程序没有充分利用并发和线性度因此通过并发进行循环展开的代码如下 void fun_axy(int n, double alpha, double *x, double *y) {for (int i 0; i n; i 8){y[i 0] alpha * x[i 0] y[i 0];y[i 1] alpha * x[i 1] y[i 1];y[i 2] alpha * x[i 2] y[i 2];y[i 3] alpha * x[i 3] y[i 3];y[i 4] alpha * x[i 4] y[i 4];y[i 5] alpha * x[i 5] y[i 5];y[i 6] alpha * x[i 6] y[i 6];y[i 7] alpha * x[i 7] y[i 7];} }每次执行从 0 到 7 的数据实现一次性迭代 8 次每次传输 16 bytes 数据因此同样在 Intel Exon 8280 芯片上每 89 ns 的时间内将执行 72911659/16次请求将程序这样改进就是通过并发使整个总线处于一个忙碌的状态但是在真正的应用场景中 编译器很少会对整个循环进行超过 100 次以上的展开一个线程每一次执行的指令数量是有限的不可能执行非常多并发的数量一个线程其实很难直接去处理 700 多个计算的负荷。 由此可以看出虽然并发的操作能够一次性执行更多的指令流水线操作但是同样架构也会受到限制和约束。 将 Z A X Y ZAXY ZAXY 通过并行进行展开示例代码如下 void fun_axy(int n, double alpha, double *x, double *y) {Parallel for (int i 0; i n; i){y[i] alpha * x[i] y[i];} }通过并行的方式进行循环展开并行就是通过并行处理器或者多个线程去执行 A X Y AXY AXY 这个操作同样使得总线处于忙碌的状态每一次可以执行 729 个迭代。相比较并发的方式 每个线程独立负责相关的运算也就是每个线程去计算一次 A X Y AXY AXY执行 729 次计算一共需要 729 个线程也就是一共可以进行 729 次并行计算此时程序会受到线程数量和内存请求的约束。 GPU 线程原理 GPU 整体架构和单个 SMStreaming Multiprocessor的架构SM 可以看作是一个基本的运算单元GPU 在一个时钟周期内可以执行多个 Warp在一个 SM 里面有 64 个 Warp其中每四个 Warp 可以单独进行并发的执行GPU 的设计者主要是增加线程和增加 Warp 来解决或者掩盖延迟的问题而不是去减少延迟的时间。 GPU 整体架构与 SM 架构 为了有更多的线程处理计算任务GPU SMs 线程会选择超配每个 SM 一共有 2048 个线程整个 A100 有 20 多万个线程可以提供给程序在实际场景中程序用不完所有线程因此有一些线程处于计算的过程中有一些线程负责搬运数据还有一些线程在同步地等待下一次被计算。很多时候会看到 GPU 的算力利用率并不是非常的高但是完全不觉得它慢是因为线程是超配的远远超出大部分应用程序的使用范围线程可以在不同的 Warp 上面进行调度。 Pre SM A100 Total Threads 2048 221,184 Total Warps 64 6,912 Active Warps 4 432 Waiting Warps 60 6,480 Active Threads 128 13,824 Waiting Threads 1,920 207,360 小结 本节首先从架构层面分析了 CPU 和 GPU 的主要区别因为 CPU 的设计目标是尽可能在低的延迟下执行任务GPU 的设计目标是最大化吞吐量因此决定了 CPU 适合处理顺序执行的任务GPU 适合处理大规模并行计算的任务。 以 A X Y AXY AXY 为例讲解了并发和并行的区别以及和串行的区别在串行计算时内存利用率很低当把程序用并发的方式展开并发操作的多流水线会受到 CPU 架构的限制当程序用并行的方式循环展开时程序的执行则只受到线程数量和内存请求的约束因此 CPU 跟 GPU 的本质区别是并行的问题而不是并发的问题GPU 通过大量的线程提供并行的能力。 为了提供并行的能力GPU 通过多级缓存、多级流水、多级 Cache 提供并行的机制同时可以尽可能减少内存的时延。为了将数据充分利用起来引入了 GPU 线程的原理GPU 里面提供了大量超配的线程去完成对不同层级数据的搬运和计算。 2.2 Computational Units (cores) 总的来看我们可以这样说CPU的Computational units是“大”而“少”的然而GPU的Computational units是“小”而“多”的这里的大小是指的计算能力多少指的是设备中的数量。通过观察上图显然可以看出绿色的部分CPU“大少”GPU“小多”的特点。 CPU的cores 比GPU的cores要更加聪明(smarter)这也是所谓“大”的特点。 在过去的很长时间里CPU的core计算能力增长是得益于主频时钟最大的频率增长。相反GPU不仅没有主频时钟的提升而且还经历过主频下降的情况因为GPU需要适应嵌入式应用环境在这个环境下对功耗的要求是比较高的不能容忍超高主频的存在。例如英伟达的Jetson NANO,安装在室内导航机器人身上就是一个很好的嵌入式环境应用示例安装在机器人身上就意味着使用电池供电GPU的功耗不可以过高。(see,Indoor Mapping and Navigation Robot Build with ROS and Nvidia Jetson Nano): CPU比GPU聪明很大一个原因就是CPU拥有out-of-order exectutions乱序执行功能。出于优化的目的CPU可以用不同于输入指令的顺序执行指令当遇到分支的时候它可以预测在不久的将来哪一个指令最有可能被执行到multiple branch prediction 多重分支预测。通过这种方式它可以预先准备好操作数并且提前执行他们soeculative execution 预测执行通过上述的几种方式节省了程序运行时间。 显然现代CPU拥有如此多的提升性能的机制这是比GPU聪明的地方。 相比之下GPU的core不能做任何类似out-of-order exectutions那样复杂的事情总的来说GPU的core只能做一些最简单的浮点运算,例如 multiply-add(MAD)或者 fused multiply-add(FMA)指令 通过上图可以看出MAD指令实际是计算A*BC的值。 实际上现代GPU结构CORE不仅仅可以结算FMA这样简单的运算还可以执行更加复杂的运算操作例如tensor张量(tensor core)或者光线追踪(ray tracing core)相关的操作。 张量计算tensor core 光线追踪 张量核心(tensor cores)的目的在于服务张量操作在一些人工智能运算场合光纤追踪ray tracing 旨在服务超现实主义hyper-realistic实时渲染的场合。 上文说到GPU Core最开始只是支持一些简单的浮点运算FMA,后来经过发展又增加了一些复杂运算的机制tensor core以及ray trace但是总体来说GPU的计算灵活性还是比不上CPU的核心。 值得一提的是GPU的编程方式是SIMD(Single Instruction Multiple Data)意味着所有Core的计算操作完全是在相同的时间内进行的但是输入的数据有所不同。显然GPU的优势不在于核心的处理能力而是在于他可以大规模并行处理数据。 赛艇运动中所有人同时齐心划船 GPU中每个核心的作用有点像罗马帆船上的桨手鼓手打着节拍时钟桨手跟着节拍一同滑动帆船。 SIMD编程模型允许加速运行非常多的应用对图像进行缩放就是一个很好的例子。在这个例子中每个core对应图像的一个像素点这样就可以并行的处理每一个像素点的缩放操作如果这个工作给到CPU来做需要N的时间才可以做完但是给到GPU只需要一个时钟周期就可以完成当然这样做的前提是有足够的core来覆盖所有的图像像素点。这个问题有个显著的特点就是对一张图像进行缩放操作各个像素点之间的信息是相互独立的因此可以独立的放在不同的core中进行并行运算。我们认为不同的core操作的信息相互独立是符合SIMD的模型的使用SIMD来解决这样的问题非常方便。 但是也不是所有的问题都是符合SIMD模型的尤其在异步问题中在这样的问题中不同的core之间要相互交互信息计算的结构不规则负载不均衡这样的问题交给GPU来处理就会比较复杂。 2.2. GPU多核底层结构 为了充分理解GPU的架构让我们在返回来看下第一张图一个显卡中绝大多数都是计算核心core组成的海洋。 在图像缩放的例子中core与core之间不需要任何协作因为他们的任务是完全独立的然而GPU解决的问题不一定这么简单让我们来举个例子。 假设我们需要对一个数组里的数进行求和这样的运算属于reductuin family类型因为这样的运算试图将一个序列“reduce”简化为一个数。计算数组的元素总和的操作看起来是顺序的我们只需要获取第一个元素求和到第二个元素中获取结果再将结果求和到第三个元素以此类推。 Sequential reduction 令人惊讶的是一些看起来本质是顺序的运算其实可以再并行算法中转化。假设一个长度为8的数组在第一步中完全可以并行执行两个元素和两个元素的求和从而同时获得四个元素两两相加的结果以此类推通过并行的方式加速数组求和的运算速度。具体的操作如下图所示 Parallel reduction 如上图计算方式如果是长度为8的数组两两并行求和计算那么只需要三次就可以计算出结果。如果是顺序计算需要8次。如果按照两两并行相加的算法N个数字相加那么仅需要log2N次就可以完成计算。 从GPU的角度来讲只需要四个core就可以完成长度为8的数组求和算法我们将四个core编号为0123。 那么第一个时钟下两两相加的结果通过0号core计算放入了0号core可以访问到的内存中另外两两对分别由1号2号3号core来计算第二个个时钟继续按照之前的算法计算只需要0号和1号两个core即可完成以此类推最终的结果将在第三个时钟由0号core计算完成并储存在0号core可以访问到的内存中。这样实际三次就能完成长度为8的数组求和计算。 Parallel reduction with a GPU 如果GPU想要完成上述的推理计算过程显然多个core之间要可以共享一段内存空间以此来完成数据之间的交互需要多个core可以在共享的内存空间中完成读/写的操作。我们希望每个Cores都有交互数据的能力但是不幸的是一个GPU里面可以包含数以千计的core如果使得这些core都可以访问共享的内存段是非常困难和昂贵的。出于成本的考虑折中的解决方案是将各类GPU的core分类为多个组形成多个流处理器(Streaming Multiprocessors )或者简称为SMs。 The Turing SM 在SM的图灵结构中绿色的部分CORE相关的我们进一步区分了不同类型的CORE。主要分为INT32,FP32TENSOR CORES。 FP32 Cores执行单进度浮点运算在TU102卡中每个SM由64个FP32核TU120由72个SMs因此FP32 Core的数量是 72 * 64。 FP64 Cores. 实际上每个SM都包含了2个64位浮点计算核心FP64 Cores用来计算双精度浮点运算虽然上图没有画出但是实际是存在的。 Integer Cores这些core执行一些对整数的操作例如地址计算可以和浮点运算同时执行指令。在前几代GPU中执行这些整型操作指令都会使得浮点运算的管道停止工作。TU102总共由4608个Integer Cores每个SM有64个SM。 Tensor Cores张量core是FP16单元的变种认为是半精度单元致力于张量积算加速常见的深度学习操作。图灵张量Core还可以执行INT8和INT4精度的操作用于可以接受量化而且不需要FP16精度的应用场景在TU102中我们每个SM有8个张量Cores一共有8 * 72个Tensor Cores。 在大致描述了GPU的执行部分之后让我们回到上文提出的问题各个核心之间如何完成彼此的协作 在四个SM块的底部有一个96KB的L1 Cache用浅蓝色标注的。这个cache段是允许各个Core都可以访问的段在L1 Cache中每个SM都有一块专用的共享内存。作为芯片上的L1 cache他的大小是有限的但它非常快肯定比访问GMEM快得多。 实际上L1 CACHE拥有两个功能一个是用于SM上Core之间相互共享内存另一个则是普通的cache功能。当Core需要协同工作并且彼此交换结果的时候编译器编译后的指令会将部分结果储存在共享内存中以便于不同的core获取到对应数据。当用做普通cache功能的时候当core需要访问GMEM数据的时候首先会在L1中查找如果没找到则回去L2 cache中寻找如果L2 cache也没有则会从GMEM中获取数据L1访问最快 L2 以及GMEM递减。缓存中的数据将会持续存在除非出现新的数据做替换。从这个角度来看如果Core需要从GMEM中多次访问数据那么编程者应该将这块数据放入功能内存中以加快他们的获取速度。其实可以将共享内存理解为一段受控制的cache事实上L1 cache和共享内存是同一块电路中实现的。编程者有权决定L1 的内存多少是用作cache多少是用作共享内存。 最后也是比较重要的是可以储存各个core的计算中间结果用于各个核心之间共享的内存段不仅仅可以是共享内存L1也可以是寄存器寄存器是离core最近的内存段但是也非常小。最底层的思想是每个线程都可以拥有一个寄存器来储存中间结果每个寄存器只能由相同的一个线程来访问或者由相同的warp或者组的线程访问。 小结 这篇文章主要阐述了GPU的基本底层构成主要是以TU120来举例讲解了GPU计算核心 Cores,以及Memory以及控制单元三大组成要素。Core是计算的基本单元既可以用作简单的浮点运算又可以做一些复杂的运算例如tensor 或者ray tracing。文中谈到了多个core之间通讯的方式在特定的应用场合多个core之间是不需要的通讯的也就是各干各的例如 图像缩放但是也有一些例子多个core之间要相互通讯配合例如上文谈到的数组求和问题每个core之间都可以实现交互数据是非常昂贵的因此提出了SMs的概念SMs是多个core的集合一个SMs里面的cores可以通过L1 Cache进行交互信息完成使用GPU处理数组求和问题的时候多个核心共享数据的功能。 关于memory文章谈到存在全局的内存GMEM但是访问较慢Cores当需要访问GMEM的时候会首先访问L1,L2如果都miss了那么才会花费大代价到GMEM中寻找数据。 读了这篇来自Vitality Learning的文章我对GPU的底层硬件结构有了初步认识收益颇丰 2.3. memory 回到这个文章的第一张图中来我们接下来会讨论GPU和CPU内存方面的差别。 CPU的memory系统一般是基于DRAM的在桌面PC中一般来说是8G在服务器中能达到数百256Gbyte。 CPU内存系统中有个重要的概念就是cache是用来减少CPU访问DRAM的时间。cache是一片小但是访问速度更快更加靠近处理器核心的内存段用来储存DRAM中的数据副本。cache一般有一个分级通常分为三个级别L1L2L3 cachecache离核心越近就越小访问越快例如 L1可以是64KB L2就是256KB L3是4MB。 CPU Cache的内容不再这里展开讲解感兴趣的读者可以自行查阅资料。 从第一张图可以看到GPU中有一大片橙色的内存名称为DRAM这一块被称为全局内存或者GMEM。GMEM的内存大小要比CPU的DRAM小的多在最便宜的显卡中一般只有几个G的大小在最好的显卡中GMEM可以达到24G。GMEM的尺寸大小是科学计算使用中的主要限制。十年前显卡的容量最多也就只有512M,但是现在已经完全克服了这个问题。 关于cache从第一张图中不难推断左上角的小橙色块就是GPU的cache段。然而GPU的缓存机制和CPU是存在一定的差异的稍后将会证明这一点。 GPU 缓存机制 在 GPU 工作过程中希望尽可能的去减少内存的时延、内存的搬运、还有内存的带宽等一系列内存相关的问题其中缓存对于内存尤为重要。NVIDIA Ampere A100 内存结构中 HBM Memory 的大小是 80G也就是 A100 的显存大小是 80G。 其中寄存器Register文件也可以视为缓存寄存器靠近 SMStreaming Multiprocessors执行单元从而可以快速地获取执行单元中的数据同时也方便读取 L1 Cache 缓存中的数据。此外 L2 Cache 更靠近 HBM Memory这样方便 GPU 把大量的数据直接搬运到 cache 中因此为了同时实现上面两个目标 GPU 设计了多级缓存。80G 的显存是一个高带宽的内存L2 Cache 大小为 40M所有 SM 共享同一个 L2 CacheL1 Cache 大小为 192kB每个 SM 拥有自己独立的 Cache同样每个 SM 拥有自己独立的 Register每个寄存器大小为 256 kB因为总共有 108 个 SM 流处理器因此寄存器总共的大小是 27MBL1 Cache 总共的大小是 20 MB。 NVIDIA Ampere A100 内存结构 GPU 和 CPU 内存带宽和时延进行比较在 GPU 中如果把主内存HBM Memory作为内存带宽B/W, bandwidth的基本单位L2 缓存的带宽是主内存的 3 倍L1 缓存的带宽是主存的 13 倍。在真正计算的时候希望缓存的数据能够尽快的去用完然后读取下一批数据此时时候就会遇到时延Lentency的问题。如果将 L1 缓存的延迟作为基本单位L2 缓存的延迟是 L1 的 5 倍HBM 的延迟将是 L1 的 15 倍因此 GPU 需要有单独的显存。 假设使用 CPU 将 DRAMDynamic Random Access Memory中的数据传入到 GPU 中进行计算较高的时延25 倍会导致数据传输的速度远小于计算的速度因此需要 GPU 有自己的高带宽内存 HBMHigh Bandwidth MemoryGPU 和 CPU 之间的通信和数据传输主要通过 PCIe 来进行。 NVIDIA Ampere A100 存储延迟对比 DRAM 动态 随机存取存储器Dynamic Random Access Memory 一种计算机内存类型用于临时存储计算机程序和数据以供中央处理器CPU快速访问。与静态随机存取存储器SRAM相比具有较高的存储密度和较低的成本但速度较慢。它是计算机系统中最常用的内存类型之一用于存储操作系统、应用程序和用户数据等内容。 DRAM 的每个存储单元由一个电容和一个晶体管组成电容负责存储数据位0 或 1晶体管用于读取和刷新数据。由于电容会逐渐失去电荷因此需要定期刷新称为刷新操作以保持数据的正确性这也是称为“动态”的原因用于临时存储数据和程序提供快速访问速度和相对较低的成本。 存储类型 结构 工作原理 性能 应用 DRAMDynamic Random Access Memory 一种基本的内存技术通常以单层平面的方式组织存储芯片分布在一个平面上 当读取数据时电荷被传递到输出线路然后被刷新。当写入数据时电荷被存储在电容中。由于电容会逐渐失去电荷因此需要周期性刷新来保持数据 具有较高的密度和相对较低的成本但带宽和延迟相对较高 常用于个人电脑、笔记本电脑和普通服务器等一般计算设备中 GDDRGraphics Double Data Rate 专门为图形处理器设计的内存技术具有较高的带宽和性能 在数据传输速度和带宽方面优于传统的 DRAM适用于图形渲染和视频处理等需要大量数据传输的应用 GDDR 与标准 DDR SDRAM 类似但在设计上进行了优化以提供更高的数据传输速度。它采用双倍数据速率传输即在每个时钟周期传输两次数据提高了数据传输效率 主要用于高性能图形处理器GPU和游戏主机等需要高带宽内存的设备中 HBMHigh Bandwidth Memory 使用堆叠设计将多个 DRAM 存储芯片堆叠在一起形成三维结构 堆叠设计允许更短的数据传输路径和更高的带宽同时减少了功耗和延迟。每个存储芯片通过硅间连接Through Silicon ViaTSV与其他存储芯片通信实现高效的数据传输 具有非常高的带宽和较低的延迟适用于高性能计算和人工智能等需要大量数据传输的领域 主要用于高端图形处理器GPU、高性能计算系统和服务器等需要高带宽内存的设备中 不同存储和传输的带宽和计算强度进行比较假设 HBM 计算强度为 100L2 缓存的计算强度只为 39意味着每个数据只需要执行 39 个操作L1 的缓存更少计算强度只需要 8 个操作这个时候对于硬件来说非常容易实现。这就是为什么 L1 缓存、L2 缓存和寄存器对 GPU 来说如此重要。可以把数据放在 L1 缓存里面然后对数据进行 8 个操作使得计算达到饱和的状态使 GPU 里面 SM 的算力利用率更高。但是 PCIe 的带宽很低整体的时延很高这将导致整体的算力强度很高算力利用率很低。 DataLocation Bandwidth(GB/sec) ComputeIntensity Latency(ns) Threads Required L1 Cache 19,400 8 27 32,738 L2 Cache 4,000 39 150 37,500 HBM 1,555 100 404 39,264 NVLink 300 520 700 13,125 PCIe 25 6240 1470 2297 在带宽增加的同时线程的数量或者线程的请求数也需要相对应的增加这个时候才能够处理并行的操作每个线程执行一个对应的数据才能够把算力利用率提升上去只有线程数足够多才能够让整个系统的内存处于忙碌的状态让计算也处于忙碌的状态因此看到 GPU 里面的线程数非常多。 3. GPU 逻辑管线介绍 因为GPU是为了图形处理而诞生的所以想要整明白GPU的架构首先也要对渲染管线有一定的了解下面是DirectX的渲染管线流程图递归这看懂了然后我们继续 为了简单起见我们做一些假设。我们假设已经填充了数据并存在于 GPU 的 DRAM 中并且在整个流程中仅使用VS和PS。 GPU图形处理可以大致分成 5 个步骤如下图箭头的部分。 分别为 vertex shader、primitive processing、rasterisation、fragment shader、testing and blending。 第一步vertex shader。是将三维空间中数个x,y,z顶点放进 GPU 中。 在这一步骤中电脑会在内部模拟出一个三维空间并将这些顶点放置在这一空间内部。接着投影在同一平面上也是我们将看到的画面。同时存下各点距离投影面的垂直距离以便做后续的处理。 这个过程就像是本地球观看星星一般。地球的天空就像是一个投影面所有的星星不管远近皆投影在同一面上。本地球的我们抬起头来观看星星分不出星星的远近只能分辨出亮度。 GPU 所投影出的结果和这个情况类似。 从地球所看到的星空星星就像是投影到一球面上除非使用特别的仪器不然分不出星星和地球的距离 第二步primitive processing。是将相关的点链接在一起以形成图形。在一开始输入数个顶点进入 GPU 时程序会特别注记哪些点是需要组合在一起以形成一线或面。就像是看星座的时候一样将相关连的星星连起来形成特定的图案。 第三步rasterisation。因为电脑的屏幕是由一个又一个的像素组成因此需要将一条连续的直线使用绘图的演算法以方格绘出该直线。图形也是以此方式先标出边线再用方格填满整个平面。 第四步fragment shader。将格点化后的图形着上颜色。所需着上的颜色也是于输入时便被注记。在游玩游戏时这一步相当耗费 GPU 的计算资源因为光影的效果、物体表面材质皆是在这一步进行这些计算决定着游戏画面的精细程度。因此在游玩游戏时调高游戏画面品质大幅增加这一步的计算负担降低游戏品质。 将一个三角形用方格呈现近似原始图案并着上颜色。一块又一块的方格就是显示器上的像素 最后一步testing and blending。便是将第一步所获得的投影垂直距离取出和第四步的结果一同做最后处理。在去除被会被其他较近距离的物体挡住的物体后让剩下的图形放进 GPU 的输出内存。之后结果便会被送到电脑屏幕显示。 程序在图形 API(DirectX 或 openGL中进行绘图调用drawcall。在这里对数据进行合法性检查后数据会被GPU可读编码后插入到Pushbuffer中。在这个过程中在 CPU 方面可能会出现很多瓶颈这也是我们常说的DrawCall瓶颈的问题所在。一段时间后或者显式刷新explicit “flush” calls后驱动程序已在pushbuffer 中缓冲了足够的work并将其发送给 GPU 进行处理在操作系统的某些参与下。GPU 的Host Interface接收通过Front End处理。数据完全到达GPU后在**图元分配器(Primitive Distributor)**中开始工作分配处理indexbuffer将处理得到的三角形分成batch发送给多个GPC。 在GPC中每个SM中的Poly Morph Engine负责通过三角形索引(triangle indices)取出三角形的数据(vertex data)即下图中的Vertex Fetch模块。在获取数据之后在SM中以32个线程为一组的线程束(Warp)来调度来开始处理顶点数据。SM的warp调度器会按照顺序分发指令给整个warp单个warp中的线程会锁步(lock-step)执行各自的指令如果线程碰到不激活执行的情况也会被遮掩(be masked out)。被遮掩的原因有很多例如当前的指令是if(true)的分支但是当前线程的数据的条件是false或者循环的次数不一样比如for循环次数n不是常量或被break提前终止了但是别的还在走因此在shader中的分支会显著增加时间消耗在一个warp中的分支除非32个线程都走到if或者else里面否则相当于所有的分支都走了一遍线程不能独立执行指令而是以warp为单位而这些warp之间才是独立的。warp中的指令可以被一次完成也可能经过多次调度例如通常SM中的LD/ST(加载存取)单元数量明显少于基础数学操作单元。由于某些指令比其他指令需要更长的时间才能完成特别是内存加载warp调度器可能会简单地切换到另一个没有内存等待的warp这是GPU如何克服内存读取延迟的关键只是简单地切换活动线程组。为了使这种切换非常快调度器管理的所有warp在寄存器文件中都有自己的寄存器。这里就会有个矛盾产生shader需要越多的寄存器就会给warp留下越少的空间就会产生越少的warp这时候在碰到内存延迟的时候就会只是等待而没有可以运行的warp可以切换。 一旦warp完成了vertex-shader的所有指令运算结果会被Viewport Transform模块处理三角形会被裁剪然后准备栅格化GPU会使用L1和L2缓存来进行vertex-shader和pixel-shader的数据通信。接下来这些三角形将被分割再分配给多个GPC三角形的范围决定着它将被分配到哪个光栅引擎(raster engines)每个raster engines覆盖了多个屏幕上的tile这等于把三角形的渲染分配到多个tile上面。也就是像素阶段就把按三角形划分变成了按显示的像素划分了。SM上的Attribute Setup保证了从vertex-shader来的数据经过插值后是pixel-shade是可读的。GPC上的光栅引擎(raster engines)在它接收到的三角形上工作来负责这些这些三角形的像素信息的生成同时会处理裁剪Clipping、背面剔除和Early-Z剔除。32个像素线程将被分成一组或者说8个2x2的像素块这是在像素着色器上面的最小工作单元在这个像素线程内如果没有被三角形覆盖就会被遮掩SM中的warp调度器会管理像素着色器的任务。接下来的阶段就和vertex-shader中的逻辑步骤完全一样但是变成了在像素着色器线程中执行。 由于不耗费任何性能可以获取一个像素内的值导致锁步执行非常便利所有的线程可以保证所有的指令可以在同一点。 最后一步现在像素着色器已经完成了颜色的计算还有深度值的计算在这个点上我们必须考虑三角形的原始api顺序然后才将数据移交给ROP(render output unit渲染输入单元)一个ROP内部有很多ROP单元在ROP单元中处理深度测试和framebuffer的混合深度和颜色的设置必须是原子操作否则两个不同的三角形在同一个像素点就会有冲突和错误。 流程结束。 这个时候我们再来回顾一下这张图 这会儿就会比较清晰了。 参考 ^life-triangleLife of a triangle - NVIDIA’s logical pipeline | NVIDIA Developer^X-Jun的DX11教程https://www.cnblogs.com/X-Jun/p/9028764.html#_lab2_8_2 作者Clarence 链接https://zhuanlan.zhihu.com/p/598173226 原文地址 Understanding the architecture of a GPU | by Vitality Learning | CodeX | Medium Author Vitality Learning 作者XPU-进击的_芯片_ 链接https://www.zhihu.com/question/559866344/answer/3498127927 来源知乎 著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。 作者渲大师 链接https://zhuanlan.zhihu.com/p/530141476 来源知乎 著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。 参考资料 链接https://zhuanlan.zhihu.com/p/393485253The evolution of a GPU: from gaming to computing
http://www.hkea.cn/news/14275829/

相关文章:

  • 网站开发配置网站建设 招聘需求
  • 备案网站名称重复进入qq空间登录
  • 网站首页在哪个文件夹电影网站建设方案ppt模板
  • 建设企业网站企业网上银行助手下载盘锦兴隆台住房和城乡建设网站
  • 静态网站模板源码下载零基础学设计
  • 360官方网站内江市住房和城乡建设局网站电话号码
  • 网站建设php有哪些校园宿舍网网络设计案例
  • 用asp做网站的可行性分析seo 排名 优化
  • 长沙做网站备案成都装修网站设计
  • 公司没网站怎么做dsp专业做网站建设公司好吗
  • 避免网站侵权php网站开发多线程开发
  • 青岛高端网站制作公司传奇游戏网页
  • 社交网站上的商城怎么做六安人社局网站
  • 电商网站 解决方案上海高端网站建设高端网站建设
  • 家装e站wordpress区块链快讯模板
  • wordpress 整站移植网站建设要考
  • 湖北专业的网站制作代理商自建商城网站
  • 哪些网站做装修精品下载站
  • 高职思政主题网站建设作用宁波网站制作公司排名
  • 查企业去哪个网站二手商品交易网站开发
  • 个体户 网站建设百度官网app下载安装
  • 怎么诊断网站wap站是什么意思啊
  • 做网站主页上主要放哪些内容体验营销案例
  • 新邱建设网站青岛鑫隆建设集团网站
  • 网站怎么做充值系统淘宝运营培训机构排名
  • 西安网站建设设计的好公司排名如何做切片网站
  • asp网站路径企业黄页信息网
  • 在哪里购买虚拟空间建设网站网站建设策划书模板下载
  • 备案网站可以做影视站携程的网站建设
  • 大型网站开发实例什么平台打广告比较好免费的