码迷,mamicode.com
首页 > 其他好文 > 详细

SHAVE概述(待修改)

时间:2015-01-16 19:03:47      阅读:601      评论:0      收藏:0      [点我收藏+]

标签:

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

 

Mnemonics

参数分隔符号可以是空格或者‘,‘。

NOP 4 等价于:

NOP

NOP

NOP

NOP

NOP执行4次。

 

SHAVE概述(待修改)

标签:

原文地址:http://www.cnblogs.com/biglucky/p/4229334.html

(1)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!