在CPU核的设计中,SIMD(single instruction multiple data,单指令多数据)是一种常用的数据并行处理方式,通过一条指令同时对多个数据元素进行操作以提升处理器的计算效率和运行速度。SIMD 具有广泛的应用场景,例如图像处理、科学计算、加解密、机器学习和人工智能等。随着应用对算力需求的不断提高,处理器的数据并行能力也随之增长(例如intel的 SIMD ISA 进化,寄存器从 MMX 的 64-bit 进化到如今 AVX 的512-bit)。但这种传统 SIMD 指令的编程模型决定了其寄存器长度(即并行度)是嵌入在指令中的,软硬件的耦合度很高,每次硬件的并行度升级都需要软件进行相应的适配,带来额外的软件工作量。
相较于传统 SIMD 指令,RISC-V 指令集向量扩展 RISC-V Vector 采用了更加灵活的编程模型,在提供单指令多数据并行处理的同时,为开发者提供了更高层次的抽象,使得软硬件更加解耦,软件无需感知硬件并行度的变化,直接适配于不同的硬件配置。
我们以 RISC-V Vector1.0 指令集为例。从图中可以看到,对于向量寄存器宽度( VLEN )不同的硬件,同一套程序可以直接运行,唯一区别是 VLEN 越大的处理器每轮迭代所能够处理的元素个数越多,因此所需要的循环次数越少。此外,由于指令集所定义的element mask功能,在最后一轮迭代时,超出的元素将被无效掉,而无需类似 SIMD 指令那样对循环末梢的元素进行额外的特殊处理。
进迭时空第一代 RISC-V CPU核X60 和 RISC-V AI核 A60 已完整支持 RISC-V Vector 1.0 扩展,并应用于RISC-V AI CPU芯片 K1 中。该系列核支持 VLEN=256-bit 的向量寄存器宽度,提供最大 2×128-bit 的数据并行处理能力,支持 INT/FP 等多种计算精度。同时,A60 还基于向量寄存器扩展了符合 IME 标准的 AI 指令,提供 2Tops INT8 融合AI算力。
我们基于 SWAN 测试集对 K1 的向量能力进行了测试和优化。SWAN 是一套用于测试向量指令在多媒体、图像处理等数据密集型应用中性能表现的基准测试集,其针对 chromium、WebRTC、PDFium 等应用的软件库进行性能分析,测试涵盖了图像编解码、卷积计算、色彩空间转换等典型算法。
在SWAN的所有37个测试中,向量指令相较于标量指令均获得了明显的加速比,尤其是在低精度高并行度的测试上,向量的加速效果可达数十倍。
此外,相较于 Cortex-A55 的 SIMD 指令, 在相同频率下,K1 芯片的 Vector 指令测试表现:
由于配置了更宽的向量寄存器和数据处理宽度,K1 在数据并行度高的程序上获得了更大的收益,例如ibjpeg、skia 等典型的图像测试程序的性能上甚至可达50%~100%的提升。此外,软件优化也是向量化非常重要的一个环节。程序的算法及指令调度优化会对测试结果有影响,在针对性进行优化调整之后,向量化的程度和整体性能都有明显提升,这也是 RISC-V Vector 指令集软件生态在实际应用场景中需要不断积累优化的地方。