如何优化GPU数据库性能优化详解,解

WeTest 导读
本文作者从自身多年的Unity项目UI开发及优化的经验出发,从UGUI,CPU,GPU以及unity特有资源等几个维度,介绍了unity手游性能优化的一些方法。
在之前的文章《手游内存占用过高?如何快速定位手游内存问题》中提到,Mono内存和native内存是PSS内存主要的组成部分,mono内存更多的起到内存调用的功能,因此常常成为了开发人员优化内存的起点;而在游戏的其他的进程中,同样有很多因素影响着游戏的性能表现。本文将从UGUI的优化角度,介绍unity游戏性能优化的一些内容。
一、UGUI简介
UGUI是Unity官方推出的UI系统,集成了所见即所得的UI解决方案, 其功能丰富并且使用简单,同时其源代码也是开放的,下载地址:
相比于NGUI,UGUI有以下几个优点:
所见即所得的编辑方式,在Scene窗口中即可编辑。
智能的Sprite packer可以将图片按tag自动生成图集而无需人工维护,生成的图集合并方式比较合理,无冗余资源。
渲染顺序与GameObject的Hierarchy顺序相关,靠近根节点显示在底层,而靠近叶子节点显示在顶层;这样的渲染方式使得调整UI的层级比较方便和直观。
RectTranForm及锚点系统更适合于2D平面布局,并且非常方便多分辨率屏幕自适配。
二、UI制作规范和指导方法
本文是关于UGUI优化的,或许你会觉得UI的制作规范及指导方法与优化无关,其实很多性能问题往往是资源的不合理使用造成的,比如使用了尺寸过大的图片、引用了过多的图集以及加载了不必要的资源等。如果从设计和制作UI一开始就遵守特定的规范,则可以规避不必要的性能开销。笔者根据参与的多个项目总结了以下几点通用的规范和指导方法(这些规范适用于所有项目,不管你使用UGUI还是NGUI)。
1. 合理的分配图集
合理的分配图集可以降低drawcall和资源加载速度;具体细节如下:
(1) 同一个UI界面的图片尽可能放到一个图集中,这样可以尽可能的降低drawcall。
(2)共用的图片放到一个或几共享的图集中,例如通用的弹框和按钮等;相同功能的图片放到一个图集中, 例如装备图标和英雄头像等;这样可以降低切换界面的加载速度。
(3)不同格式的图片分别放到不同的图集中,例如透明(带Alpha)和不透明(不带Alpha)的图片,这样可以减少图片的存储空间和占用内存。(UGUI的sprite packer会自动处理这种情况)
2. resources目录中应该只保存prefab文件,其它非prefab文件(例如动画,贴图,材质等)应放到resource目录之外
因为随着项目的迭代,可能会导致部分资源(动画,贴图)等失效,如果这些文件放在resource目录下,在打包时,unity会将resource目录下文本全部打成一个大的AssetBundle包(非resouce目录下的文件只有在引用到时才会被打到包里),从而出现冗余,增加不必要的存储空间和内存占用。可以通过以下代码(Mac环境下)在控制台窗口中查看当前目录下所有非prefab资源的代码:
find . -type f | egrep -v "(prefab|prefab.meta|meta)$"
例如在笔者的一次扫描中,发现在了如下结果:
3. 关卡内的UI资源不要与外围系统UI资源混用
在关卡内,需要加载大量的角色及场景资源,内存比较吃紧,一般在进入关卡时,都会手动释放外围系统的资源,以便使关卡内有更多的内存可以使用。如果战斗内的UI与外围系统的UI使用相同图集里的图片,则有可能会使得外围系统的图片资源释放不成功。对于关卡内与外围共用的UI资源需要特殊处理,一般来说复制一份出来专门给关卡内使用是比较好的选择。
4. 适当的降低图片的尺寸
有时UI系统的背景可能会使用全屏大小的图片,比如在Iphone上使用大小的图片;使用这样尺寸的图片代价是很昂贵的,可以和美术同学商量适当的降低图片的精度,使用更低尺寸的图片。
5. 在android设备上使用etc格式的图片
目前,几乎所有android设备都支持etc1格式的图片,etc1的好处是第个像素点只战用0.5个字节而普通rgba32的图片每个像素点占4个字节,也就说一张图片如果使用rgba32的格式所占用的内存为4M而etc1格式所占用的内存仅为0.5M。但是使用etc1格式的图片有两个限制——长和宽必须是POT的(2的N次方)并且不支持alpha通道,因此使用etc1时需要额外的一张图来存储alpha通道,并且使用特殊的shader来对alpha采样。具体的细节可参考:
6. 删除不必要的UI节点、动画组件及资源
随着项目的迭代,可能有部分ui节点及动画已经失效,对于失效的节点及动画一定要删除,在很多项目中,有部分同学为了方便省事,只是将失效的节点及动画disable了。这样做虽然在运行时不会对cpu造成太多负担,但是在加载时会增加不必要的加载时间以及内存占用。对于废弃的UI图片资源,虽然未放到Resource目录最终不会打到包里,但是在Editor模式下仍然会打到图集中从而影响优化决策。笔者写了一个扫描未使用到UI贴图资源的工具,代码地址:;
另外,对于废弃的脚本,可能还会有某些对象持有对它的引用,而加载这样的对象也比较耗时,笔者也写了一个扫描废弃脚本的工具,代码地址:
三、CPU优化
一般来说,优化cpu性能应该先用profiler定位到性能热点,找到消耗最高的函数,然后再想办法降低它的消耗。经过笔者多次使用profiler对UGUI的分析来看,其CPU性能开销高主要原因之一是Canvs对UI网格的重建,有很多情况会触发Canvas对网格的重建,例如Image,Text等UI元素的Enable及UI元素的长、宽或Color属性的变化等。Canvas中UI Mesh顶点较多的话,则该项将会出现较高的CPU开销。在Unity的Profiler中则对应的是Canvas.SendWillRenderCanvases或Canvas.BuildBatch占用过多的时间。
Canvas.BuildBatch主要功能是合并Canvas节点下所有UI元素的网格,合并后的网格会缓存起来,只有其下面的UI元素的网格发生改变时才会重新合并。而UI元素的网络变化主要是因为Canvas.SendWillRenderCanvases调用时,rebuild了Layout或者craphic。该函数的调用过程时序图如下:
1.该过程由CanvasUpdateRegistry监听Canvas的WillRenderCanvases(上图中1)而执行,主要是对前标记为dirty的layout和craphic执行rebuild。引起layout和graphic的dirty主要原因是因为Canvas树形结构下的UI元素发生了变化(例如增加删除UI对象,UI元素的顶点,rec尺寸改变等)调用了Graphic.SetDirty(实际上最终都会调用CanvasUpdateRegistry.RegisterCanvasElementForLayoutRebuild)。
在rebuild layout之前会对Layout rebuild queue中的元素依据它们在heiarchy中的层次深度进行排序(上图中的2),排列的结果是越靠近根的节点越会被优先处理。
rebuild layout(上图中的3),主要是执行ILayoutElement和ILayoutController接口中的方法来计算位置,Rect的大小等布局信息。
rebulid graphic(上图中的4),主要是调用UpdateGeometry重建网格的顶点数据(上图中5)以及调用UpdateMeterial更新CanvasRender的材质信息(上图中6)。
基于以上UGUI的网格更新原理,我们可以做以下优化:
a. 使用尽可能少的UI元素;在制作UI时,一定要仔细查检UI层级,删除不不必要的UI元素,这样可以减少深度排序的时间(上图中的2)以及Rebuild的时间(上图中的3,4)。
b. 减少Rebuild的频率,将动态UI元素(频繁改变例如顶点、alpha、坐标和大小等的元素)与静态UI元素分离出来,放到特定的Canvas中。
c. 谨慎使用UI元素的enable与disable,因为它们会触发耗时较高的rebuild(图中的3、4),替代方案之一是enable和disableUI元素的canvasrender或者Canvas。
d. 谨慎使用Text的Best Fit选项,虽然这个选项可以动态的调整字体大小以适应UI布局而不会超框,但其代价是很高的,Unity会为用到的该元素所用到的所有字号生成图元保存在atlas里,不但增加额外的生成时间,还会使得字体对应的atlas变大。
e.谨慎使用Canvas的Pixel Perfect选项,该选项会使得ui元素在发生位置变化时,造成layout Rebuild。(比如ScrollRect滚动时,如果开启了Canvas的pixel Perfect,会使得Canvas.SendWillRenderCanvas消耗较高)
f. 使用缓存池来保存ScrollView中的Item,对于移出或移进View外的的元素,不要调用disable或enable,而是把它们放到缓存池里或从缓存池中取出复用。
g. 除了rebuild过程之外,UGUI的touch处理消耗也可能会成为性能热点。因为UGUI在默认情况下会对所有可见的Graphic组件调用raycast。对于不需要接收touch事件的grahic,一定要禁用raycast。对于unity5以上的可以关闭graphic的Raycast Target而对于unity4.6,可以给不需要接收touch的UI元素加上canvasgroup组件。
四、GPU优化
一般来说,造成GPU性能瓶颈主要有两个原因:复杂的vertext或pixel shader计算以及overdraw造成过多的像素填充。在默认情况下UGUI中所有UI元素使用都使用UI/Defaut shader,因此在优化时可优先考虑解决Overdraw问题。Overdraw主要是因为大量UI元素的重叠引起的,查看overdraw比较简单,在scene窗口中选择overdraw模式,场景中越亮的地方表示overdraw越高(如下图)。
为了降低overdraw,可以做如下优化:
禁用不可见的UI,比如当打开一个系统时如果完全挡住了另外一个系统,则可以将被遮挡住的系统禁用。
不要使用空的Image,在Unity中,RayCast使用Graphi作为基本元素来检测touch,在笔者参与的项目中,很多同学使用空的image并将alpha设置为0来接收touch事件,这样会产生不必要的overdraw。通过如下类NoDrawingRayCast来接收事件可以避免不必要的overdraw。
public class NoDrawingRayCast : Graphic
public override void SetMaterialDirty()
public override void SetVerticesDirty()
protected override void OnFillVBO(List vbo)
vbo.Clear();
优化UGUI性能没有万能的方法,笔者这些经验总结也只能作为参考。优化性能往往是在各种选择之间做出平衡,比如drawcall与rebuild平衡、内存战胜与cpu消耗平衡以及UI图片精度与纹理大小的平衡等。每一次优化都有可能使得瓶颈出现在其它的环节上,要善于使用profiler,找到性能热点,对症下药。
六、关于资源占用问题
UI资源优化是UGUI性能优化的重点,腾讯WeTest也在资源方面提供了性能的测试。以下通过“纹理”资源,介绍腾讯WeTest性能测试在资源方面的测试情况。
1、登录 ,点击“Android版 下载”,或者在页面末尾扫描二维码直接下载腾讯WeTest的手游客户端性能分析工具Cube。打开工具,选择“Unity资源分析”。
2、上传测试报告后,我们可以通过测试报告,了解unity游戏的资源情况。
资源结论概况
进入资源数据的报告之后,首先可以看到所有资源数据的概况结果,总体上了解存在问题的数据,继续下拉,可以了解该指标的具体情况。
资源数据概况
下面将以“纹理资源”为例,对cube资源测试报告进行解读。
Cube测试报告的“纹理资源”,根据腾讯标准,是期望&50MB的,从下图可见,如果超出红色虚线,就说明纹理资源存在超标。
点击具体数据点,获取具体资源数据
另外,点击图表中的绿色线条中的具体数据点,可以看到这个点的当前数据,所有数据根据资源大小进行排序:
所有数据根据资源大小进行排序
在这个表之下,有一个“资源大小top20”的表格,罗列了资源排名前20的资源内容。其中资源大小超过建议值的会呈现红色,资源大小非2的n次幂的呈现黄色。点击任意一个资源名称,可以在图表上观察这个资源所影响的区域:
点击具体资源了解影响区域
了解资源调用的影响区域
针对手游的性能优化,腾讯WeTest平台的Cube工具提供了基本所有相关指标的检测,为手游进行最高效和准确的测试服务,不断改善玩家的体验。目前功能还在免费开放中。
体验地址:
帮助中心:
如果对使用当中有任何疑问,欢迎联系腾讯WeTest企业qq:
暂无回复。
后方可回复, 如果你还没有账号请点击这里 。
TencentWeTest (腾讯WeTest)
第 8310 位会员 /
共收到 0 条回复当前位置: →
→ 转从CPU架构和技术的演变看GPU未来发展
转从CPU架构和技术的演变看GPU未来发展
& 作者及来源: oayx - 博客园 &
&收藏到→_→:
摘要: (转)从CPU架构和技术的演变看GPU未来发展
"转从CPU架构和技术的演变看GPU未来发展"::
泡泡网显卡频道5月28日&自从amd提出fusion(融聚)的概念、nvidia加大力度推广gpu通用计算、intel率先将cpu和gpu整合在一起之后,大家就会发现cpu和gpu从没如此亲密无间过,cpu和gpu之间有着太多的共同点使得它们的界限也开始模糊了起来。
&&& 喜欢研究it硬件技术的朋友应该知道,cpu和gpu都是由整数运算单元、浮点运算单元、一级缓存、二级缓存、内存控制器等等模块组成的,但最终它们的应用领域又是截然不同的。
&&& 到底是gpu取代cpu进行并行计算呢?还是cpu整合gpu成为大势所趋?这两种说法显然是相互对立的,均有不少支持者。但这只是表像,真正产生这一现状的原因依然隐藏在cpu和gpu的架构之中,通过笔者后文中的分析您会发现这两种说法不但不矛盾,反而代表了intel、amd和nvidia三大巨头已经达成的共识,他们正在以各自不同的方式去实现相同的目标。
cpu和gpu的整体结构相似,但侧重点不同
&&& 事实上,cpu和gpu都保持着一套相对固定的趋势,按照各自的轨迹在不停的发展、演变,两者在技术和架构方面有着很多不谋而合的共同点,而且最终也因为相同的目的而走到了一起。那么,cpu和gpu的碰撞将会亮出什么样的火花,未来的发展方向会朝向何处呢?下面我们就通过cpu和gpu的发展史来推测未来产品应该具备什么样的特征。
cpu篇:整合浮点运算协处理器
&&& 首先我们来重拾一个几乎快要被遗忘的名词——协处理器,它是一种芯片,用于减轻系统微处理器的特定处理任务,早些年协处理器主要是用以辅助进行浮点运算。
★ 最初的cpu只能进行整点运算,浮点运算效率极低
&&& cpu最基本的运算就是“加减乘除”,但实际上计算机只能用加法器来完成整数以及固定小数点位置(整点)的算术运算,而不能处理小数点可以浮动的数值(浮点)。对于小数多采用的是二进制的科学计数法、也就是浮点数表示法:尾数、阶数符号位各占一位,然后再对其余数位尾数、阶数的有效数位合理分配。
&&& 在cpu运算时,浮点数的运算量远比整数复杂,因为不仅尾数要参与运算,阶数也要参与,并且需要对尾数和阶数的符号位都进行处理,所以,最早的cpu并没有能力进行浮点运算(,8sx),需要浮点运算时,由cpu通过软件模拟来实现,所以,进行浮点运算时就会慢很多。
★ 协处理器诞生,专门处理浮点运算
8086处理器和它的协处理器8087
&&& 8086是当今cpu的鼻祖,所谓x86架构也就是指8086处理器所开创的指令集体系。为了弥补8086在进行浮点运算时的不足,intel与1980年设计了8087数学协处理器,并且为x86体系推出了第一个浮点格式iee754。8087提供两个基本的32/64bit浮点资料形态和额外的扩展80bit内部支援来改进复杂运算之精度。除此之外,8087还提供一个80/17bit封装bcd (二进制编码之十进制)格式以及16/32/64bit整数资料形态。
386处理器和它的协处理器387
&&& x87协处理器新增约60个指令给,所有的指令都是以“f”开头跟其他的标准8086整数运算指令有所区别,举例来说,相对于add/mul,8087提供fadd/fmul。
&&& 8087是于1980年发布,然后被8dx/sx和487sx所取代。
★ 协处理器被整合进入cpu内部
&&& 以往,协处理器都是可选配件,在主板上x86处理器旁边一般都会为x87设计一个空的插槽,只有当用户确实有需要时才会专门购买相应的x87协处理器插进去,来加速浮点运算。
486dx是第一颗整合了浮点运算协处理器的产品,相当于486sx+487sx
&&& 随着时代的发展,越来越多的程序要求使用更高精度的浮点运算,x87协处理器几乎成为必备品。于是在制造工艺日趋成熟之后,intel在486一代将x86和x87整合在了一起,浮点运算成为了cpu的一项基本功能,而且重要性越来越大。
&&& intel 486dx、pentium之后的cpu都内含了协处理器,amd k5、k6之后的cpu都内建了协处理器,所以此后就很少有人会提及协处理器的概念了。
cpu篇:扩展指令集加速浮点运算
&&& 所谓x86架构的处理器就是采用了intel x86指令集的处理器,x86指令集是intel公司为其第一块16位处理器i8086所专门开发的。而ibm在1981年所推出的第一台pc机上所使用的处理器i8088(i8086的简化版)也是使用的x86指令集,但是为了增强计算机的浮点运算能力,增加了x87数学协助处理器并引入了x87指令集,于是就将采用了x86指令集和x87指令集的处理器统称为x86架构的处理器。
&&& x86基本指令集包括了:数据传输、算术运算、逻辑运算、串指令、程序转移、伪指令、寄存器、位操作、控制指令和浮点运算指令等十大类无数条。而intel和amd桌面级处理器在x86指令集的基础上,为了提升处理器各方面的性能,所以又各自开发新的指令集,它们被称为处理器扩展指令集。
&&& 扩展指令集能够大幅提高cpu在某些特定应用下的性能,如、3d、浮点运算等,其设计初衷与协此文来自: 马开东博客
转载请注明出处 网址:
处理器是异曲同工的,但协处理器需要增加额外的运算单元,而扩展指令集只需要加入新的指令和算法即可,无需设计新的运算单元,但必须要软件支持才能发挥功效。
★ mmx指令集:增强性能
  mmx(multi media extension 扩展指令)指令集是intel公司在1996年为旗下的pentium系列处理器所开发的一项指令增强技术。mmx指令集中包括了57条指令,通过这些指令可以一次性处理多个数据,在处理结果超过实际处理能力的时候仍能够进行正常处理,如果在软件的配合下,可以得到更强的处理性能。
