距离竞争对手推出最新产品已经过去两年了。 如果您读过前一篇文章,刚刚开始读这篇文章,我想您还在等待"那个东西",它能让PS2变得像当年一样强大。 现在,让我来介绍一下索尼在情感引擎中安装的一套非常重要的组件——矢量处理单元(Vector Processing Units,"VPU")。
架构
矢量处理单元是一个独立的小型处理器,专门用于处理矢量,尤其是由四个float组成的矢量。 这些处理器速度极快,每次操作只需一个周期,这对于几何图形的处理极为方便。 尽管它们表现出与CPU的FPU类似的非标准化行为。
矢量单元由以下部分组成:
- 矢量单元内存(Vector Unit Memory,"VU Mem"):用作矢量单元的工作空间。 它存储操作所需的值和/或先前操作的结果。
- 矢量单元: 处理器的核心。 它包含一些内存(称为微内存(Micro Memory)),用于存储程序(称为微程序(Microprogram)),指示矢量单元如何操作矢量单元内存中的数据。
- 它采用64位ISA,执行单元分为两个并行的子单元。 第一个子单元进行浮点数乘法或加法运算,而另一个子单元则进行浮点数除法或整数运算。这样就可以同时操作浮点数和整数。 这样就能同时操作浮点数和整数。
- 矢量接口:自动将来自主存储器的顶点数据解压缩为矢量单元可以理解的格式。 该单元还可将微程序传输到微型存储器。
功能
要开始工作,需要"启动"矢量单元。 为此,主CPU负责提供微代码。
EE中安装有两个VPU,但它们的安排方式不同,因此有不同的用途和优化方式。
矢量处理单元0
第一个VPU(VPU0)位于CPU和另一个向量单元(VPU1)之间。 它为主CPU提供"辅助"作用。
VPU0 有两种工作模式:
- 微模式: 这是"传统模式"。 VPU将独立执行存储在微存储器中的微程序中的"微指令"。
- 宏模式: VPU0成为主CPU的"COP2",执行通过专用128位总线从主CPU接收的 "宏指令"。
- 宏指令的功能与微指令相同,但使用不同的操作码。 不过,VPU执行单元不再被分割(这意味着它一次只能执行一条指令)。
- 虽然这种模式不能充分利用VPU0的所有组件,但仍能加快CPU的矢量运算速度。 此外,就简便性而言,协处理器比独立单元更容易编程(PC程序员会发现这一点很有帮助)。
VPU0的内存映射还可以访问其他VPU的某些寄存器和标志,大概是为了检查其状态或快速读取其他VPU的某些操作结果。
矢量处理单元1
第二个VPU(VPU1)是VPU0的增强版,其微型存储器和VU存储器的容量是VPU0的四倍。 此外,该单元还包括一个名为初等函数单元(Elementary function unit,"EFU")的附加组件,可加快指数和三角函数的执行速度。
VPU1位于VPU0和图形接口(通往GPU的"门")之间,因此它包括额外的总线,以便在不使用主总线的情况下尽快将几何图形传送到GPU。
另一方面,由于其位置的原因,VPU1只能在微模式下运行。
很明显,这个VPU是为三角运算而设计的,可以作为GPU的预处理器。 因此,它经常负责提供著名的显示列表。
无限世界
过程生成是这些单元可以利用的一种有用方法。 换句话说,与其使用硬编码几何图形构建场景,不如让VPU使用算法生成场景。 在这种情况下,VPU通过计算数学函数来生成几何图形,然后由GPU进行解释(如三角形、直线、四边形等),最终用于绘制场景。
与使用显式数据相比,过程生成内容是并行化任务的理想选择,它可以释放带宽,只需很少的存储空间,而且是动态的(程序员可以设置参数来实现不同的结果)。 许多领域都能从这种技术中获益匪浅:
- 复杂曲面(如球体和车轮)。
- 世界渲染(如地形、粒子、树木)。
- 贝塞尔曲线(Bézier curves),计算机图形学中用于绘制曲线的一种非常流行的方程。 这些曲线被转化为贝塞尔补丁(显式几何体),并根据所需的细节程度支持不同的精度。
另一方面,过程生成内容可能难以处理动画,如果算法过于复杂,VPU可能无法在所需时间内生成几何图形。
总之,程序渲染并不是一种新技术,但由于VPU的出现,它为进一步优化和丰富图形打开了大门。 尽管如此,程序渲染技术的实现并不简单,索尼研发部门发表了多篇论文,介绍了在其游戏机上使用的不同方法。
由您定义工作流程
有了这些新功能,程序员在设计图形引擎时就有了很大的灵活性。 为此,索尼投入了更多资源来设计和记录高效的流水线设计。 以下是针对不同类型工作负载进行优化的图形流水线示例:
在第一个并行设计示例中,CPU与宏模式下的VPU0结合,与VPU1并行生成几何图形。 CPU/VPU0组充分利用Scratchpad和高速缓存,避免使用主总线,而VPU1则依靠主内存获取数据。 最后,两个渲染组同时向GPU发送各自的显示列表。
第二个例子是串行设计,它提出了一种不同的方法,即CPU/VPU0组作为VPU1的预处理器工作。 第一阶段将获取并处理所有几何图形,然后由VPU1将其转化为显示列表。
以上是从理论角度举例说明的,但为了解释更"实际"的实现方法,我将参考Jon Burton发布的一段视频,内容涉及他们开发的一款PS2游戏。

古惑狼2(Crash Bandicoot: The Wrath of Cortex)(2001) 烛火和窗玻璃发出的光都是由微粒形成的
Travellers Tales的前总监解释了他的团队是如何在VPU1中实现完全封装的粒子系统的。 简而言之,VPU1主要是从其VU内存中读取一个预先填充的数据库,该数据库用于计算任何给定时间内粒子的坐标,而无需依赖任何其他组件。 操作结果可以转化为显示列表并立即发送。
通过这种方法,CPU的负荷大大减轻,从而可以执行AI和物理等其他任务。
这样的例子还有很多,但总而言之: 现在,程序员可以找到最佳的设置,这是一件好事。



