1、摩尔的预言 唯有 CUDA 才是终极的 CPU(一)上一篇 / 下一篇 2008-07-28 10:05:43 / 个人分类:媒体评论查看( 724 ) / 评论 ( 1 ) / 评分( 0 / 0 )开篇前言:终极的 CPU现在很多人在谈论 GPGPU 和 CUDA 这样的通用计算技术,几乎很多硬件的评测,都要跟这个扯上点关系。但是那些泛泛而谈的文章根本没说到点儿上。在 NVIDIA 发布GT200系列显示芯片之后,这种基于 GPU 的通用进算更 High 到了前所未有的高潮。就连Intel 也放胆,标榜其下一代独立显卡 Larrabee 有多么超强的通用计算能力。今天小编我就来跟大家深入到
2、 CUDA 的内部,为大家诠释为什么说:唯有 NVIDIA CUDA 才是终极的CPU。 小熊在线 让我们先回溯过去的一段时间,早在2003年,Intel 和 AMD 都在不遗余力的为生产出性能强大的处理器而打拼着。由于两大公司的激烈竞争,在短短几年 的时间里,处理器的主频时钟速度有了显著的提升。尤其是到了 Intel 的 Pentium 4时代,处理器的时钟频率狂飙到了一个前所未有的高度。小熊在线 傻快傻快的奔腾4但是随着制造工 艺技术的制约,这种时钟频率的提升很快就碰到了壁垒。从2001年至2003年,Pentium 4处理器的时钟频率从最初的 1.5GHz 提升到了3GHz。然而从200
3、3年到2005年,整整2年的时间里,处理器的时钟频率提升的速度骤然放缓,只是 从3GHz 增加到3.8GHz。小熊在线 处理器频率大战在2005年画上了休止符在最后,Intel 到了强弩之末之时仍然不肯放弃。他们充分的优化了处理器的架构,使之可以运行在更高的频率上,Prescott 核心就是这种造神运动的 产物。不过 Intel 所面对的问题已经不再是工业制造技术的问题了,芯片制造商所面对的是最简单最基本的物理定律的壁垒。一些评论家甚至提出摩尔定律也将 就此失效。不过事实远非如此,只是摩尔定律最初的意思被很多人曲解罢了。摩尔定律所述的是有关在一定面积内的晶体管的集成度。只是长期以来,处理器晶体
4、管 集成度的提高都会伴随着性能的提升和时钟频率的提高罢了。这必然很容易让无知的人将摩尔定律的本源所曲解。在后来,情况又变得更加复杂了。随着处理器架构 的革新,晶体管的集成度也越来越高,并且正向着一条死胡同儿发展。摩尔定律与运算效能CPU 制造商正在尽力寻找解决问题的方法时,GPU 制造商却迎来了前所未有的机会,显示核心比处理器更试用摩尔定律。小熊在线 GPU 的机会来了为什么 Intel 不能在 CPU 中运用相同的设计, 让处理器跑的更快呢?其实原因非常简单,处理器的设计宗旨就是要从指令流中得到最高的处理效能。由此处理器的设计师们使用了很多附加的措施,例如将数据分 为浮点、整数等不同的数据类
5、型,嵌入随机存储装置,使用分支预测技术等等。而优秀的处理器架构就能在同一时间处理更多条指令,就是传说中的并行处理。由 此,Pentium 处理器中引入了超标量执行的概念,在某些情况下,每个时钟周期可以处理2条指令。而在 Pentium Pro 处理器时代,又迎来了 out-of-order 乱序执行的概念。为了更好的利用执行单元,处理器可以乱序执行指令,进一步提高指令处理的效能。可是 问题是指令流是连续的,它会大大制约并行执行单元的效率。因此盲目的在处理器中增加并行执行单元是毫无用处的,他们可能在绝大多数时间处于空闲状态。这也 是目前困扰多核心处理器的一大问题。小熊在线 反过来说,GPU 在运
6、作时就非常之简单了。它的工作就是要生成一组多边形,同时产生一组像素填充到多边形中去。多边形和像素之间的处理操作是独立的,因此 他们能使用并行处理的思想,在处理流水线中尽可能的加入更多的并行执行单元来加快处理的速度。这就意味着 GPU 将会有更多的执行处理单元处于忙碌状态,这 会比 CPU 具备更高的处理效能。小熊在线 简单而强大的 GPUGPU 与 CPU 另一个不同之处就是记忆体。 GPU 与显存之间的联系极为亲密。当 GPU 要读取一个材质单元时,需要使用几个时钟周期读取临近的材质单元。并且当写 入一个像素的时候,也需要花费几个时钟周期参考临近的单元。这种机制对于内存来说是非常有利的,理论
7、上讲它可以更加合理的利用显存带宽。GPU 与 CPU 不 同之处在于,GPU 不需要庞大的高速缓存。缓存的目的仅仅是加速材质的处理速度。几 KB 的空间就能包含所需要的三线和双线过滤文件。小熊在线 横空出世:GeForce FXCPU 与 GPU 是完全两个独立的世界,这种分离持续的时间相当长。我们使用 CPU 来进行办公、互联网冲浪等应用。而 GPU 仅仅是为了更快的绘制出漂亮的图像。但 是一个理念的出现,彻底的改变了传统。GPU 具备了可编程性。这让 CPU 感到了一种前所未有的恐慌。第一款被称作可编程的 GPU 是 NVIDIA 的 NV20,就是传说中的 Geforce3,不过它远远不
8、能对CPU 的地位构成威胁。它能够处理的程序指令还非常有限,大约在10条左右,另外它所能处理的 数据类型也非常之有限,只能处理9或12bit 固定长度的数据。小熊在线传说中的 GeForce FX当 NVIDIA 的 NV30发布的时候,摩尔定律再次得到了印证,不仅仅是晶体管数量的增加,计算单元的数量也成倍增长。同时这也使得显卡芯片更具灵活性。 因此 NVIDIA 的NV30具备许多革命性的突破。虽然游戏发烧友可能并不会像跪拜 Voodoo 6000那样将一块GeForce FX 当作自己最心爱的收藏,但是它真的让 GPU 看上去不仅仅是一颗图形加速器。小熊在线 从 NV30起,GPU 开始支
9、持单精度浮点运算,即使它并不完全支持 IEEE754标准,但这消息却让许多程序员感到振奋人心。另外它还支持超过数以万记的指令处理。这一点是最吸引研究人员的地方,他们可以通过一些途径找到突破芯片生产工艺技术的壁垒,制造出性能更为强大的芯片。小降临凡间:GPGPU 技术使用图形加速器的架构设计思 想,运用到数学计算中去,这种考量并不是进期才萌生而出的。事实上,追溯到20世纪90年代,就有一些研究员萌生了一些想法。只是简单的利用基于 GPU 硬 件布线级别的功能,比如利用光栅和 Z-buffers 来计算弹道轨迹或绘制 Voronoi图表。这也算是对 GPU 最为原始的通用计算应用点子。Vorono
10、i 图,又叫泰森多边形或 Dirichlet 图,它是由一组由连接两邻点直线的垂直平分线组成的连续多边形组成。N 个在平面上有区别的点,按照最邻近原则划分 平面;每个点与它的最近邻区域相关联。Delaunay 三角形是由与相邻 Voronoi 多边形共享一条边的相关点连接而成的三角形。Delaunay 三角 形的外接圆圆心是与三角形相关的 Voronoi 多边形的一个顶点。Voronoi 三角形是 Delaunay 图的偶图。使用 Voronoi 图来绘制世界人口的密度在 2003年,GPU 中又出现了另一个新的高级概念Shader。这是 GPU 发展史上的又一次重大革新。这次 GPU 的硬件
11、已经可以进行矩阵计算。在此后 的1年时间里,SIGGRAPH美国计算机绘图专业组一直致力于 GPU 通用计算方面的研究工作。由此他们率先提出了一个名为 GPGPU 的概念,意思是具有 通用计算用途的 GPU。这可以说是 GPU 发展最具创意的里程碑。由此2003年年底,第一个通用计算程序 BrookGPU 也随之到来。BrookGPU 是斯坦福大学一个相当有趣的项目,它可以为你展现当前 GPU 的强大性能,虽然目前 GPU 尚不能完全取代 CPU,但是这个编译器为 GPU 模拟 CPU 的一般应用提供了一个运行环境。BrookGPU 是一个编译器和实时系统,可以为当前 GPU 提供简单的类似
12、C 的编程环境。一个运行在 NVIDIA GeForce FX 5900 Ultra 的 shader 程序运算速度可达20 GFLOPS,相当于10GHz 的 Pentium 4,而且图形系统的内存带宽为25.3 GB/sec,相比 Pentium 4只有5.96 GB/sec。早在2003年,要想发挥 GPU 的运算优势,我们只有两种图形 API 可供选择:Direct3D 或 OpenGL。因此,研究人员想利用 GPU 强大的处理能力不得不去学习这些 API 的用法。问题是搞 GPU 通用计算开发的研究人员一般并不是专业的绘图程序员。 这对于他们来说是一项非常严密而复杂的技术。需要熟悉3
13、D 应用程序中的 Shader 着色单元、材质单元、帧等等各种各样的概念。另外还要精通并行处理程序 方面的技术例如:流处理,内核,分布式计算,集群计算等等。所以第一个难点就是类比 GPU 和 CPU 之间的差异,在两个完全不同的世界中,我们要寻找到相似 的、共通的东西。stream 流你可以把数据想象成会流动的液体,他们会在 GPU 中不断的穿梭往来。GPU 使用纹理来描绘出场景。而在经典的 CPU 编程中,我们可以将它类比成一个数组。kernel 内核它的功能将适用于每一个独立的 stream 流。它相当于是 pixel shader 像素着色单元。从概念上讲,它能够实现一个非常典型的程序内
14、部循环,它适合处理较长较大的数据。从一个应用程序的内核中的流读取执行结果,这一步就相当于在材质单元中进行渲染。很显然,处理器中并没有渲染这个概念,不过这可以看作是对内存的访问。控制本地内存的写入地点,即分散操作。这可以使用 vertex shader 顶点着色单元来完成,因为 pixel shader 像素着色单元在处理时,不能修改像素的坐标值。通用计算:鼻祖 BrookGPUBrookGPU LOGO上 面的这张图片极具现代艺术气息。不过在通用计算业界,这张图片却代表了一场异常澎湃的革命。Brook 程序制定了一套基于 C 语言的扩展指令集“C with streams”。具体来说,Broo
15、k 的目的就是将所有的3D API 都封装起来,在应用程序中,充分的发挥 GPU 的并行处理能力,协助 CPU 完成繁重的计算任务。为此,Brook 带有一个编译器,以*.br 文件包含 有 C+代码和扩展代码,并且可以生成标准的 C+代码。不会拘泥于任何3D API的限制,可以适用于多种3D API。无论是 DirectX、OpenGL ARB、OpenGL NV3x 还是x86。BrookGPU 实现架构Brook 具备几个技术优势。首先让 GPGPU 走出了心里阴影,让程序员们知道使用 GPU 做通用计算并不是一件难事。事实上,当 Brook 发布的时候,当时就有许多 IT 网站发表社论
16、,直接了当的说:CPU 已死,GPU 的性能太过强大,很快将会改变整个计算世界的格局。炒作这番言论已经是5年之前的事儿了,在五年之后 的今天,这件事情仍然没有发生。这让我们明确了一点:GPU 绝对不会取代 CPU。不过从另一个方面看,CPU 的发展史,并入了 GPU 的老路。现代处理器越 来越看重并行处理效能,它们的内部集成了越来越多的处理核心,同时还在不断扩展着多线程技术和 SIMD 处理单元。而目前的 GPU 正好相反,朝着更庞大,更 灵活的方向发展。GPU 开始支持单精度浮点运算,开始支持整数运算,很快 GPU 就将充分支持双精度计算。这种发展的态势非常明显,无论是 GPU 还是 CPU
17、 的发展路线,两者都会在某一时刻相交在一起。因此,最终将发生什么事情呢?GPU 将吸纳 CPU 的功能,成为一个数学协处理器?目前,Intel 和 AMD 都 在紧锣密鼓的致力于这方面的研究。但在这期间,整个计算机和图形界的技术趋势也在悄悄地发生着变化。让 我们回到最初的话题,Brook 最初的优势就是要普及 GPGPU,不让3D API 限制 GPU的应用。Brook 的出现,大大简化了迈入 GPU 通用计算的门槛,使得很多开始刚刚学习编程的人也能驾轻就熟。不过在另一方 面,Brook 仍然有很长的路要走,需要更多的完善,它才能使 GPU 通用计算成为可以信赖的高效能计算技术。现 在 Bro
18、ok 发展所面临的问题已经不是跨 API,跨平台方面的技术性问题了。它所面对的是目前繁多的3D API,要想将所有的 API 都整合到一起,所需的工作量相当庞大。但是随着3D 技术的不断发展,真正的问题还是兼容性,这个问题已经发展到他们无法掌控的 局面。考虑到各大 GPU 厂商之间的竞争,很多大公司都会在 GPU 中加入自己的特色技术,会有各种不同版本的驱动程序。即使是 DirectX API 也未在硬件方面完全统一过规格。针对游戏而优化的专门驱动,可以让游戏跑的更顺畅,而这些对于 Brook 的开发人员而言,却等于 n 个晚上的通宵工 作。这使得想统一 GPU 通用计算的 API 变成了一件
19、非常困难的事情。因此相当长的一段时期以来,Brook 仍然只是高级研究员和程序员的玩物,并未得到更 广泛的普及。战神诞生:CUDA APIBrook 至今仍未成功的主要原因,就是它并没有得到 ATI 和 NVIDIA 的足够重视。因为这两个巨人都看到了新的契机,在技术背后蕴含着更为广阔的市场。在这个市场已经不在那么关注他们的图形性能。由此 Brook 的研究人员班底,很快就加入了在美国 Santa Clara 的开发团队,与 NVIDIA 全球的工程师一起,从事这个全新领域的研究工作。主旨就是提供一套软件和硬件相结合的整体高性能计算解决方案CUDA。NVIDIA 开发人员众所周知的一个 GPU 的秘密:他们不想依赖任何的图形 API 接口,仅仅通过驱动程序与硬件通信。这就意味着可以解决所有 Brook 遇到的技术实现 问题。由此CUDA(Compute Unified Device Architecture)通用计算架构就此诞生,可以说它是一个基于 GPU软件层的通信技术。CUDA API从上图中,你也可以看到 CUDA 提供了两种不同类型的 API 接口:1、一种是高级的 API:CUDA 运行的 API2、另一种是低级 API:CUDA 的驱动 API高 级的 API 是在低级 API 之上所执行的,每一个调用的函数在运行的时候都可以被驱动 API