&&& mmx指令集非常成功,在之后生产的各型cpu都包括这些指令集。据当年tom's hardware测试,即使最慢的pentium mmx 166mhz也比pentium 200mhz普通版要快。
intel pentium with&mmx,首次支持mmx
&&& 但是,mmx指令集的问题也是比较明显的,mmx指令集不能与x86的浮点运算指令同时执行,必须做密集式的交错切换才可以正常执行,但是这样一来,就会造成整个系统运行速度的下降。
★ 3dnow!指令集:
&&& 3dnow!指令集最由amd公司所推出的,该指令集应该是在sse指令之前推出的,被广泛运用于amd的k6-2和k7系列处理器上,拥有21条扩展指令集。在整体上3dnow!的sse非常相相似,它们都拥有8个新的寄存器,但是3dnow!是64位的,而sse是128位。
amd k62加入3dnow!指令集&&& 所以3dnow!它只能存储两个浮点数据,而不是四个。但是它和sse的侧重点有所不同,3dnow!指令集主要针对三维建模、坐标变换和效果渲染等3d数据的处理,在相应的软件配合下,可以大幅度提高处理器的3d处理性能。amd公司后来又在athlon系列处理器上开发了新的enhanced 3dnow!指令集,新的增强指令数达了5此文来自: 马开东博客
转载请注明出处 网址:
2个,以致目前最为流行的athlon 64系列处理器还是支持3dnow!指令的。
★ sse指令集:加强浮点和3d性能
  sse是streaming simd extension(simd扩展指令集)的缩写,而其中simd的为含意为single istruction multiple data(单指令多数据),所以sse指令集也叫单指令多数据流扩展。该指令集最先运用于intel的pentium iii系列处理器,其实在pentium iii推出之前,intel方面就已经泄漏过关于kni(katmai new instruction)指令集的消息。这个kni指令集也就是sse指令集的前身,当时也有不少的媒体将该指令集称之为mmx2指令集,但是intel方面却从没有发布有关mmx2指令集的消息。
