异构计算,CPU+GPU 使用专用的硬件做专业的事情。
RISC-V架构的可扩展性
预留的指令编码空间
RISC-V架构的预定义指令
蜂鸟E203的协处理器扩展机制 - NICE
使用NICE (核指令协同单元扩展) 机制进行协处理器扩展。
NICE指令的编码
32位的NICE指令
NICE协处理器的接口信号
4通道。 请求通道 反馈通道 存储器请求通道 存储器反馈通道
主处理器和协处理器配合使用。
NICE协处理器的流水线接口
NICE指令的执行过程:
1 主处理器的译码单元在EXU级 对指令的操作码进行译码,判断是否是预定义指令组
2 若为预定义指令,则依据指令编码中的xs1和xs2判断是否需要读取源寄存器,如果需要读取,EXU级读取通用寄存器组,读出源操作数。
3 主处理器会维护数据依赖的正确性,如果改指令需要读取的源寄存器和之前正在执行的某条指令有RAW的依赖性,则处理器流水线会暂停直至依赖性解除,另外主处理器根据xd位判断预定义指令是否需要将写回结果至通用寄存器组。
4 主处理器在EXU级通过NICE协处理器中接口的请求通道派发给外部的协处理器。蜂鸟E203为32位架构
5 协处理器通过该请求通道接收命令,作进一步译码,并执行指令;
6 协处理器将反馈结果反馈给主处理器。
7 主处理器将指令从流水线取出,并将结果写回通用寄存器组。
NICE协处理器的存储器接口
在处理器的LSU Load/Store Unit访存模块,中为NICE协处理器预留了专用的访存接口。
NICE协处理器可以访问主处理器可以寻址的数据存储器资源,ITCM,DTCM,系统存储总线,系统设备总线,快速IO口
主处理器的LSU为NCIE协处理器预留的专用访问通道基于ICB标准。
NICE协处理器和主处理器中LSU 接口的ICB采用Vaild - ready的方式同步握手。
蜂鸟E203的协处理器
假设有一个3行3列的矩阵按顺序存储在存储器中,矩阵的每个元素是32位的整数。
对矩阵进行:
计算逐行的累加和 计算逐列的累加和
c语言是通过循环方式,计算。按行按列读取,计算。
理论上该程序需要完整地从存储器中读取矩阵元素两次,第一次用于行,第二次用于列。
C程序编译成汇编代码需要消耗较多的指令。
为了提高性能,将矩阵操作定义成协处理器指令。在协处理器中实现12字节的行缓存,用来存储3个列累加值。 每次通过cacc指令计算行累加值时,也会讲三个元素与存储器在行缓存的三个值分别进行相加,因而当完成行累加时,列累加的运算同时完成。 只需通过csw指令将行缓存中的结果读出即可。 每次行缓存前使用clw对行缓存初始化。
协处理器的硬件实现
主要由控制模块和累计模块组成。控制模块负责和主处理器通过NICE协处理器进行交互,并调用累加模块进行累加运算。
需要在c程序中内嵌汇编指令的调用。