本发明属于数据处理,特别涉及一种基于simd的4bit算子加速计算的方法。
背景技术:
1、现有技术中,低比特计算是指输入输出限定为4bit,减少内存。simd:singleinstruction multiple data,是单指令流多数据流,一次运算指令可以执行多个数据流,可以提高程序的运算速度。(每个寄存器512bit位宽)
2、simd并行计算:多数据流并行计算,提高计算效率。
3、然而,现有技术的主要缺陷在于:通道为奇数时,地址跳转无法以半个字节偏移
4、此外,现有技术中的常用术语包括:
5、feature_shape:输入数据的形状,抽象理解为多维度数据,从左到右依次是从高维到低维(nhwc)n:一次处理featuremap数量,设置为1;h:输入数据的高,w:输入数据的宽,c:输入通道数。
技术实现思路
1、为了解决上述问题,本技术的目的在于:将基于simd,通道为奇数情况,解决地址跳转问题。
2、具体地,本发明提供一种基于simd 4bit算子加速计算的方法,所述方法中:
3、4bit计算逻辑是:计算机计算过程中最小计算单位为1个字节=8bit,1个字节中存储两个4bit数据,分为高、低4bit数据;地址跳转单位字节,需要根据索引计算出正确地址,以及地址所存储数据;
4、所述方法适用于各种算法,核心在于4bit数据的读取与保存;
5、其中,加法算子:val=(a+b)*scale;输入形状(ibatch,ih,iw,ic);s1:索引计算,每次32个通道,存储于寄存器中,即第n个数据,然后根据该索引计算出地址偏移;根据h、w、c计算出数据索引idx,即根据第h行,第w列,第c个通道点公式计算:idx=h*iw*ic+w*ic+c;计算得到数据索引;
6、像素索引得到数据索引,表示为:idx=h*iw*ic+w*ic+c;
7、地址偏移得到地址偏移,idx*4能够计算一共偏移bit数,除以8,得到地址跳转的字节数,表示为:ptr_offset=idx*4bit/8;
8、bit索引计算得到字节中bit位置,高、低4bit,表示为:bit_idx=idx%2;s2:输入数据读取:
9、将bit索引存入寄存器bshr_vr,读取33个通道数据,其中32个数据有效,剩余一个数据用于寄存器偏移;
10、使用simd指令bshr,表示为bshr(vr0,vr1,vr0)根据vr1的0~5bit,如果全0,不右移,非0,右移一个字节:寄存器整体右移bit_idx个字节;
11、当bit_idx=0;表示该索引为偶数,不存在半个字节即4bit跳转,寄存器数据无需偏移;
12、当bit_idx=1;表示该索引为奇数,地址跳转少偏移半个字节,simd指令读取数据,使用la(o,vr0,0,ptr,0),从输入地址ptr读取数据,存入vr0寄存器,存在多读取1个数情况,此时将整个寄存器右移,使用bshr(vr0,vr1,vr0)右移一个字节,移除无效数据,这也是为何读取33个通道的原因:
13、 32 31 30 29 ...... 3 2 1 -1 32 31 30 ..... 4 3 2 1
14、其中第一行数字32为第33个数,为方便理解,将寄存器下标索引理解为具体数值,-1表示需要移除的半个字节的数据;
15、移位之后,将多余-1数据移除,32填充到寄存器内,进行扩展;
16、经过移位之后,输入寄存器所有数据都是有效数据;
17、s3:加法计算,使用指令add(vr0,vr1,vr0),将寄存器vr0,和vr1数据相加更新到vr0寄存器中,完成val=(a+b)*scale,并将输出结果重新保存为4bit数据;
18、s4:数据存储,根据输入计算方式,计算出输出的bit索引和字节跳转:shift_idx=bit_idx%2;
19、如果为0,不需要跳转,如果为1,需要右移1个字节使用la(w,bshr_vr,0,&shift_idx,0);将是否需要偏移的标识符存入bshr_vr寄存器;
20、使用bshr(vr0,bshr_vr,vr0)根据bshr_vr寄存器标志符进行移位;
21、obit_idx:输出bit索引,用于计算输出数据存储位置;
22、设置输出mask,设为obit_mask,
23、当obit_idx=0;表示索引为偶数,不存在地址偏移存在问题;obit_mask=0;
24、当obit_idx=1;表示索引为奇数,存在输出地址跳转缺少半个字节;使用指令读取一个数,将该数据存入寄存器;obit_mask=0xff;
25、将该缺少的半个字节数据-1存入寄存器
26、
27、
28、最后将-1~31,一个32个数通过simd sa指令存入地址,即使用sa(o,vr0,0,out_ptr,0)将vr0寄存器数据存入输出地址out_ptr,最后一个数根据高低4bit,单独存入指定地址的指定bit位,其中,这里的数字仅用于表示寄存器数据,为方便理解,使用1~32共32个数表示原始寄存器数据,-1表示移位之后寄存器的数据,该数据属于无效数据,使用-1表示;
29、使用simd指令andv,与操作,表示为:andv(vr0,obt_mask,vr0),根据obit_mask判断是否需要保留原始数据;
30、使用simd指令bshl,表示为:bshl(vr1,bshr_vr,vr1)根据bshr_vr寄存器标志符进行移位:寄存器整体左移obit_idx个字节;
31、使用simd指令bselv,表示为:bselv(obt_mask,vr0,vr1),根据是否需要移位来判断第一个字节是从原始地址空间读取,还是从寄存器中读取:将两次输出结果合并;存储到输出地址;
32、s5:当剩余通道数小于32chn,使用c++计算,将计算得到的结果根据bit位宽存入对应的输出地址,表示为:
33、
34、当obit_idx=0;val值不变,存入输出地址;
35、当obit_idx=1;val=val<<4,存入输出地址;
36、out_val[idx/2]+=val;高低4bit分两次存入,组成一个字节;低4bit通过&0xf,保证数据阈值在[0,15],高4bit,通过左移4bit,存入一个字节中高4bit数据,完成两个4bit数据组成8bit数据方式。
37、所述方法中:
38、读取数据:
39、一个字节数据:val_8bit=1000 1001
40、低4比特=val_8bit&0xf=1001取一个字节中的低4bit
41、高4比特=val_8it>>4=1000取一个字节中的高4bit simd读取数据后,使用la(o,vr0,0,ptr,0),从地址读取数据存入寄存器,将8bit数据中的4比特数据扩展为所需的bit位宽,用于后续的必要计算;存储数据:
42、低4bit数据:9=二进制1001
43、高4bit数据:8=1000<<4得到1000 0000
44、低4bit+高4bit=1000 1001,组成一个8bit数据,存入地址。
45、由此,本技术的优势在于:通过简单的方法解决地址跳转问题。