奔腾3正式加入sse指令集
  最后在intel推出pentium iii处理器的时候,sse指令集也终于水落石出。sse指令集是为提高处理器浮点性能而开发的扩展指令集,它共有70条指令,其中包含提高3d图形运算效率的50条simd浮点运算指令、12条mmx整数运算增强指令、8条优化内存中的连续数据块传输指令。理论上这些指令对当时流行的图像处理、浮点运算、3d运算、处理等众多的应用能力起到全面提升的作用。sse指令与amd公司的3dnow!指令彼此互不兼容,但sse包含了3dnow!中的绝大部分功能,只是实现的方法不同而已。sse也向下兼容mmx指令,它可以通过simd和单时钟周期并行处理多个浮点数据来有效地提高浮点运算速度。
★ sse2指令集:进一步优化浮点运算
  在pentium iii发布的时候,sse指令集就已经集成在了处理器的内部,但因为各种原因一直没有得到充分的发展。直到pentium 4发布之后,看到使用sse指令之后,程序执行性能将得到极大的提升,于是intel又在sse的基础上推出了更先进的sse2指令集。
奔腾4初代就加入了sse2指令集(amd直到athlon64才加入sse2)
  sse2包含了144条指令,由两个部分组:sse部分和mmx部分。sse部分主要负责处理浮点数,而mmx部分则专门计算整数。sse2的寄存器容量是mmx寄存器的两倍,寄存器存储数据也增加了两倍。在指令处理速度保持不变的情况下,通过sse2优化后的程序和软件运行速度也能够提高两倍。由于sse2指令集与mmx指令集相兼容,因此被mmx优化过的程序很容易被sse2再进行更深层次的优化,达到更好的运行效果。
&&& sse2对于处理器的性能的提升是十分明显的,虽然在同频率的情况下,pentium 4和性能不如athlon xp,但由于athlon xp不支持sse2,所以经过sse2优化后的程序pentium 4的运行速度要明显高于athlon xp。而amd方面也注意到了这一情况,在随后的k-8系列处理器中,都加入sse2指令集。
★ sse3指令集:加强并行数据处理能力
  sse3指令是目前规模最小的指令集,它只有13条指令。它共划分为五个应运层,分别为数据传输命令、数据处理命令、特殊处理命令、优化命令、超线程性能增强五个部分,其中超线程性能增强是一种全新的指令集,它可以提升处理器的超线程的处理能力,大大简化了超线程的数据处理过程,使处理器能够更加快速的进行并行数据处理。
&&& sse3中13个新指令的主要目的是改进线程同步和特定领域,例如媒体和游戏。这些新增指令强化了处理器在浮点转换至整数、复杂算法、视频编码、simd浮点寄存器操作以及线程同步等五个方面的表现,最终达到此文来自: 马开东博客
转载请注明出处 网址:
提升和游戏性能的目的。
&&& intel是从prescott核心的pentium 4开始支持sse3指令集的,而amd则是从2005年下半年troy核心的opteron开始才支持sse3的。但是需要注意的是,amd所支持的sse3与intel的sse3并不完全相同,主要是删除了针对intel超线程技术优化的部分指令。
★ ssse3(sse3s)指令集:加强处理
&&& ssse3(supplemental streaming simd extensions 3)是intel命名的sse3指令集的扩充,不使用新的号码是因为ssse3比较像是加强版的sse3,以至于推出ssse3之前,sse4的定义容易被混淆。在公开intel的core微架构之时,ssse3出现在xeon 5100与intel core 2移动版与桌面型处理器上。
65nm core 2 duo引入ssse3指令集
&&& ssse3包含了16个新的不同于sse3的指令。每一个都能够运作于64位的mmx寄存器或是128位xmm寄存器之中。因此,有些intel的文件表示有32个新指令。ssse3指令集增强了cpu的、图形图象处理、编码、整数运算和等方面的处理能力。
★ sse4.1指令集:大幅提升浮点运算,优化cpu和gpu数据共享
&&& sse4.1指令集被认为是2001年以来intel最重要的指令集扩展,包含54条指令。intel在penryn处理器中加入了对sse4.1的支持,共增加了47条新指令,令处理器的处理能力得到最大70%的提升。sse4加入了6条浮点型点积运算指令,支持单精度、双精度浮点运算及浮点产生操作,且ieee 754指令 (nearest, -inf, +inf, and truncate) 可立即转换其路径模式,大大减少延误,这些改变将对游戏及3d内容制作应用有重要意义。
&&& 此外,sse4加入串流式负载指令,可提高以图形帧缓冲区的读取数据频宽,理论上可获取完整的快取缓存行,即每次读取64bit而非8bit,并可保持在临时缓冲区内,让指令最多可带来8倍的读取频宽效能提升,对于视讯处理、成像以及gpu与cpu之间的共享数据应用,有着明显的效能提升。
45nm core 2 duo引入sse4.1指令集
  sse4指令集让45nm penryn处理器增加了2个不同的32bit向量整数乘法运算单元,并加入8位无符号(unsigned)最小值及最大值运算,以及16bit及32bit有符号 (signed) 运算。在面对支持sse4指令集的软件时,可以有效的改善效率及提高向量化整数及单精度代码的运算能力。同时,sse4改良插入、提取、寻找、离散、跨步负载及存储等动作,令向量运算进一步专门。
