王者之间的较量,R300 VS NV30深度
指令集分析:
接下来,我们进行指令级别的分析,这才是顶点着色器性能和功能的决定性因素。其实,单从指令集上来分析,除了新增的流控指令外,VS 2.0/3.0与VS 1.0其实变化不大,不过是个别数学函数从VS 1.0中宏指令的身份变成了VS 2.0中指令的身份,例如EXP, LOG和FRC,节省了指令空间,提高了效率。MOV指令进行了调整。另外,VS 2.0/3.0新增了若干宏指令,像ABS, SINCOS, NRM, LRP, CRS, SGN和POW等等。因此,为了排版方便,就不提供DX 8 VS 1.x的指令集了。
DX9VS2.0提供的宏指令集:
ABS, CRS, LRP, M4X4, M4X3, M3X4, M3X3, M3X2, NRM, POW, SGN, SINCOS
在这里,我们可以发现指令集上的巨大差距。大面一看,似乎R300和NV30在顶点指令集上各有所长,其实不然。为了节省篇幅,让我们选择一些重要指令进行分析。
加和乘指令:R300和NV30都能够满足DX9VS3.0的要求。NV30更提供了DPH指令。
数学函数指令:NV30更是大胜,提供了更多的数学函数指令。尽管R300可以通过DX9VS2.0/3.0宏指令来模拟NV30提供的某些数学函数指令,例如,SINCOS宏指令可以完成NV30提供的SIN、COS指令同样的功能,可是在R300中要占用8条指令槽才能够完成NV30一条指令就可以完成的工作。
使用宏指令不但要耗费更多的指令空间,降低顶点着色程序所能够编写的指令程度,而且效率低下。例如,理论上,R300完成SIN函数运算需要8倍于NV30的时间。
集合操作指令:NV30的优势更加明显。
流控指令:乍一看,NV30似乎仅仅提供了三条流控制指令,而且有两条还被子程序使用的CALL和RET指令占去了。真正在流控上起作用的似乎只有BRA(分支)指令,与DX9VX2.0/3.0和R300所提供的密密麻麻的条件指令、跳转指令和循环指令一比,非常寒酸。其实,这种观点非常错误。NV30的BRA指令非常灵活,必要时可以使用分支表进行跳转,还可以结合条件代码寄存器实现动态流控。不但可以实现DX9VS2.0和R300的所有静态流控,还可以实现DX9VS3.0的动态流控。且功能更强大,使用更灵活,理论上效率也更高。真正寒酸的是DX9VS 2.0/3.0和R300。
此外,NV30还支持4层子程序嵌套调用,而DX9VS2.0和R200都不支持这一点。
图形相关指令:NV30同样占有明显优势。
纹理指令:这是DX9VS3.0提出的新指令,用于纹理检索。这是NV30VS不能够称为VS3.0,而只能称为VS2.0+的主要原因之一。另一项是临时寄存器数量不足。有迹象让笔者怀疑,TEXLDV指令是出于Matrox公司的建议。
最后,值得一提的是,NV30所提供的指令,除了三条流控指令外,都可以同时更新条件代码寄存器(NV30对预测寄存器的称呼),只要在编写代码时在指令名称后添加C字母后缀即可,例如MOV -> MOVC。
综合分析后,我们可以看出,NV30在VS指令集上的多数方面甚至超过了VS3.0的标准。无论是提供的功能,还是使用的灵活性,甚至乃至效率,NV30远远的超过了R300。起码在理论上,NV30的VS指令集取得了大胜。<