WeiLin

Logo

End of Best.

View My GitHub

> Home
> Back

RV32V:向量

by WeiLin, 2019.7.27

数据并行有三种方法:向量架构、SIMD指令集扩展、GPU。RISC-V中使用向量而不是SIMD

1. SIMD

SIMD(单指令多数据),即单条指令可以对多个数据进行并行处理。SIMD指令是将64位寄存器(或更大)拆分成多个8位、16位或32位的数据,然后并行计算它们。所以SIMD指令一次只能并行少量或中量的数据。

SIMD多媒体扩展源于一个事实:媒体应用程序操作的数据类型经常是8位或16位,往往少于寄存器宽度。这也是为什么将其称为多媒体扩展。

x86体系结构最早的SIMD扩展是MMX,之后是的SSE,一直到现在的AVX(高级向量扩展)。MMX将64位的浮点寄存器拆分成8个8位运算或4个16位运算。SSE添加了128位宽的独立SIMD寄存器,所以可以拆分成16个8位、8个16位或4个32位运算。而AVX寄存器宽度为256。

在每次增大SIMD寄存器长度时,都会改变指令集。这是因为SIMD指令需指定数据宽度,因此扩展SIMD寄存器也意味着同时扩展SIMD指令集。

2. 向量

“向量计算机从内存中收集数据元素,将它们放入长的、顺序的向量寄存器中。在这些向量寄存器上,流水线执行单元可以高效地执行运算。然后,向量架构将结果从向量寄存器中取出,并将其放回存储器中。”

向量寄存器往往可以存入数十个向量元素,所以可以并行处理多个数据项(SIMD只能并行处理少量的数据)。

for(i=0;i<=999;i++)
    x[i]=x[i]+y[i];

对于上述循环,可以进行并行处理。普通指令下,每次迭代需要7条指令(2条载入、1次求和、1次存储、2次地址更新、1次分支),总共7000条指令。而对于每条指令可以处理4个数据项的SIMD,只需要四分之一的指令。而在一些向量处理器里,这个序列可能只需要4条指令:2条向量载入、1条向量求和、1条向量存储。(例子来源:《计算机体系结构:量化研究方法》)

向量寄存器的大小由实现决定,而不像SIMD那样嵌入操作码中。“将向量长度和每个时钟周期可以进行的最大操作数分离,是向量体系结构的关键所在”,向量微架构可以灵活地设计数据并行硬件而不会影响到程序员和编译器。

向量架构主要有如下组件:向量寄存器、向量功能单元、向量载入/存储单元、标量寄存器。

向量寄存器是固定长度的寄存器组,可以保存一个向量。向量功能单元执行不同的向量运算,比如逻辑、整数、浮点运算,其可以流水线执行。向量载入/存储单元是完全流水化的,所以在初始延时之后,每个时钟周期移动一个字。标量寄存器是用于存储标量的,因为有时候不全是向量与向量的运算,也可能是向量与标量的运算。

tags: risc-v