★&sse4.2指令集:优化xml和交互式应用性能
&&& 在nehalem架构的core i7处理器中,sse4.2指令集被引入,加入了sttni(字符串文本新指令)和ata(面向应用的加速器)两大优化指令。sttni包含了四条具体的指令。sttni指令可以对两个16位的数据进行匹配操作,以加速在xml分析方面的性能。intel表示,新指令可以在xml分析方面取得3.8倍的性能提升。
&&& ata包括冗余校验的crc32指令、计算源操作数中非0位个数的popcnt指令,以及对于打包的64位算术运算的simd指令。crc32指令可以取代上层数据协议中经常用到的循环冗余校验,intel表示其加速比可以达到6.5~18.6倍;popcnt用于提高在dna基因配对、声音识别等包含大数据集中进行模式识别和搜索等操作的性能。
cpu篇:整合片上二级缓存
&&& 缓存的基本作用是用来加速数据的传输。在电脑当中,由于内存和硬盘本身的速度较慢,都需要一个可以加速指令执行和数据预取的缓冲区,这个零时缓存就相当于部队里的集结待命区,它里边的内容是不断的在变化的。
http://www.yourdictionary.com/images/computer/swfcach2.swf
缓存的作用和原理
&&& 一级缓存(l1)是内置在cpu芯片内部的一个存储区。二级缓存(l2)是第2块“集结待命区”(staging areas),它的用处就是给l1喂数据。l2可能内置于cpu之中,也可能是mcp(multichip package module)里的一个独立芯片中,还可能是在主板上的一块独立存储芯片里。
&&& 典型的,缓存一般是sram(static ram,静止随机,不需要刷新电路即能保存它内部存储的数据),而主内存通常是dram(dynamic ram,动态随机,需要刷新电路)。sram非常消耗晶体管、成本高昂而且容量不可能做很大,因此最早的cpu都是没有缓存的,后来才开始加入缓存芯片。
★ 插在主板上的二级缓存(或者整合在主板上)
intel 430fx芯片組上socket 5主板及256kb外置二级缓存
&&& 此前的cpu一直都是socket接口设计,但以当时的技术,直插式的设计无法在cpu上整合sram缓存芯片,只能将sram以扩展卡的形式插在主板上或者直接整合在主板上。此后数代产品,intel和amd改用了slot封装形式,将sram芯片和cpu核心都集成在了slot pcb上面,然后再插在主板上,这样sram二级缓存就正式成为了cpu不可缺少的一部分。
★ 整合在cpu上的二级缓存
&&& 这是一颗核心代号为代klamath、采用350nm工艺的pentium处理器,cpu+sram的结构,slot 1接口。看上去是不是有点像现在的gpu+dram显存。实际上这样做只是上cpu和sram绑定在了一起,二级缓存依然以核心频率一半甚至更低的速度运行,性能不甚理想。
★ “胶水”式的二级缓存
&&& pentium pro是intel p5 核心pentium的延伸,在1995年11月以socket 8封装形式推出,它最大的特色是采用了双芯片封装形式,cpu和l2是各自独立的,片上(onchip)l2的好处是可以让它以内核相同的频率运行,而不必再像过去使用主板上较慢速度的l2,从而为“乱序执行”所导致的大量内存超找提供了捷径,直接提升了性能。
&&& pentium pro把l1和l2同时设计在cpu的内部,故pentium pro的体积较大。结果pentium ii又把l2 cache移至cpu内核之外的黑盒子里。这是因为l2无法达到与核心相同的频率,因此还是分离式比较灵活一点。
★ 整合进cpu内部的二级缓存
&&& pentium pro不仅是第一款整合了二级缓存的cpu,而且是第一颗32bit cpu,不过由于它并不兼容当时主流的16bit软件,因此pentium pro曲高和寡,仅定位于高端服务器市场,并没有得到广泛认可。此后intel又发布了pentium ii xeon,同样集成了片上全速二级缓存,在当时全速二级缓存就代表着更高的性能。
&&& pentium pro和pentium ii xeon并非民用产品,因此关注度并不高,而pentium ii去掉板载sram的产品被首次当作celeron来卖,虽然它价格很低廉,但由于l2彻底为0,因此性能损失也非常惨重。为此,intel推出了第二代celeron 300a和celeron 333,新赛扬的特点是在处理器芯片内集成了128kb二级高速缓存,容量上虽然比pentium ii的512kb少很多,但新赛扬的二级缓存在cpu内部,是全速的片上缓存,而pentium的二级缓存频率只有核心的一半。正是这全速的二级缓存给与了celeron质的改变,极大的改善了赛扬的整体性能,成为当时市场上炙手可热的一代经典产品!
首次出现三级缓存
&&& 而当时的amd也有一款经典产品,同样是因为集成了全速二级缓存而让性能产生质的飞跃,性能遥遥领先与同代intel处理器,它就是k6-ii和k6-iii。
&&& k6-ii和k6-iii使用的是socket 7插槽,其性能比intel后来的pentium 3都要强,为什么?因为这k6-iii cpu均内建了256kb的二级缓存,而且配套主板上还能再插2m容量的sram当作三级缓存使用,此时的性能比pentium&ii拉开了较大的差距,而且其价格还比较实惠。
★ 奔三和速龙初期依然用外置二级缓存,后期全部整合全速缓存
&&& 提起奔三和速龙相信很多人就比较熟悉了,它们应该可以说是cpu的近代现代史了,不过奔三和速龙发布之初依然使用的slot卡槽式封装,二级缓存依然是外置式,运行频率只有核心速度的一半,性能受到了限制。
初期slot 1和slot a接口的pentium iii和athlon
&&& 制造工艺改进之后,intel和amd相继把l2整合在了cpu内部,成为单一的cpu核心,以大家喜闻乐见的socket封装形式出现,全速的l2让奔三和速龙的性能都有所提升:
socket 370和socket a接口的pentium iii和athlon
&&& pentium iii和athlon角逐1ghz大关的频率大战,最终intel因为pentium iii 1.13ghz bug问题而败北。而其问题的关键就是内置的二级缓存无法工作在1ghz以上的超高频率下,从而产生不可预料的错误。
cpu篇:整合内存控制器和北桥
&&& cpu二级缓存之所以对cpu性能影响重大,就是因为内存的延迟较大、带宽太小,满足不了cpu密集型数据交换的需要,需要高速运作中转站二级缓存的支持。在二级缓存被cpu整合之后,大容量的内存显然是无法被整合到cpu里面的,那么如何才能进一步优化内存性能呢?
&&& 以往,cpu与内存之间的通信是通过北桥和进行的,准确的说是北桥当中的内存控制器,它决定了系统能支持内存的容量、频率和延迟。为了尽可能的缩小cpu访问内存的时间,显然cpu整合内存控制器是最高效的方法。
&&& amd率先将内存控制器整合在了cpu当中,athlon 64这款划时代的产品成为了一代经典,当然其成功的原因不仅仅是因为整合了内存控制器,它还是第一颗64bit x86处理器,第一次使用了点对点的高速低延迟ht总线。amd这次一领先就是五年,intel直到core i7时代才整合了内存控制器。
&&& amd当年为athlon 64处理器整合了单通道ddr和双通道ddr两种内存控制器,分别对应754和939接口,此后逐步升级至双通道ddr2和ddr3内存控制器。而intel是后来者居上,直接整合了三通道ddr3内存控制器,中低端产品也整合了双通道ddr3内存控制器,分别对应接口。消除了内存瓶颈之后的core i3/i5/i7处理器性能更上一层楼,大幅领先于同级amd产品。
cpu篇:共享式大容量二/三级缓存
&&& 高频低能的pentium 4和pentium d苦苦抵抗athlon 64和athlon 64 x2疯狂进攻的同时,intel也在秘密研发新一代core微处理器架构,全新的core 2 duo虽然没有整合内存控制器,但凭借高效率、低层级流水线和融合大量先进技术的指令架构,core 2 duo一举击败athlon 64 x2成为新的性能之王。
&&& 当然,intel还有另外一项创新性的技术也助core 2 duo一臂之力,拉大与对手的优势,它就是intel advanced smart cache(高级智能缓存技术),简单来讲就是多颗处理器核心共享大容量缓存,通常被称为共享式大容量二级缓存。
&&& 传统的双核心设计每个独立的核心都有自己的l2,但intel core微架构则是通过核心内部的shared bus router共用相同的l2,当cpu 1运算完毕后把结果存在l2时,cpu 0便可通过shared bus router读取cpu 1放在共用l2上资料,大幅减低读取上的延迟并减少使用fsb带宽,同时加入l2 & dcu data pre-fetchers及deeper write output缓冲,大幅增加了缓存的命中率。
&&& 与amd k8双核心l2架构相比,cpu 0需要读取cpu 2 l2中数据时,首先需要向系统总线发出需求,并通过crossbar switch就把取读资料,但cpu 0发现读取自己的l2没有所要的数据才会要求读取cpu 1的l2资料,情况等同于cpu 0的l3,而共享式的l2设计却没有以上需要。
&&& smart cache架构还有很多不同的好处,例如当两颗核心工作量不平均此文来自: 马开东博客
转载请注明出处 网址:
时,如果独立l2的双核心架构有机会出现其中一颗核心工作量过少,l2没有被有效地应用,但另一颗核心的l2却因工作量过重,l2容量没法应付而需要传取系统内存,值得注意的是它并无法借用另一颗核心的l2空间,但smartcache因l2是共用的而没有这个问题。
&&& 共享式l2不但能够减少两颗核心之间读取缓存数据的延迟、提高数据命中率,而且还能有效提高缓存利用率,避免分离式缓存存放重复数据的可能,变相提高的缓存容量。intel上代的core 2 duo和core 2 quad至今在性能方面并不输给amd的phenom ii系列处理器,其中共享式二级缓存设计功不可没。
★ 共享式三级缓存已成为主流:
&&& 共享式二级缓存固然拥有诸多优势,但需要对传统cpu架构进行大幅调整,双核心还算容易、多核心就比较麻烦了,缓存的存取机制都需要完全重新设计。因此amd另辟蹊径,在保持现有二级缓存不变的情况下,直接新增大容量的三级缓存,从而为多核提供协同运算的高速暂存。
&&& amd初代的phenom四核处理器就采用了共享式三级缓存设计,每颗核心的一级缓存保持不变,二级缓存都是独立的512kb,三级缓存为一体式的2mb。而到了phenom ii代,45nm工艺使得处理器能够整合更大容量的缓存,于是l3倍增至6mb,性能提升非常明显。
core&i7 die示意图
&&& intel在core 2 quad之后,也在酝酿全新的原生四核产品,此次intel集所有先进技术于一体,不仅整合了内存控制器,而且引入了比amd ht更先进的qpi总线,还引入了共享式三级缓存,容量高达8mb,比phenom ii还多2mb。
&&& 至于低端的双核core i3/i5处理器,intel为了保持架构统一,也放弃了core 2上面的共享二级缓存设计,每颗核心仅有256kb的独立l2,而是植入了4m容量的l3,虽然总缓存容量不如e8x00系列的6mb l2,但性能上还是取得了长足的进步。
&&& 此后,32nm工艺的引入使得intel可以在单一芯片之中集成更多的核心和更大的缓存,所以我们看到i7-980x拥有六颗物理核心以及高达12mb的l3,性能更上一层楼,令人叹为观止!
dvd/hd/bd解压卡
&&& 在了解了cpu的发展历程之后,我们再来看看gpu的发展过程,其实gpu很多重大改进都与cpu的技术架构相类似。比如最开始我们介绍了古老的cpu协处理器,下面再介绍一个被遗忘的产品——解压卡,资历较老的玩家应该记得。
&&& 十多年前,电脑的cpu主频很低,显卡也多为2d显示用,当vcd兴起的时候,好多电脑(主频为100mhz以下)无法以软解压的方式看vcd影片,根本运行不起来!
isa接口的vcd解压卡
&&& 这时,vcd解压卡就出现了,此卡板载专用的解码处理器和缓存,实现对vcd的硬解码,不需要cpu进行解码运算,所以,即使在386的电脑上也可以看vcd了。
pci接口的dvd解压卡
&&& 随后,显卡进入了3d时代,并纷纷加入支持vcd的mpeg解码,而且cpu的主频也上来了,无论cpu软解还是显卡辅助解码都可以流畅播放视频,所以vcd解压卡就退出了市场!
&&& 但dvd时代来临后,分辨率提高很多,而且编码升级至mpeg2,对于cpu和显卡的解码能力提出了新的要求,此时出现了一些dvd解压卡,供老机器升级之用,但由于cpu更新换代更加频繁,性能提升很大,dvd解压卡也是昙花一现,就消失无踪了。
&&& 现在已经是1080p全高清时代了,高清视频解码依然是非常消耗cpu资源的应用之一,于是几年前nvidia和ati就在gpu当中整合了专用的视频解码模块,nvidia将其称为vp(video processor,视频处理器),ati将其称为uvd(unified video decoder,通用视频解码器),相应的技术被叫做purevideo和avivo。
硬解码几乎不消耗cpu和gpu的资源,看高清视频时接近于待机状态
&&& 虽然vp和uvd都被整合在了gpu内部,实际上它们的原理和作用与当年的协处理器/解压卡芯片没有实质性区别,都是为了减轻/分担处理器的某项特定任务。如今nvidia和ati的gpu硬解码技术都能够支持高分辨率、高码率、多部影片同时播放,性能和兼容性都很出色。
&&& 如今多核cpu的性能已经相当强大了,软解高清视频简直轻松加愉快,但要论效率的话,依然是gpu硬件解码更胜一筹,专用模块解码消耗资源更少,整机功耗发热更小,因此手持设备和移动设备都使用硬件解码,而桌面电脑cpu软解和gpu硬解就无所谓了。
gpu篇:shadermodel指令集的扩充与发展
&&& 掐指一算,从gpu诞生至今双方都已推出了十代产品,每一代产品之间的对决都令无数玩家心动不已,而其中最精彩的战役往往在微软directx api版本更新时出现,几乎可以说是微软directx左右着gpu的发展,而历代directx版本更新时的核心内容,恰恰包含在了shadermodel当中:
&&& shadermodel 1.0 → directx 8.0&&& shadermodel 2.0 → directx 9.0b&&& shadermodel 3.0 → directx 9.0c&&& shadermodel 4.0 → directx 10&&& shadermodel 5.0 → directx 11
&&& shader(译为渲染或着色)是一段能够针对3d对象进行操作、并被gpu所执行的程序,shadermodel的含义就是“优化渲染引擎模式”,我们可以把它理解成是gpu的渲染指令集。
&&& 高版本的shadermodel是一个包括了所有低版本特性的超集,对一些指令集加以扩充改进的同时,还加入了一些新的技术。可以说,gpu的shadermodel指令集与cpu的mmx、sse等扩展指令集十分相似。
&&& 随着shadermodel指令集的扩充与改进,gpu的处理资源和计算精度与日俱增,于是就有能力渲染出更加精美的图像,并且不至于造成性能的大幅下降。就拿最近几个版本来讲,新指令集并没有带来太多新的特效,但却凭借优秀的算法提升了性能,是否支持dx10.1(shadermodel 4.1)可能游戏画面上没有差别,但速度就很明显了。
&&& 此外,dx11中的关键技术directcompute通用计算技术就是通过调用shadermodel 5.0中的新指令集来提高gpu的运算效率,很多基于directcompute技术的图形后处理渲染特效也都要用到sm5.0指令集来提高性能。
gpu篇:真正的双核/四核gpu
&&& 从以往的多处理器系统到现在的双核、四核、六核,cpu只能依靠增加核心数量来提升性能。而gpu从一开始就是作为并行渲染的管线式架构,gpu性能的强弱主要就是看谁的管线、流处理器数量更多。
&&& 不过双显卡甚至多显卡也成为提升电脑游戏性能的一种途径,通过sli和crossfire技术能够轻松让3d性能倍增,于是双核心的显卡成为nvidia和amd双方角逐3d性能王者宝座的杀手锏,近年来的旗舰级显卡几乎都是双核心设计的。
&&& 但与cpu单芯片整合多核心的设计不同,显卡一般是单卡多gpu设计,很少有单一gpu多核心设计,因为gpu性能提升的瓶颈主要在于制造工艺,只要工艺跟得上,那么他们就有能力在gpu内部植入尽可能多的流处理器。
★ 双核心设计的cypress核心:
&&& 不管gpu架构改不改,流处理器数量总是要扩充的,准确的说是以级数规模增长,这样才能大幅提升理论性能。在流处理器数量急剧膨胀之后,如何管理好如此庞大的规模、并与其它模块协调工作成为新的难题。
rv870的双核心模块设计
&&& ati rv870包括流处理器在内的所有核心规格都比rv770翻了一倍,ati选择了“双核心”设计,几乎是并排放置两颗rv770核心,另外在装配引擎内部设计有两个rasterizer(光栅器)和hierarchial-z(多级z缓冲模块),以满足双倍核心规格的胃口。
★ 四核心设计的gf100核心:
gf100可以看作是四核心设计
&&& 如果说cypress是双核心设计的话,那么gf100的流处理器部分就是“四核心”设计,因为gf100拥有四个gpc(图形处理器集群)模块,每个gpc内部包含一个独立的raster engine(光栅化引擎),而在以往都是整颗gpu共享一个raster engine。
&&& 我们知道rv870的rasterizer和hierarchial-z双份的,而gf100则是四份的,虽然命名有所不同但功能是相同的。
gf100的每个gpc都可以看作是一个自给自足的gpu
&&& gf100的四个gpc是完全相同的,每个gpc内部囊括了所有主要的图形处理单元。它代表了顶点、几何、光栅、纹理以及像素处理资源的均衡集合。除了rop功能以外,gpc可以被看作是一个自给自足的gpu,所以说gf100就是一颗四核心的gpu。
★ 为什么gpu也会设计成多核心?
&&& gpu本身就是一颗并行处理器,每一个流处理器都是一个独立的运算单元,ati和nvidia双方第一次将gpu设计成为多核心方案,并不是为了提升其运算能力和流处理器资源,而是为了更好的管理和控制庞大规模的流处理器,更充分的利用它们的处理能力,以便在不同的应用环境下发挥出最强效能。
&&& 虽说流处理器数量决定着gpu的浮点运算能力,但gpu除了单纯的数学运算外,还要处理诸多不同类型的任务,将庞大的流处理器划分为多个独立的区块,每个区块都设计专用的控制引擎和特殊功能模块,这将会有效的平衡各个功能模块的资源利用率。
gpu篇:动态分配式一级共享缓存
&&& gpu内部拥有很多种类型的缓存,不同的缓存都有各自特殊的用途,往往无法互相兼容,这完全不同与cpu内部l1、l2、l3这样简单的层级关系。
★ cypress的一级缓存:固定功能、固定容量的专用缓存
&&& amd的cypress核心内部的流处理器是按照simd(单指令多数据流)划分的,每组simd阵列内部包括了80个流处理器,这些流处理器拥有独立的纹理单元和一级缓存(l1)以及本地数据共享缓存(local data share)。
&&& 为了满足dx11中directcompute 11的要求,amd增加了本地数据共享缓存的大小(local data share,lds),容量达到了32kb,是rv770的两倍。lds用于同一个线程组(thread group)中的线程共享数据。从上图中我们可以看到,每一个simd连接一个lds,不同的simd是不能共享lds的,因此所有属于同一个线程组的线程都会被线程调度器发送到同一个simd上执行。
&&& 如果不同的simd上的线程要共享数据,需要用到全局数据共享缓存(global data share,gds)。在cypress中,gds的容量也倍增了,达到64kb。到目前为止,我们对gds的了解仍然有限,与lds不同,并没有指令能显式的操作gds。据beyond3d的消息,在未来的opencl扩展中可能会提供对gds的访问,目前gds只对可见。
★ gf100的一级缓存:可动态分配容量的多功能智能缓存
&&& 以往的gpu都是没有一级缓存的,只有一级纹理缓存,因为这些缓存无法在通用计算中用于存储计算数据,只能用于在纹理采样时暂存纹理。而在gf100当中,nvidia首次引入真正的一级高速缓存,而且还可被动态的划分为共享缓存。
&&& 在gf100 gpu中,每个sm除了拥有专用的纹理缓存外,还拥有64kb容量的片上缓存,这部分缓存可配置为16kb的一级缓存+48kb共享缓存,或者是48kb一级缓存+16kb共享缓存。这种划分方式完全是动态执行的,一个时钟周期之后可自动根据任务需要即时切换而不需要程序主动干预。
&&& 一级缓存与共享缓存是互补的,共享缓存能够为明确界定存取数据的算法提升存取速度,而一级缓存则能够为一些不规则的算法提升存取速度。在这些不规则算法中,事先并不知道数据地址。
&&&&对于图形渲染来说,重复或者固定的数据比较多,因此一般是划分48kb为共享缓存,当然剩下的16kb一级缓存也不是完全没用,它可以充当寄存器溢出的缓冲区,让寄存器能够实现不俗的性能提升。
&&& 而在并行计算之中,一级缓存与共享缓存同样重要,它们可以让同一个线程块中的线程能够互相协作,从而促进了片上数据广泛的重复利用并减少了片外的通信量。共享是使许多高性能cuda成为可能的重要促成因素。
★ 可动态分配的共享式一级缓存大幅提升并行计算效率
&&& 再来算算一级缓存的总容量,cypress拥有8kbx20=160kb的一级缓存,和32kbx20=640kb的本地数据共享缓存,还有额外的64kb全局数据共享缓存。
&&& 而gf100拥有64kbx16=1mb容量的一级缓存+共享缓存,他们可以被动态的划分为256kb一级缓存+768kb共享缓存,或者768kb一级缓存+256kb共享缓存,另外还有12kbx16=192kb的纹理缓存,无论从哪个方面来比较,都要比cypress强很多。
&&& 此次nvidia创新性的可动态划分一级缓存设计,是以往cpu上面都不曾有过的先进技术,大幅提升了gpu并行计算的数据处理能力,使得gpu庞大的流处理器资源在高负荷密集型运算时不至于出现瓶颈,从而发挥出恐怖的浮点运算能力。
gpu篇:共享式大容量二级缓存
&&& 再来看看gpu二级缓存部分的设计,这一方面就与cpu非常相似了。
★ cypress的二级缓存:绑定显存控制器的分离式设计
&&& 以往的gpu,包括nvidia上代的gt200以及amd最新的cypress核心,二级缓存都是与显存控制器绑定在一起的,其作用就是缩短gpu到显存的响应时间。由于显存控制器一般都是64bit一组,为多组设计,因此二级缓存也被划分为n个独立的模块,而不是统一的整体。
cypress:l2绑定memory controller
&&& cypress拥有4个64bit显存控制器,每个显存控制器绑定128kb容量的二级缓存,总计512kb,这个容量要比nvidia上代的gt200大一倍。
★ gf100的二级缓存:统一的大容量高速缓存
&&& 而gf100拥有一个768kb容量统一的二级高速缓存,该缓存可以为所有载入、存储以及纹理请求提供服务。二级缓存可在整个gpu中提供高效、高速的物理效果、光线追踪以及稀疏等事先不知道数据地址的算法在硬件高速缓存上的运行优势尤为明显。后期处理过滤器需要多个sm才能读取相同的数据,该过滤器与之间的距离更短,从而提升了带宽效率。
&&& 统一的共享式缓存比单独的缓存效率更高。在独享式缓存设计中,即使同一个缓存被多个指令预订,它也无法使用其它缓存中未贴图的部分。高速缓存的利用率将远低于它的理论带宽。gf100的统一共享式二级高速缓存可在不同请求之间动态地平衡负载,从而充分地利用缓存。二级高速缓存取代了之前gpu中的二级纹理缓存、rop缓存以及片上fifo。
gf100的缓存架构让各流水线之间可以高效地通信,减少了显存读写操作
&&& 统一的高速缓存还能够确保按照程序的顺序执行存取指令。当读、写路径分离(例如一个只读纹理路径以及一个只写rop路径)时,可能会出现先写后读的危险。一个统一的读/写路径能够确保程序的正确运行,同时也是让nvidia gpu能够支持通用c/c++程序的重要因素。
&&& 与只读的gt200二级缓存相比,gf100的二级高速缓存既能读又能写,而且是完全一致的。nvidia采用了一种优先算法来清除二级缓存中的数据,这种算法包含了各种检查,可帮助确保所需的数据能够驻留在高速缓存当中。
★ gf100共享式二级缓存堪比酷睿2:
&&& 可以看出,ati的一二级缓存都是完全分散的,为了协调一二级缓存之间的数据交换,ati特意设计了一个可全局共享的64kb数据缓存。
&&& 而gf100的一级缓存可以根据需求动态的为共享缓存或者一级缓存分配较大的容量,从而加速数据处理。二级缓存更是大容量一体式设计,当线程组在一级缓存中找不到数据时,可以直接从“海量”的二级缓存中索取,缩短了数据请求与定址时间,消除了瓶颈。
&&& 至于独享式缓存与共享式缓存的效率与性能,无需多言,大家可参照cpu的发展即可略知一二。
趋势:异构计算cpu强化整数gpu接管浮点
★ cpu发展趋势:不断的整合功能模块
&&& 通过前面详细的介绍我们可以发现,cpu的发展趋势就是不断去整合更多的功能和模块,从协处理器、到缓存、再到内存控制器甚至整个北桥。
&&& 目前amd和intel的所有主流cpu都已经整合了内存控制器,intel最新的lynnfield(core i7 8xx和i5 7xx)已经整合了包括pcie控制器在内的整个北桥,而clarkdale(core i5 6xx和i3 5xx)更是将gpu也整合了进去。
★ gpu发展趋势:不断的蚕食cpu功能
&&& 至于gpu,从某种意义上来说,它本身就是一颗协处理器,主要用于图像、视频、3d加速。之所以这么多年来没有被cpu所整合,是因为gpu实在太复杂了,以现有的制造工艺限制,cpu不可能去整合一颗比自身规模还要大很多的gpu,它顶多只能整合一颗主流中低端的gpu,而这样的产品只能定位入门级,无法满足游戏玩家和的需要。
&&& gpu从诞生至今一步步走来,就是在不断蚕食着原本属于cpu的功能,或者说是帮助cpu减负、去处理哪些cpu并不擅长的任务。比如最开始的t&l(坐标转换与光源)、vcd\dvd\hd\bd视频解码、物理加速、几何着色。而今后和未来,gpu将夺走一项cpu最重要的功能——并行计算、高精度浮点运算。
★ gpu前途似锦:浮点运算的未来
&&& 我们知道,cpu第一个整合的就是专门用来加速浮点运算的协处理器,此后历代sse指令集也都是为了加强cpu的simd(单指令多数据流)浮点运算性能。而gpu打从一开始就被设计成为了simd架构(至今cypress也还是这种架构),拥有恐怖浮点运算能力的处理器。当今gpu的浮点运算能力更是达到多核cpu的几十倍甚至上百倍!
cpu和gpu的浮点运算能力
&&& cpu永远都赶不上gpu的发展速度,因此最适合进行浮点运算的显然是gpu,cpu继续扩充核心数目已经变得毫无意义,因此整个业界都在想方设法的发掘gpu的潜能,将所有的并行计算任务都转移到gpu上面来。即便是intel也看到了gpu广阔的前景,因此着手研发gpu。
&&& 此前由于api和软件的限制,gpu在并行计算方面的应用举步维艰、发展缓慢,nvidia孤身推广cuda架构虽然小有成就但孤掌难鸣。好在opencl和directcompute两大api的推出让gpu并行计算的前途豁然开朗,此时ati和nvidia又重新站在了同一起跑线上,那么很显然谁的架构更适合并行计算,那么谁就能获得更强的性能和更大范围的应用,通过本文的分析可以看出,ati的架构依然是专注于传统的图形渲染,并不适合并行计算;而nvidia的架构则完全针对通用计算api和指令集优化设计,确保能发挥出接近理论值最大效能,提供最强的浮点运算性能!
★ cpu面临拐点:强化整数性能,浮点运算交给gpu
&&& amd同时拥有cpu和gpu,而且amd在技术方面往往能够引领业界,因此其未来发展规划非常值得大家思考。根据amd最新的产品路线图来看,其下一代的高端cpu核心bulldozer(推土机),它最大的亮点就是每一颗核心拥有双倍的整数运算单元,整数和浮点为非对称设计:
amd下一代“推土机”架构,大幅强化整数运算单元
搜索此文相关文章:此文来自: 马开东博客
网址: 站长QQ
转从CPU架构和技术的演变看GPU未来发展_博客园相关文章
博客园_总排行榜
博客园_最新
博客园_月排行榜
博客园_周排行榜
博客园_日排行榜}

我要回帖

更多关于 如何进行网站性能优化 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信