报名编号:CICC1764
团队名称:两年半IC练习生
E203分享之自定义指令扩展
分享一下关于脉冲神经网络加速器自定义指令集的设计,我们的作品需要先对图像进行预处理,比如:卷积运算、脉冲编码等。然后把产生的脉冲编码发送给加速器的全连接层,并最终实现图像分类的目标。为此我们设计了以下指令:
自定义指令格式如下:
软件配置标准差,程序下载时将标准差存入内存中。rs1为%1,set_sigma指令来读取操作数1的值(存放标准差的内存地址)。rs2为0,不使用。rd为0,不写回。
指令代码如下:采用内嵌汇编
__STATIC_FORCEINLINE void set_sigma(int addr)
{
int zero = 0;
asm volatile (
".insn r 0x7b, 2, 8, x0,%1, x0"
:"=r"(zero)
:"r"(addr)
);
}
指令在程序中的调用:
unsigned int sigma[2] = {2,1}; //sigma1,sigma2
set_sigma((int)sigma);
输入数组sigma[2]中包含2和1两个元素,分别对应着两个不同的标准差,进而可以生成两个不同的卷积核。
软件配置脉冲编码方式,程序下载时存入内存中。rs1为%1,set_code_mode指令来读取操作数1的值。rs2为0,不使用。rd为0,不写回。
指令代码如下:
__STATIC_FORCEINLINE void set_code_mode(int addr)
{
int zero = 0;
asm volatile (
".insn r 0x7b, 2, 11, x0,%1, x0"
:"=r"(zero)
:"r"(addr)
);
}
指令在程序中的调用:
unsigned int code_mode[8] = {1,1,1,1,1,1,1,1};
//possion,single,TTFS,ISI code
set_code_mode((int)code_mode);
fence();
code_mode数组对应code_mode_reg,其中每一位代表控制一种编码方式的开关。其中高四位分别对应泊松、单独、TTFS、ISI的编码方式,后四位待定
软件读取原图像矩阵,程序下载时存入内存中,op_conv指令来读取操作数1的值(存放原图像矩阵的内存地址),并对图像数据进行卷积运算。
指令代码如下:
__STATIC_FORCEINLINE void op_conv(int addr)
{
int pulse = 0;
asm volatile (
".insn r 0x7b, 2, 9, x0,%1, x0"
:"=r"(pulse)
:"r"(addr)
);
}
程序中指令调用如下:
op_conv((int) memory); //source image data stored in the array of memory