从GPU到GPGPU(转)

GPU的工作原理
GPU的起源可以追溯到个人电脑开始普及的80年代,此时用户开始有了游戏的需求。为了更好的用户体验,各游戏公司纷纷推出3D游戏。而图形渲染在3D游戏中起到至关重要的作用,因此GPU应运而生。GPU的产生是为了在计算机屏幕上更快地、显示更多的特效效果。
例如,在设计一个游戏人物的时候,我们希望他的肤色、头发能够尽可能的逼真。这样的效果在80年代的时候还做不到,那个时候显示效果还很粗糙。但是在最近的电影《魔幻森林》里面,除了主角小男孩是真实的,其余动物以及布景都是计算机生成的。

从GPU到GPGPU(转)_第1张图片
图片描述

可以说现在的图像处理技术已经能够达到很好的效果了,但是还有很大的发展空间。因为人眼对色彩的感知能够达到浮点数级,而不是指数级,成像能力极高,所以将来可能还需要更加逼真的显存效果。
又比如游戏,游戏的场景是动态的,人物每向前走一步,就需要生成新的场景。这个场景通过实时渲染得来。通常情况下像素点的渲染是按照并行的方式进行处理的,所以GPU天生拥有很多很小的内核来并行处理像素点。那么GPU的工作原理如何?它是如何产生图像的呢?
GPU做图形处理的时候,是以图形流水线(Graphics pipeline )的模式工作的。GPU从CPU那里得到很多的三角网格(如下图所示),这些三角网格被用来近似地表示物体的曲面。
从GPU到GPGPU(转)_第2张图片
图片描述

比如,现在我们要显示一个拳头,因为在计算机上很难表征任意曲面,因此计算机会将这个拳头切成一个三角网络,曲率比较小的地方用相对大一些的三角形,曲率比较大的地方就用小一点的三角形。这些三角形在空间中存在着某种邻接关系。 只要对三角网络的划分足够细,就可以模拟出这个拳头的形状。
GPU从CPU那里得到这个三角网络之后,简单来说会进行两个步骤的处理:
第一步:Vertex级的处理
Vertex级的处理为顶点级的处理:
取三角网格中的顶点进行光照处理。对顶点进行光照处理后,顶点与定点之间会互相产生影响。

对每一个三角形,做从三维空间到二维平面上的投影。

顶点级处理之后,三维空间里的物体就被映射到二维平面上了。
第二步: Fragment级的处理
投影到二维平面上之后,这个拳头依然是由很多邻接三角形所表征的,我们需要将这些三角形转化为像素,最后要显示在屏幕上的是一个一个的像素点。
首先,我们将每一个三角形用一组Fragment取代,Fragment和像素大小相等,你可以把Fragment理解成像素的草稿。

接下来,我们要对Fragment进行渲染,渲染涉及到这一组Fragment的颜色、光照、材质等等。比如杯子可能是陶瓷材质、桌子可能是木头材质。材质是提前确定好的,但是光照是实时的,在阳光下和阴影中,同样材质的物体表现出的状态也是不同的。这个时候,我们需要用到一个渲染公式来计算这一组像素点的颜色。

最后,将这些Fragment的前后顺序进行排列,因为有些Fragment是会被遮挡的,将排在最前面的Fragment选出来,就得到了最后要显示在计算机屏幕上的像素。

从GPU到GPGPU(转)_第3张图片
图片描述

当然刚才提到的处理过程是经过简化的,实际情况是非常复杂的。比如说水的效果,斯坦福就有学者专门研究如何仿真水的效果,涉及到流体方程,是一个交叉学科;又比如头发,比如动物的皮毛,比如人物穿了一件毛衣,在走路的时候会有什么样的效果,这些都是很复杂的。
从GPU到GPGPU
到2004年左右,因为并行的缘故,GPU的单核计算能力开始超过CPU。这里的计算能力指的是峰值能力。如何计算峰值能力?最简单的办法就是,让CPU和GPU同时做1+1的运算,比较他们分别一秒钟计算的次数。
此时GPU的计算能力开始超过CPU,这引起了科学家们的注意,科学计算主要追求峰值的计算能力。其实没有任何应用能够达到峰值,但是有些应用会接近峰值,比如矩阵计算的的速度可以达到峰值的70%到80%。有些科学家研究大气、大海,这样的学科永远需要更强大的计算能力来计算庞大的数据,这个时候GPU就派上用场了。在最近很热的机器学习中,深度神经网络模型中需要做大量的矩阵计算,GPU正好很擅长,因此又火了一把。
但是传统的GPU是用来做图形计算的,所用的编程模型是OpenGL。如果想用GPU做通用的计算,就要有更通用的编程工具。为此,NVIDIA推出了一种计算架构,叫CUDA(Compute Unified Device Architecture),又称统一计算架构。CUDA上有很多工具可以用来为通用计算编程。
下图为CUDA生态系统,截图自NVIDIA官网。


