转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=1882

2年前,D3D11显卡刚出来没多久的时候,我曾经做过一个《NV GTX480对ATI HD5870:另一个视角》,用DX SDK的D3D11例子来对当时巅峰的显卡进行各个单项的性能评测。时过境迁,现在NV GTX680已经上市,硬指标对比如下表所示。

GTX 680 GTX 580
制程(nm) 28 40
晶体管数量(Million) 3540 3000
Die大小(mm^2) 294 520
显存(MB) 2048 1536
SM数量 8 16
核心配比 1536:128:32 512:64:48
核心频率(MHz) 1006-1058 772
shader频率(MHz) N/A 1544
显存频率(MHz) 6008 4008
像素填充率(GP/s) 32.2 37.06
纹理填充率(GT/s) 128.8 49.41
显存带宽(GB/s) 192 192.4
总线宽度(bit) 256 384
API D3D11.1
OpenGL 4.2
OpenCL 1.2
D3D11.1
OpenGL 4.2
OpenCL 1.1
Gflop/s 3090.4 1581.1
TDP(watts) 195 244
Gflop/s-watt 15.85 6.48

从指标上可以看出,GTX680的 SP数量急剧提高(512->1536),但SM数量见到原来的一半(16->8),所以每个SM内的SP个数从32猛增到192。这对scheduler是极大的考验。

由于配置上的较大不同,性能能有多高看理论值不行,还是得实际跑程序才能知道。这次的评测仍然分三轮进行,分别评测传统图形流水线,DirectCompute和Tessellation的性能。测试的机器仍是两年前的Dell T5400 Workstation(Xeon E5440 4-core,4GB内存),依次装上GTX580和GTX680。两块显卡都是Zotac的公版。操作系统是Win7 64bit,使用传统界面以消除Areo界面的PS开销。显卡驱动分别是Forceware 295.73和Forceware 301.10。DX SDK的版本是June 2010。

第一轮 传统图形流水线

第一论测试的是两块显卡在游戏常见的场景中的图形性能表现,选用的sample是Cascaded shadow depth map,contact hardening shadows, variance shadows 11和Dynamic shadow linkage 11。测试结果如下:

GTX 680 GTX 580
CascadedShadowDepthMap 332.04 337.63
Contact Hardening Shadows 1225.67 851.30
VarianceShadows11 305.40 309.83
DynamicShaderLinkage11 2716.49 2620.81

很失望吧,除了Contact hardening shadows,GTX 680并没有比GTX 580提高多少,甚至还有所下降。但领先的那个例子恰恰是计算量和带宽要求最大的。

第二轮 DirectCompute

盛传GTX 680的GPGPU能力不如从前,第二轮就来测试DirectCompute这个GPGPU能力。

GTX 680 GTX 580
NBodyGravityCS11 675.10 374.28
AdaptiveTessellationCS40 1031.88 938.46
HDRToneMappingCS11 3308.63 2815.89

GTX 680在三个例子中都得到了领先的地位,最明显的是NBodyGravityCS11,达到了1.8x的提升。我认为和这个例子的计算量大、但分支较少有关。一个SM包含那么多的SP,对于分支diverse的代价是很大的。

第三轮 Tessellation

Tessellation一直是NV的强项,这次GTX 680的tessellator再次有了提升。

GTX 680 GTX 580
DetailTessellation11 1077.48 983.20
PN-Triangles 2481.89 2376.34
SimpleBezier11 4373.63 3884.52
SubD11 923.32 578.62

也达到了全部领先的程度。最复杂的SubD11提升1.6x。

以上三个测试可以看到,GTX 680并没有传说中的GTX 580×3的性能,至少,在DX SDK sample的分辨率和复杂程度下没达到。但是可以看到的一个趋势是,对计算量和带宽要求越大的例子,GTX 680的提升就越大,所以其实在大部分时候它的能力是没有完全发挥出来的。分支的程度也比较影响GTX 680,所以应该在shader/kernel级别明智使用分支。另一个重要的事情在于驱动,对比2年前的测试,虽然GTX 580比GTX 480只是多了32个SP,但由于驱动的改进,性能却有非常明显的提升,部分例子甚至达到了3倍。目前GTX 680的驱动刚处于非常初级的状态,相信过一段时间成熟了才会达到GTX 680的最佳状态。

额外测试

在测完DX SDK的例子之后,我与顺便测试了KlayGE的例子。这里选了两个比较有代表性的例子,分别是Deferred和Forward流水线。分辨率是1280×800,高于DX SDK sample的800×600。

GTX 680 GTX 580
Deferred rendering 150.55 139.84
Shadow cubemap 267.38/330.78 259.08/239.07

Deferred rendering的例子情况类似于前面的评测。比较有趣的是Shadow cubemap的例子。和《不争气的geometry shader》一样,这里分别测试了6 pass cubemap和1 pass cubemap。斜杠之前的FPS是6 pass的。在以前的显卡上,不管是NV还是AMD,通过geometry shader完成render to cubemap都比6 pass还慢。但在GTX 680上,GS终于翻身了,彻底打败6 pass的做法。从这个角度也可以看出GTX 680的硬件性能提升。

总的来说,GTX 680并没有官方宣传的“恐怖”性能。但凭借工艺的进步,在那个Die大小的情况下能达到这样的速度是很不容易的。期待下半年的旗舰GK110。