最近一同事(复旦的本科生,现在在公司实习)做了一些real-time soft shadow方面的研究,他实现几种常见的方法,比如在sampling时做blur、动态调整sampling的次数和范围,还有基于分析depth map的(好像叫PDSM?)等等,他自己也做出过了改进的算法。感觉这小伙还是很不错的:-) 有一次我和他讨论一些性能优化问题,他告诉他的一个动态分支较多的pixel shader,在FireGL V7300(r520核心,和radeon 1800xt一样)上的fps居然比Geforce 8800GTS都要高,在排除了是MS的hlsl compiler的因素后,发现事实的确如此。于是我决定对这个问题探一究竟。
言归正传,我想做的是硬件性能的比较,拿什么来做bentchmark呢?3dmark系列显然不合适,这是一个综合的测试,我需要的是针对性很强的测试。最后发现dxsdk中的几个例子就比较合适。当然如果了解点GPU硬件知识,自己写的bentchmark可能更好,可我没时间。。。被用来选做测试的sample有3个,分别是
1. OptimizedMesh; 2. ParallaxOcclusionMapping和3. Blobs。
每个的测试规则如下:
1. 主要用来测试GPU的vertex data fetch/processing性能和primitive setup engine能力,测试中显示36个torus,optimized triangle list和unoptimzied分别测试一次;
2. 别小看这个sample,没几个人的显卡能跑过100fps。它主要能体现GPU的texture sampling和dynamic branch的性能,测试时,默认情况下测试一次,max/min sampling count都最小时一次,都最大时一次。注意测试时需要正对那个圆盘,并放大,直到铺满整个屏幕;
3. 这个sample主要是测试texture sample的性能,分别记录最小和最大fps; 1的测试在800*600的窗口模式下进行,2和3在全屏1280*1024下进行,除了FireGL V5352是在Thinkpad T60p的本本(CPU T7200@2.33G)上进行的,其他的测试都在hp wx6400 workstation(CPU xeon5150@2.66G),结果如下:
显卡 | OptimizedMesh(36 meshes) | ParallaxOcclusionMapping | Blobs | Core/Mem CLK |
FireGL V5250 | 97 - 31 | 15.52 - 16.64 - 3.34 | 21.00 - 23.72 | 432/320 |
Radeon 3870 | 426 - 95 | 124.51 - 136.93 - 23.81 | 144.00 - 159.72 | 800/1152 |
Quadro FX3450 | 106 - 28.81 | 12.62 - 14.13 - 2.35 | 34.90 - 38.29 | 425/500 |
Quadro FX3500 | 149 - 35.73 | 23.59 - 26.36 - 3.85 | 54.57 - 60.87 | 450/660 |
先看OptimizedMesh的结果,firegl v5250在optimized时和quadro fx3450一个档次,而在unoptimized时前者还领先后者一些。quadro fx3450到底是nv gf6800时代的东西,其vertex pipeline的能力只能和其对手下代中档产品做比较(注意显存频率v5250还低不少且是128bit的,虽然这个测试对显存不敏感)。而fx3500毕竟是经过nv改进过以对付r580的东西,在频率提高不多的前提下,vertex pipeline性能提高不少。提高了近50%,说明其片内vertex cache增加了不少。而对于unoptimzed的情况,个人认为所有的GPU都bound在了显存的latency上,DDR4这点上比DDR3还是有优势的。
再看ParallaxOcclusionMapping,呵呵,我敢说这个例子默认情况下如果你跑不过200fps(按照上面所述的测试条件),你就别碰crysis吧。x1600到底是比gf6800新一代,core clk差不多,显存频率和位宽低一半的情况下完胜gf6800。fx3500(gf 7900)在texture fetch和dynamic branch的效率上提高了很多,基本和竞争对手的同代产品相当。这里我觉得应该把G80拿来和3870好好比较下,因为目前手头没有G80,所以打算改天把这个补上。印象里8800gts默认情况下好像是70-80fps,那么的话还是差3870不少的。
最后看blobs,texture fetch的性能一看显存带宽,二看GPU内的cache大小,这个结果想必大家都在预料中。
总结:
1. 在现在的GPU上,不要太吝啬vertex pipeline的使用。而setup engine将来成为瓶颈的可能性相当大,因为现在DX10的geometry shader,将来DX11的tesselation engine都会让setup engine发疯。要知道在现有架构下,要提高setup engine的速度,多半只有靠提高GPU的频率,因为primtives有顺序要求,不能并行化。但提高频率是很不环保的做法,眼看GPU就要普遍过G Hz了,希望那些硬件厂商多发掘一下架构的优势,在频率不变的情况下,设计出更好的架构。当然更快的real-time rendering技术也需要软件的配合,就像现在大家都在思考的如何利用上多核心处理器的优势一样,将来的GPU可能也需要软件上做些变化,特别是思维方式的改变。
2. 动态分支是Shader Module 3.0引入的概念,可我敢说直到最近才普遍被一些PC游戏大作普遍采用。看看gf6800那接近个位数的fps,您能认为当时他能把动态分支推向实用?就像G80支持DX10一样,仅仅是支持而已,某些功能更本无法实用。gf7900的改进非常值得肯定,geforce6 -> 7系列的改进个人认为是nv最成功的一次。不像Geforce 8 -> 9,纯粹忽悠玩家。ati的硬件设计还是不很错的(个人认为一直比nv强),不过软件比nv差太远了,被amd收购后,还是没有足够重视软件,感觉其前途未卜啊。
3. 带宽还是相当重要的,我估计对于这个测试,频率相近的情况下,384bit的老版GF8800会比3870强不少,而2900XT(变态的R600)又会比gf8800gts强。256bit的设计下,chip的良品率和PCB的复杂度以及其他元器件的要求 比128bit设计高不少,不过我个人更喜欢大位宽,低频率的设计。384和512bit的设计目前只被红绿两家公司证明了下自己的实力而已,成本太高还是不适合广泛采用。
先写这么多吧,欢迎拍砖!(改天吧8800 vs 3870的补上,顺便把一些dx10的sample也考虑进去。)
本文发布于:2024-01-31 04:15:40,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170664574325382.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |