显卡的发展可以说是非常的快,人们对于视觉化上的要求也越来越高,随着用户对于图像处理上面的要求不断超出处理器的计算能力。另一方面CPU处理能力也不断强大,但在进入3D时代后,人们发现庞大的3D图像处理数据计算使得CPU越来越不堪重荷,并且远远超出其计算能力。图形计算需求日益增多,作为计算机的显示芯片也飞速发展。随后人们发现显示芯片的计算能力也无法满足快速增长的图形计算需求时,图形,图像计算等计算的功能被脱离出来单独成为一块芯片设计,这就是现在的图形计算处理器——GPU(Graphics Processing Unit),也就是显卡。
1999年8月,NVIDIA终于正式发表了具有跨世纪意义的产品NV10——GeForce 256。GeForce256是业界第一款256bit的GPU,也是全球第一个集成T&L(几何加速/转换)、动态光影、三角形设置/剪辑和四像素渲染等3D加速功能的图形引擎。通过T&L技术,显卡不再是简单像素填充机以及多边形生成器,它还将参与图形的几何计算从而将CPU从繁重的3D管道几何运算中解放出来。在这代产品中,NVIDIA推出了两个全新的名词——GPU以GeForce。所以从某种意义上说,GeForce 256开创了一个全新的3D图形时代,NVIDIA终于从追随者走向了领导者。再到后来GeForce 3开始引出可编程特性,能将图形硬件的流水线作为流处理器来解释,基于GPU的通用计算也开始出现。
到了Nvidia GeForce6800这一代GPU,功能相对以前更加丰富、灵活。顶点程序可以直接访问纹理,支持动态分支;象素着色器开始支持分支操作,包括循环和子函数调用,TMU支持64位浮点纹理的过滤和混合,ROP(象素输出单元)支持MRT(多目标渲染)等。象素和顶点可编程性得到了大大的扩展,访问方式更为灵活,这些对于通用计算而言更是重要突破。
真正意义的变革,是G80的出现,真正的改变随着DX10到来发生质的改变,基于DX10统一渲染架构下,显卡已经抛弃了以前传统的渲染管线,取而代之的是统一流处理器,除了用作图像渲染外,流处理器自身有着强大的运算能力。我们知道CPU主要采用串行的计算方式,由于串行运算的局限性,CPU也正在向并行计算发展,比如目前主流的双核、四核CPU,如果我们把这个概念放到现在的GPU身上,核心的一个流处理相当于一个“核”,GPU的“核”数量已经不再停留在单位数,而是几十甚至是上百个。下面看看G80的架构图:
步入DX10时代,shader(流处理器)单元数量成为衡量显卡级别的重要参数之一
G80中拥有128个单独的ALU,因此非常适合并行计算,而且数值计算的速度远远优于CPU。
GPU运算能力越来越快,甚至超越CPU
早期的3D游戏,显卡只是为屏幕上显示像素提供一个缓存,所有的图形处理都是由CPU单独完成。图形渲染适合并行处理,擅长于执行串行工作的CPU实际上难以胜任这项任务。直到1995年,PC机领域第一款GPU 3dfx Voodoo出来以后,游戏的速度、画质才取得了一个飞跃。GPU的功能更新很迅速,平均每一年多便有新一代的GPU诞生,运算速度也越来越快。
综上所述,GPU并行处理的理论性能要远高于CPU。同时,我们也可以通过上面这组NVIDIA统计的近两年来GPU与CPU之间浮点运算能力提升对比表格来看一下。
Intel Core2Due G80 Chip 运算能力比较
24 GFLOPS 520 GFLOPS GPU快21.6倍
虽然我们看到CPU和GPU在运算能力上面的巨大差距,但是我们要看看他们设计之初所负责的工作。CPU设计之初所负责的是如何把一条一条的数据处理玩,CPU的内部结构可以分为控制单元、逻辑单元和存储单元三大部分,三个部分相互协调,便可以进行分析,判断、运算并控制计算机各部分协调工作。其中运算器主要完成各种算术运算(如加、减、乘、除)和逻辑运算( 如逻辑加、逻辑乘和非运算); 而控制器不具有运算功能,它只是读取各种指令,并对指令进行分析,作出相应的控制。通常,在CPU中还有若干个寄存器,它们可直接参与运算并存放运算的中间结果。CPU的工作原理就像一个工厂对产品的加工过程:进入工厂的原料(程序指令),经过物资分配部门(控制单元)的调度分配,被送往生产线(逻辑运算单元),生产出成品(处理后的数据)后,再存储在仓库(存储单元)中,最后等着拿到市场上去卖(交由应用程序使用)。在这个过程中,从控制单元开始,CPU就开始了正式的工作,中间的过程是通过逻辑运算单元来进行运算处理,交到存储单元代表工作的结束。数据从输入设备流经内存,等待CPU的处理。
而GPU却从最初的设计就能够执行并行指令,从一个GPU核心收到一组多边形数据,到完成所有处理并输出图像可以做到完全独立。由于最初GPU就采用了大量的执行单元,这些执行单元可以轻松的加载并行处理,而不像CPU那样的单线程处理。另外,现代的GPU也可以在每个指令周期执行更多的单一指令。例如,在某些特定环境下,Tesla架构可以同时执行MAD+MUL or MAD+SFU。
CPU和GPU的架构区别
可以看到GPU越来越强大,GPU为显示图像做了优化之外,在计算上已经超越了通用的CPU。如此强大的芯片如果只是作为显卡就太浪费了,因此NVidia推出CUDA,让显卡可以用于图像计算以外的目的,也就是超于游戏,使得GPU能够发挥其强大的运算能力。
N年前NVIDIA发布CUDA,这是一种专门针对GPU的C语言开发工具。与以往采用图形API接口指挥GPU完成各种运算处理功能不同,CUDA的出现使研究人员和工程师可以在熟悉的C语言环境下,自由地输入代码调用GPU的并行处理架构。这使得原先需要花费数天数周才能出结果的运算大大缩短到数几小时,甚至几分钟之内。
CUDA是用于GPU计算的开发环境,它是一个全新的软硬件架构,可以将GPU视为一个并行数据计算的设备,对所进行的计算进行分配和管理。在CUDA的架构中,这些计算不再像过去所谓的GPGPU架构那样必须将计算映射到图形API(OpenGL和Direct 3D)中,因此对于开发者来说,CUDA的开发门槛大大降低了。CUDA的GPU编程语言基于标准的C语言,因此任何有C语言基础的用户都很容易地开发CUDA的应用程序。
那么,如何使得CPU与GPU之间很好的进行程序之间的衔接呢?以GPGPU的概念来看,显卡仍然需要以传统的DirectX和OpenGL这样的API来实现,对于编程人员来说,这样的方法非常繁琐,而CUDA正是以GPGPU这个概念衍生而来的新的应用程序接口,不过CUDA则提供了一个更加简便的方案——C语言。