GPU英文全称Graphic Processing Unit,中文翻译为“图形处理器”。GPU是相对于CPU的一个概念,由于在现代的电脑中(特别是家用系统,游戏的发烧友)图形的处理变得越来越重要,需要一个专门的图形的核心处理器。
主要特点GPU 是显示卡的“大脑”,它决定了该显示卡的档次和大部分性能,同时也是2D显示卡和3D显示卡的区别依据。2D显示晶片在处理3D图像和特效时主要依赖CPU的处理能力,称为“软加速”。3D显示晶片是将三维图像和特效处理功能集中在显示晶片内,也即所谓的“硬体加速”功能。显示晶片通常是显示卡上最大的晶片(也是引脚最多的)。现在市场上的显示卡大多采用NVIDIA和 AMD-ATI两家公司的图形处理晶片。
今天,GPU已经不再局限于3D图形处理了,GPU通用计算技术发展已经引起业界不少的关注,事实也证明在浮点运算、并行计算等部分计算方面,GPU可以提供数十倍乃至于上百倍于CPU的性能,如此强悍的“新星”难免会让CPU厂商老大英特尔为未来而紧张, NVIDIA和英特尔也经常为CPU和GPU谁更重要而展开口水战。GPU通用计算方面的标准目前有 OPEN CL、CUDA、ATI STREAM。其中,OpenCL(全称Open Computing Language,开放运算语言)是第一个面向异构系统通用目的并行编程的开放式、免费标准,也是一个统一的编程环境,便于软体开发人员为高性能计算伺服器、桌面计算系统、手持设备编写高效轻便的代码,而且广泛适用于多核心处理器(CPU)、图形处理器(GPU)、Cell类型架构以及数位信号处理器(DSP)等其他并行处理器,在游戏、娱乐、科研、医疗等各种领域都有广阔的发展前景,AMD-ATI、NVIDIA现在的产品都支持OPEN CL。
1985年 8月20日 ATi公司成立,同年10月ATi使用ASIC技术开发出了第一款图形晶片和图形卡,1992年 4月 ATi发布了 Mach32 图形卡集成了图形加速功能,1998年 4月 ATi被IDC评选为图形晶片工业的市场领导者,但那时候这种晶片还没有GPU的称号,很长的一段时间ATI都是把图形处理器称为VPU,直到AMD收购ATI之后其图形晶片才正式采用GPU的名字。
NVIDIA公司在1999年发布GeForce 256图形处理晶片时首先提出GPU的概念。从此NV显示卡的芯就用这个新名字GPU来称呼。GPU使显示卡减少了对CPU的依赖,并进行部分原本CPU的工作,尤其是在3D图形处理时。GPU所采用的核心技术有硬体T&L、立方环境材质贴图和顶点混合、纹理压缩和凹凸对应贴图、双重纹理四像素256位渲染引擎等,而硬体T&L技术可以说是GPU的标志。
主要品牌
GPU有非常多的厂商都生产,和CPU一样,生产的厂商比较多,但大家熟悉的却只有3个,以至于大家以为GPU只有AMD、NVIDIA、Intel3个生产厂商。
intel可能谁都想不到intel不但是世界上最大的CPU生产销售商,也是世界最大的GPU生产销售商。
intel的GPU在现在完全是集成显示卡,用于intel的主机板和intel的笔记本。可能你想不到,要是只按发售数量计算,intel随着他主机板发售的集成GPU占据了整个GPU市场的60%以上。
Nvidia现在最大的独立显示卡生产销售商,他的显示卡包括现在大家熟悉的
Geforce系列,比如GTX580 GTX480 GTX470 GTX460 GTX295等,还有专业的Quadro系列等。
他也同样销售固化在主机板上的集成显示卡,这些显示卡随着主机板一起发售,但是由于AMD兼并ATI后自身主机板晶片能力提高,NV主机板已经失去了显示卡界的半壁江山。
AMD世界上第二大的独立显示卡生产销售商,他的前身就是ATI。他的显示卡主要就是大家熟悉的HD系列,比如HD7970,HD7950,HD6970,HD6990等。在专业领域有FireGL系列
由于AMD收购ATI后,其主机板市场全面扩大,已经夺取了NVIDIA在AMD处理器主机板的全部份额。就发售量和发售盈利方面,AMD显示卡方面仍然略输于NVIDIA,不过两者不相伯仲,差距只是几个百分点。
Matrox当年和nv,ati一起争夺独立显示卡市场份额的一家公司,在曾经的一个时期Matrox的显示卡和nv,ati曾经在性能上比肩过。但由于后来其开发能力日渐衰退,在GF5时期,也就是ati的9000系列时期,Matrox由于性能上整整落后了GF5900和Raden9800一个世代而逐渐被淘汰,淡出了民用独立显示卡市场。
但现在Matrox仍然在工程用专业显示卡方面有自己的地位。这些显示卡用于工程主图和多头输出仍然很强力。与nv和amd的专业显示卡不同,nv,ati的专业显示卡涉足的是3D领域,而Matrox得专业显示卡涉足的是2D领域,也就是CAD。
但由于cuda的日渐普及,DX10以上显示卡将在所有支持CUDA的程式上表现出惊人的性能,也就是说当CUDA在各种运用软体普及的那天,Matrox也必将退出2D专业卡的市场。
sis和via硒统和威盛现在是对孪生兄弟,但他们曾经也是分开的两家公司,并且都生产自己主机板的集成显示卡。但这可怜的两兄弟已经逐步在淡出主机板市场了,也就必定将淡出GPU市场。 由于GPU的利益多,也许以后也会诞生出新的厂商。
其他资料NVIDIA公司在1999年发布GeForce256图形处理晶片时首先提出GPU的概念。GPU使显示卡减少了对CPU的依赖,并进行部分原本CPU的工作,尤其是在3D图形处理时。GPU所采用的核心技术有硬体T&L、立方环境材质贴图和顶点混合、纹理压缩和凹凸对应贴图、双重纹理四像素256位渲染引擎等,而硬体T&L技术可以说是GPU的标志。 GPU 是显示卡的“心脏”,也就相当于 CPU 在电脑中的作用,它决定了该显示卡的档次和大部分性能,同时也是2D显示卡和3D显示卡的区别依据。2D显示晶片在处理3D图像和特效时主要依赖CPU的处理能力,称为“软加速”。3D显示晶片是将三维图像和特效处理功能集中在显示晶片内,也即所谓的“硬体加速”功能。显示晶片通常是显示卡上最大的晶片(也是引脚最多的)。现在市场上的显示卡大多采用NVIDIA和AMD两家公司的图形处理晶片。
GPU能够从硬体上支持T&L(TransformandLighting,多边形转换与光源处理)的显示晶片,因为T&L是3D渲染中的一个重要部分,其作用是计算多边形的3D位置和处理动态光线效果,也可以称为“几何处理”。一个好的T&L单元,可以提供细致的3D物体和高级的光线特效;只不过大多数PC中,T&L的大部分运算是交由CPU处理的(这就也就是所谓的软体T&L),由于CPU的任务繁多,除了T&L之外,还要做记忆体管理、输入回响等非3D图形处理工作,因此在实际运算的时候性能会大打折扣,常常出现显示卡等待CPU资料的情况,其运算速度远跟不上今天复杂三维游戏的要求。即使CPU的工作频率超过1GHz或更高,对它的帮助也不大,由于这是PC本身设计造成的问题,与CPU的速度无太大关系。
工作原理简单说 GPU 就是能够从硬体上支持T&L(Transform and Lighting,多边形转换与光源处理)的显示晶片,因为T&L是3D渲染中的一个重要部分,其作用是计算多边形的3D位置和处理动态光线效果,也可以称为“几何处理”。一个好的T&L单元,可以提供细致的3D物体和高级的光线特效;只不过大多数PC中,T&L的大部分运算是交由CPU处理的(这也就是所谓的软体T&L),由于CPU的任务繁多,除了T&L之外,还要做记忆体管理、输入回响等非3D图形处理工作,因此在实际运算的时候性能会大打折扣,常常出现显示卡等待CPU资料的情况,其运算速度远跟不上今天复杂三维游戏的要求。即使CPU的工作频率超过1GHz或更高,对它的帮助也不大,由于这是PC本身设计造成的问题,与CPU的速度无太大关系。
与DSP区别GPU 在几个主要方面有别于 DSP (Digital 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的演变将继续下去,不仅仅作为绘制引擎,而是会成为个人电脑的主要计算引擎。
识别软体说起处理器识别工具 CPU-Z ,其知名度和必备度无需赘言。硬体网站TechPowerUp又给我们提供了一个类似的工具,用于显示卡识别的“GPU-Z”,支持XP/Vista/2000/2003。最新版本是2012年5月2日更新的0.6.2,档案大小为1MB。
更新说明:
GPU-Z 0.6.2
修正NVIDIA 开普勒Boost工作频率显示问题
GPU-Z 0.6.1
新增支持GeForce605,NVIDIA GeForce GTX690,GTX 670, GT 640, GT 630,Quadro 3000M GTX 675M, GTX 670M。
新增支持AMD Radeon HD7970M,HD7450
新增支持英特尔Sandy Bridge和Ivy Bridge集成显示卡
修正GK107 ROP侦测和显示
改进对NVIDIA 开普勒Boost工作频率检测
修正在没有安装驱动情况下,AMD南方群岛显示卡GPU-Z崩溃问题
修正在Windows XP不能正常工作问题
禁用NVIDIA开普勒不完整BIOS储存
BIOS档案现在另外储存为.rom
修正感测器图表重绘,并提高其性能
相关问题第一个问题:
GPU 的竞争远比 CPU 的竞争来得激烈。通用PC的CPU就只有英特尔和AMD两家大厂。而在GPU方面领先的是NVIDIA和AMD两家厂商,但能生产中低端产品的还有英特尔、三星等好几家厂商。它们的产品虽然不如前两家,但在很多套用方面也能满足使用者的需要,所以N记和A记只有拼命往前跑才不会死掉。CPU厂商没有采用GPU的先进工艺是因为CPU厂商都有自己投资的生产线,不可能一下把原来的生产线都淘汰了上新的生产线,那样做可能连当初投入的资金都难以收回。而GPU厂商由于种种原因,一般都是自己设计由别人代工的,比如找台积电代工。代工厂商为了能接到业务,只有不停升级自己的生产设备,这样才能生存下来。所以造成以上原因。
第二个问题
CPU除了处理游戏的AI,情节等方面的资料外,对于有些图像方面也是由它完成的。当微软每次发布新的DX时,并不是每款GPU都能支持DX新的特征,所以有些图像方面的任务还得由CPU来完成。还有有些特征比如重力特征以前是由CPU来完成,现在有些GPU也能支持了,这些任务就由GPU来完成了。
第三个问题
GPU相当于专用于图像处理的CPU,正因为它专,所以它强,在处理图像时它的工作效率远高于CPU,但是CPU是通用的资料处理器,在处理数值计算时是它的强项,它能完成的任务是GPU无法代替的,所以不能用GPU来代替CPU。
另外
AMD在2006年以54亿美元的巨资收购了ATI公司,AMD看到今后CPU和GPU只有走一条融合的道路才能地竞争中占得先机。CPU和GPU如何配合默契才能最大地提高工作效率是AMD现在考虑的问题,也是英特尔的问题。
第四个问题
微软发布Windows7 其中一个显著特征就是 联合GPU和CPU的强大实力,提升GPU在硬体使用的价值,在Windows7中,CPU与GPU组成了协同处理环境。CPU运算非常复杂的序列代码,而GPU则运行大规模并行应用程式。微软利用DirectX Compute将GPU作为作业系统的核心组成部分之一。DirectX Compute。它让开发人员能够利用 GPU的大规模并行计算能力,创造出引人入胜的消费级和专业级计算应用程式。简单的说,DirectX Compute就是微软开发的GPU通用计算接口,欲统一GPU通用计算标准。也就是说windows7 以后GPU的硬体地位将仅次于CPU,发挥出更大的效用。英特尔发布的酷睿二代Sandy Bridge处理器集成的核芯显示卡和AMD Llano APU已经将集成显示卡提升到了一个新的高度,英特尔下一代Ivy Bridge处理器更是进一步增强了核芯显示卡的能力。
GPU channel 是GPU与CPU之间的桥接接口,通过CPU向GPU发送GPU指令的唯一通道,GPU channel包含了两类用于存储GPU指令的buffer:
当GPU指令被写入到GPU command buffer时,系统还会向Ring buffer中写入与此指令所对应的packet,packet包含了此指令在GPU command buffer中的偏移位置与长度数据。
在执行指令的时候,GPU不是直接从GPU command buffer中读取数据,而是先经过Ring buffer读取出当前待处理指令的相关信息,再据此读取GPU command(这也是为什么Ring buffer被称之为indirect buffer的原因)。
现代GPU为了加强数据的并行化处理的强度,使用的是SIMT(Single Instruction Multi Thread,SIMD的更高级版本)体系结构,shader program运行的最小单位是thread,多个运行相同shader的threads会被打包到一个组(thread group),这个thread group,在NVIDIA被称之为warp,在AMD中被称之为wavefront。
上面这张图是从标题链接给出的Turing白皮书中截取的GPU架构图,其中包含如下几个关键缩写:
GPU中用于存储数据的结构有多种[4],分别是:
每种存储结构都有着各自的优缺点,因此适用于不同的应用场景,从访问速度来看,这些存储结构按照从高到低排序依次是:
RMEM >SMEM >CMEM >TMEM >LMEM >GMEM
RMEM与SMEM是直接集成在GPU芯片上的,而剩下的几种存储结构则是在GPU之外的芯片上的,此外,LMEM/CMEM/TMEM都有着各自的缓存机制,即在访问数据的时候都会首先从缓存中进行查找判断,再决定是否需要从更低一级速度的存储结构中进行读取。
存储在LMEM中的数据可见性与RMEM一样,都是只对负责对其进行读写的线程可见。LMEM实际上并不是一块物理存储空间,而是对GMEM的一个抽象,因此其访问速度与对GMEM的访问速度是相同的。LMEM中的数据对于一个线程而言是Local的(即只从属于当前thread的空间,对其他线程不可见),通常用于存储一些automatic变量(automatic变量指的是一些大尺寸的数据结构或者数组,因为寄存器不够,因此会塞入LMEM中),编译器在寄存器不足的时候,就会从GMEM中开辟一块空间用作LMEM。
虽然LMEM是从GMEM中分割出来的,但是其使用方式与GMEM还是有着一些区别:
如上图所示(从图中可以看出,L1是位于GPU芯片上的,其中SMEM就存储在其中,RMEM也是在芯片上,而L2及以后的存储空间则都是芯片之外的存储空间了),在对LMEM进行数据读写的时候,会经历这样一个缓存层级流动:L1->L2->LMEM。因为LMEM实际上是临时开辟的一块空间,因此里面的数据实际上是GPU先写入的,在此之前发生的读取就相当于读到了一堆乱码。
那么什么情况下会使用到LMEM呢?一般来说有如下两种情形:
因为LMEM相对于寄存器访问速度的低效性,因此其对性能的影响主要有如下两个方面:
但是因为以下的两点原因,LMEM也不一定会造成性能下降:
对于一些LMEM可能会存在瓶颈的情况,参考文献[3]中给出了一些分析的方法可供排查,同时还给出了对应的优化策略以及实战案例,有兴趣的同学可以前往参考。
存储在RMEM中的数据只对负责对此寄存器进行读写的线程可见,且其生命周期与此线程的生命周期一致。
通常情况下,对寄存器的访问不需要消耗时钟周期,但是在一些特殊情况(比如先进行了一个写 *** 作,之后再进行读取,或者在bank访问冲突的情况下),会有例外。先写后读的延迟大概是24个时钟周期,对于更新的GPU(每个SM包含32个cores的情况),可能需要花费768个线程来隐藏这个延迟。
当需求的寄存器数目超出硬件所能支持的限额时,就会导致寄存器压力,在这种情况下,数据就会使用LMEM来进行存储(所谓的spilled over,即溢出),如下图所示[3]:
存储在SMEM中的数据对处于同一个block所有的线程都是可见的(不负shared之名),因此通常用于多个线程之间的数据互换,为了避免多个线程同时访问相同的数据导致的阻塞,NVIDIA将SMEM划分成32个逻辑单元,每个单元叫做一个bank,在内存中连续的数据,在banks的分布也是连续的:
SMEM是位于L1 Cache中的,其尺寸通常为16/32/48KB,剩余部分用作L1 Cache,对于开普勒架构而言,每个bank每个时钟的带宽是64bits/clock,较早的Fermi架构时钟不太一样,但是带宽差不多是这个数值的一半。
由于一个warp中有32个线程,因此总共需要32个SMEM banks。由于每个bank在每个时钟周期中只支持一次访问请求,因此多个同时访问的请求就会导致bank conflict,这个的处理过程后面会讲。
默认每个bank占用32bits(4bytes),开普勒架构之后,可以通过指令(cudaDeviceSetSharedMemConfig(cudaSharedMemBankSizeEightByte))将每个bank扩充到64bits,以应对双精度数据的访问冲突。
存储在Global Memory中的数据对于当前进程中的所有线程都是可见的,其生命周期与进程一致。
CMEM通常用于存储一些常量数据,当同一个warp中的所有线程都需要使用同一个参数时,可以将数据放在CMEM中,这种做法比将数据放在GMEM中更节省带宽。
TMEM也是一种常量存储结构,当一个warp中的线程所需要读取的数据都是存储位置上相邻的时候,使用这种结构比GMEM具有更优的性能表现(也是出于带宽的原因)
[1]. A HISTORY OF NVIDIA STREAM MULTIPROCESSOR
[2]. Life of a triangle - NVIDIA's logical pipeline
[3]. Local Memory and Register Spilling
[4]. GPU Memory Types – Performance Comparison
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)