
一、前言
本文是上一篇文章的续篇。在上一篇文章中,我们主要介绍了《 OpenGL ES3.0编程指南》的一些阅读经验。今天的文章,我主要关注GPU,简要介绍GPU的存储结构,同时粗略估计着色器中各种变量的对应位置。
凌霄:《 OpenGL ES3.0编程指南》阅读说明

二、关于GPU
我不想写更多有关GPU的信息。毕竟,我不是那么。我再次推荐该博客,我认为它写得很好。
深入的GPU硬件体系结构和运行机制-0向往0博客园。''

但是,由于我们主要在下面讨论存储结构,因此让我们发布nVidia图形卡的体系结构。
1,特斯拉的建筑

2,费米的建筑

3,麦克斯韦的建筑


4、开普勒的体系结构

5、图灵的体系结构

总而言之,从2008年的Tesla架构到2018年的Turing架构,nVidia确实值得成为GPU行业的领导者,并一直引领着该行业的发展。
在过去的十年中,特斯拉(Tesla)架构的计算能力为1.x,费米(Fermi)架构的计算能力为2.x,开普勒(Kepler)架构的计算能力为3.5, Pascal架构的计算能力为6。Turing架构据说是Pascal架构的计算能力的25倍。开发的速度确实越来越快。
通常来说,评估GPU有两个标准:
1,单精度浮点数计算能力,双精度浮点数计算能力;
2,数据传输带宽
对于嵌入式系统的GPU,功耗将会增加。
那么,影响这些指标的核心技术点是什么?我个人认为以下几点:
1。芯片设计的架构,例如Tesla,Pascal和Turing; (注意,这些都是IP,是赚了的钱);
2。当时的设计过程受到当时芯片行业的生产和设计能力的限制;这通常会影响芯片上集成的计算单元数量的上限。从上图中可以看出,计算单位增加了一倍,受设计过程的影响。
3,新的数据传输技术,例如Pascal架构引入了NVLink技术,NVLink技术可以支持多个GPU之间或CPU与GPU之间的通信,可以提供相当于PCI-E带宽5倍的通信速率,两倍方式通信带宽可以达到160GB / S。

4。存储技术和存储体系结构的变化。毕竟,您运行得越快,就需要数据就可以运行,否则就什么也没有运行。因此,GPU设计了独特的存储层,而分层存储的使用是性能优化的关键。
三、GPU存储结构
CPU存储单元包括全局存储,纹理存储,常量存储,共享存储,本地存储和寄存器。此外,CPU端(主机端)存储类型(页面锁定存储[固定存储]和可分页存储[可分页存储])以及CPU和GPU的通信接口和通信方法也将影响GPU程序执行的性能。
一般情况下,下表组织起来以说明GPU存储的基本信息。

GPU存储结构基本信息的比较
注意:寄存器的访问速度,表中给出的值为0.19,稍后会有评论说这是不正确的,并给出了解释。对于寄存器访问,一个操作至少需要一个时钟周期,并且延迟不能小于1。估计吞吐量/带宽(例如0.25clk / Byte或4B / clk)小于1。我认为这种解释是很合理的。在CUDA(即集成GPU),GPU和CPU位于同一芯片中,因此它没有自己的物理存储设备,而是共享CPU的存储空间,即,统一内存架构(统一存储架构),通常从CPU内存中划分为GPU的本地内存;另一种类型的图形卡称为专用图形卡(专用GPU),例如Nvidia和AMD生产的GPU属于此类,它们全都有自己的物理存储设备,这是我们日常生活中最常用的GPU类型。无论哪种GPU,它都有自己的地址空间集,该地址空间集独立于CPU的虚拟内存地址空间。 GPU地址空间的管理是通过内核模式驱动程序完成的,例如Windows上的KMD(内核模式驱动程序)
对于集成GPU,由于GPU和CPU位于同一芯片中,因此GPU和CPU通常共享总线。除了GPU自己的本地内存外,有时还需要在CPU和GPU之间共享一些数据。例如,在渲染期间,CPU将顶点数据放入主存储器中,以供GPU使用。由于主存储器的内容对于GPU不可见,因此GPU无法直接访问这些数据。为了允许GPU访问CPU主内存的内容,业界已引入一种称为GART(图形地址重映射表)的技术。 GART是I / O内存管理单元(IOMMU)。坦率地说,它是一个内存地址映射表,可以将CPU的内存地址重新映射到GPU的地址空间,以便图形卡可以直接访问(DMA,直接内存访问)。 )主机系统内存。 (固定内存)
相反,CPU如何访问GPU的存储空间?由于集成GPU的存储空间是主内存的一部分,因此通常很小。操作系统可以将GPU的整个存储空间映射到CPU的地址空间。但是对于专用的gpu,此方法是不够的,因为独立显卡的视频内存通常更大,并且32位OS的整个地址空间仅为4GB。因此,独立显卡具有与集成GPU不同的地址空间映射机制来解决此问题。一种更常见的方法是将部分GPU存储空间映射到CPU的地址空间。典型大小为256MB / 512MB。该地址空间将通过PCIe栏获得CPU可见的地址空间。最新的PCIe支持调整大小条技术,并且支持该技术的GPU可以动态调整映射区域的大小。
引用来自:

GPU体系结构(二):GPU存储系统-DeepDream-Blog Garden五、OpeGL中的一些想法
一、数据传输部分
OpenGL用来更新数据的常用函数家族是:glBuffer * Data和glMapBuffer *。更准确地说,当CPU需要更新数据以供GPU使用时,顶点数据的更新,纹理数据的上载等需要将数据从CPU传输到GPU。此过程称为流。传输数据有两种方法:
l glBufferData / glBufferSubData
通过这两个功能,您可以将数据从主内存复制到固定内存。复制完成后,将启动异步DMA(直接内存访问)传输,将数据传输到GPU,然后将该函数称为Return,一旦函数返回,则可以进行任何处理,修改或删除原始CPU主存储器中的数据。
l glMap * / glUnmap *
通过映射传输数据,可以获得指向固定内存的指针,可以通过该指针将主内存上的数据复制到固定内存,然后调用glUnmap通知驱动程序您已完成数据更新。这样,它看起来与上面的glBufferData / glBufferSubData相同,但是您可以获得更多控制权。
此示例中的固定存储器是CPU存储器上专用于GART的存储区域。 DMA传输是通过上述PCIe栏实现的。我了解GPU存储系统并使用图形API进行渲染和绘制时,我们可以清楚地了解数据的属性和流向,以避免不必要的错误和性能损失。
二、均匀变量
对于统一变量,我认为它对应于常量内存。这些统一变量在着色器执行期间是不变的,并且完全有可能将它们放入常量内存中。至于OpenGL的映射方式,这部分数据是否直接传输到常量内存中,我对此并不十分清楚。
三、均匀变量块
此块和统一变量也应放在常量存储器中。但是,由于可以共享统一变量块的内容,因此该块也可能存在于共享内存中。当然,也许可以根据用法将OpenGL放置在不同的位置;
四、缓冲对象
这部分应该首先获得全局内存,然后根据使用情况,GPU将根据执行的着色器或相应的共享内存逐渐进入所有级别的缓存。
五、纹理
这必须是纹理内存。
六、与CPU通信的数据,例如从GPU渲染的RenderTexture,必须返回给CPU使用。
此部分应该位于固定内存中,以促进CPU和GPU之间的数据交换。这意味着在创建纹理时,还可以分配固定的内存,以便可以将帧缓冲区对象中的颜色附件附加到此缓冲区。
以上是我的初步猜测,但是在与XZiar讨论之后,我认为RenderTexture应该仍在Global Memory中。毕竟,它一次全部放入固定的存储器中,读写太难了。 GPU完成写入,然后同步到固定的内存。当然,这也有点费力。
六、结论
好吧,我终于完成了,感觉有点古板。老实说,我不确定有多少对的。毕竟,有很多事情是可以猜测的,细节还不是很明确,但是毕竟,它可以帮助我理解整个图形渲染管道。暂时让我们这样做,如果伟大的上帝拥有更详细的信息和更清晰的映射关系,请留言。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shenmilingyu/article-325736-1.html
是什么目的吗