从GPU到GPGPU(转)_第4张图片
图片描述

在被用做通用计算的初期,GPU的内部结构还是非常不规范的。上文说到,为了显示图像,GPU会进行两个步骤的处理。因此GPU内部也存在两种处理器,Vertex级处理器以及Fragment级处理器。 除了上述两种处理器之外,还有一些像素级的处理单元。这些处理器、处理单元都放在一个芯片上,不同的处理单元采用不同的程序编程。由于编程相对容易,最初进行科学计算的时候,普遍用的是Fragment级处理器。但这种策略带来的问题是,Vertex级处理器以及其它处理单元没有被有效利用。
到2008年的时候,NVIDIA在GPU的芯片设计方面做出了很大的改进,设计出了统一处理器(Unified Processor )。Vertex级的处理和Fragment级的处理都可以在统一处理器上实现,大大提高了通用计算时的资源利用率。
除此之外,为了支持通用计算,GPU还增加了缓存。缓存的作用是为了平衡处理器与存储器之间速度的差异。做图形计算的时候,GPU不需要缓存,因为图形计算的存储访问完全是可预期的。在刷新屏幕的时候,一定是从左上角的第一个像素开始逐行刷新。而且每一个像素点刷新结束后,不需要再进行访问。但是通用计算不同,为了适应通用计算,GPU有了缓存,而且缓存越来越大,到现在已经能够达到几兆的量级。此前GPU和CPU的一个本质的区别,就是CPU有缓存而GPU没有,现在这个区别也不大了。


从GPU到GPGPU(转)_第5张图片
图片描述

有了这些改进之后,现在GPU的运算能力普遍已经达到3T Flops左右,即每秒钟能够进行3万亿次浮点运算。CPU的运算能力可能是GPU的几十分之一,到一百分之一。但是,当谈到GPU能否吸取CPU的优点,进而替代CPU的时候,邓教授是持否定态度的。原因在于CPU和GPU的设计思想不同,CPU天生就被设计成一个全面手,能够处理非常复杂的任务。比如用Word编辑文档的过程涉及到的字处理,其控制流程非常复杂,但是计算量不是很大。
GPU被设计用来完成很清晰的任务,比如矩阵的计算。当计算100万行和100万列的矩阵相乘的时候,我们可以将计算过程很清晰地划分出很多并行的模块,类似这种任务GPU很擅长。
CPU的设计在于几个超强的核,每一个核能够单独处理很复杂的事情。而GPU的设计侧重于几千个很小很弱的核,每个核做很小很弱的事情。如果强迫GPU去吸取CPU的优点,那它也要有很复杂的核,因此就很难保证核的数量。但现在也有一些公司,比如Intel、AMD,在做融合处理器。在同一个芯片上既有CPU内核,也有若干个GPU内核,但目前还做不到让CPU和GPU使用同一种内核。
GPU及CPU行业的发展历程
虽然GPU在80年代就已经出现,但是直到90年代才开始有GPU的叫法。说起GPU,一定要谈NVIDIA。NVIDIA于1993年成立,当时的GPU市场呈双雄并立的局面,一家是NVIDIA,另一家是ATI。这两家公司的创始人都是华人,NVIDIA的创始人黄仁勋从小在美国长大,ATI的创始人来自台湾。
当时NVIDIA和ATI的竞争非常激烈,在摩尔定律尚且成立的年代,电路规模每18个月翻一番、性能提高一倍。然而当时NVIDIA和ATI每半年发布一款新产品,其成长速度远高于摩尔定律,这也切实促进了GPU行业的发展。
双雄并立的局面持续到2000年代初期,ATI在某些动作方面略显迟钝,最终因资金周转问题被AMD收购。
从GPU到GPGPU(转)_第6张图片
图片描述

AMD和Intel并称CPU双雄。AMD多年来一直被Intel打压,或许因为反垄断法的原因,Intel一直保留着这个竞争对手,并且时刻小心,不让自己被AMD超过。当时AMD为了和Intel竞争,拓展市场,收购了AMD。所以现在GPU行业内,NVDIA的主要竞争对手已经变成AMD。大部分时候NVIDIA比AMD在市场份额上略强一些。
Intel也生产GPU,但主要生产比较低端的GPU,比如笔记本自带的GPU一般出自Intel。若你是游戏爱好者,自己另行配置的显卡上的GPU一般出自NVIDIA或者AMD。
谈及中国的芯片市场,邓教授表示:“我们中国也有自己的处理器,中国科学院研制的,叫龙芯。但是龙芯真正所占的市场份额很少。中国的半导体行业进步很快,但仍然不能在主战场和国外的公司竞争。国内目前还有一些针对移动应用的图形处理器公司,一般规模很小。不过我们还是应该抱有平常心,毕竟全世界只有一家Intel、一家AMD、一家NVIDIA。”

你可能感兴趣的:(从GPU到GPGPU(转))