标签:
SHAVE 包含宽而深的寄存器文件,加上一个提高代码大小效率的长指令集(VLIW)。
如下图: VLIW包控制多个功能单元,SIMD功能,可以提高并行度和吞吐量。
SIMD:单指令流多数据流(英语:Single Instruction Multiple Data,缩写:SIMD)是一种采用一个控制器来控制多个处理器,同时对一组数据(又称“数据矢量”)中的每一个分别执行相同的操作从而实现空间上的并行性的技术。其典型代表是向量处理器(Vector Processor)和阵列处理器(Array Processor)。
比如有四个计算单元,给这个四个计算单元发一条加法指令,这样他们可以同时执行加法计算。向量计算x,y,z,w就是用到这个,所以是典型代表。
SHAVE 支持多种类型的SIMD指令,16bit int, 32bit int, 16bit float, 32bit float, 8bit int等等。
SHAVE 还支持汇编, C 和 C++编程,这个需要movidius内部公爵 moviAsm 和 moviCompile.
下面基本介绍:IRF, VRF, VAU, SAU, IAU, PEU, BRU 和 LSU
IRF(整形寄存器文件)
IRF包含32个寄存器,每个是32bit长。这些寄存器主要是实现对整形运算的支持,不仅如此,还用与加载和存取指令。
执行和操作这些寄存器的是IAU(Integer Arithmetic Unit,整形运算单元)和 SAU(Scalar Arithmetic Unit标量运算单元)。
另外SIMD运算在SAU和IAU还有一些16bit和8bit的整数类型。
VRF(向量寄存器文件)
VRF同样也包含32个寄存器,每个是128bit长度。 这些寄存器是为啦给SHAVE提供SIMD操作。
执行这些寄存器的称作VAU(Vector Arithmetic Unit). 它同时支持整形和浮现运算,支持8,16, 32bit 整形或者浮点型。
SAU(Scalar Arithmetic Unit)
这个单元为IRF提供浮点运算支持。
除拉最通用的浮点源运算,这个单元还实现一些复杂的16bit浮点运算,如:补运算,正弦, 平方根,平方根倒数,余弦,反正切,对数和指数。
这个单元还为提供整形运算。假如有用,这个特点会更多的用来为IRF提供并行整形运算。
CMU(Compare and Move Unit 比较移动单元)
这个单元提供从一个寄存器拷贝数值到另外一个寄存器的功能。支持任意组合和多位长(bit)。
这个单元也提供比较数据类型的功能。比较通过设定多种条件入口。 VRF也可以发起这个比较,比较多种数据。
LSU(Load Store Unit加载存储单元)
有2个加载存储单元提供加载和存储数据给两个寄存器文件
LSU和其他单元配合使用,混合操作多种数据类型,在SHAVE ISA文档上面有描述。
BRU(Branching Unit分支单元)
BRU提供分支功能。SHAVE 有一个5个周期的延时槽用来填写进其他的指令。
PEU(Predicate Execution Unit预测执行单元)
PEU有助于实现条件分支预测和保存条件在LSU和 VAU单元里面
IRF: 整形寄存器文件(32*32)
32 words of 32-bit wide data
The IRF can be accessed by the IAU or the SAU units
Scalar Register File (32x32)
• 32 words of 32-bit wide data
• The SRF can be accessed by the SAU unit only
VRF:Vector Register File (32x128)
• 32 words of 128-bit wide data
• The VRF can be accessed by the VAU unit only
下面是一个SHAVE汇编的示例
;-----------------------------------------
;The code is for ISAAC version 1.1
;-----------------------------------------
.version 00.40.10.2
.data initSection 0x40000000
vFrameSize:
.int 0x10, 0x10, 100, 100
.data colorSection 0x90101000
vColorTable:
.byte 0xFF, 0xFF, 0xFF ;white
.byte 0x00, 0x00, 0x00 ;black
.data frameSection 0x10008000
vBmpPointer:
.incbin “frame1.bin”
.code entryPoint 0x1D000000
LSU0.LDIL I0, vColorTable ;load pointer to colors
|| LSU1.LDIH I0, vColorTable
LSU0.LDIH I1, vBmpPointer ;load bmpPointer
|| LSU1.LDIH I1, vBmpPointer
;……
.end
这个汇编主要包含2个字段: data sections 和 code sections。每个都包含:
<sectionName> + <sectionDefaultAddress>
Data 段主要包含图像和测试数据等。
Code段包含啦需要执行的汇编代码。
Code会被组织在管道里和预处理指令。
“||”表示在同一个周期里面同时执行。
编译器空格键和TAB键
注释是用";" 或者“//”
符号必须是 [label]: 如下:
EntryPoint:
LSU0.LDIL I1, EndLabel
|| LSU1.LDIH I1, EndLabel
BRU.JMP I1
NOP 5
...
…
…
EndLabel:
VAU.ADD.I32 V1, V2, V3
汇编代码中的符号会处理成字符串。大小写有区别。
.set SymbolName 0xFFFF0000
LSU0.LDIL I1, SymbolName
|| LSU1.LDIH I1, (SymbolName >> 16)
;I1 will have the value 0xFFFF0000
SymbolName 会被0xFFFF0000替代。
数字被当作立即数,可能有不同的前缀,十进制(没有前缀),16进制(‘0x‘),2进制(‘0b‘)
LDIL 和 LDIH 操作符是加载特定的立即数:
LDIL: 加载低16位。
LDIH:如果这个数能填满16bit,就加载这个数,如果不能填满16bits,高16位会被加载(??)
示例:
.set SymbolName1 0x41200000
.set SymbolName2 10F32
LSU0.LDIL I1, SymbolName1
|| LSU1.LDIH I1, (SymbolName1 >> 16)
LSU0.LDIL I2, SymbolName2
|| LSU1.LDIH I2, (SymbolName2 >> 16)
;I1 and I2 will have the same values 0x41200000
I1 和 I2 都等于 0x41200000
参数分隔符号可以是空格或者‘,‘。
NOP 4 等价于:
NOP
NOP
NOP
NOP
NOP执行4次。
标签:
原文地址:http://www.cnblogs.com/biglucky/p/4229334.html