一种使用SIMD指令提高缓存利用率的方法技术

技术编号:37136878 阅读:24 留言:0更新日期:2023-04-06 21:37
本发明专利技术提供一种使用SIMD指令提高缓存利用率的方法,使用SIMD指令实现快速求解平方根倒数的方法以提高缓存利用率,SIMD指令集能够一次加载512的整数倍的bit数据,使用至少一个寄存器完成加载,在计算时一次对512bit数据进行相同操作;并用十六进制魔术数字0x5f3759df减去对寄存器中的数据进行直接逻辑右移1位操作后的结果,得到输入浮点数的平方根倒数的首次近似值;而后重新将其作为浮点数,以牛顿迭代法反复迭代,直至求出匹配精确度要求的近似值并存储到寄存器中,最后将寄存器中的数据存储到内存中。可以提高缓存利用率,一次性加载多个数据,减少硬盘与内存数据的交互时间,从而大大提高了运算速度,占用少量资源,在硬件资源有限的情况下也能高效运行。资源有限的情况下也能高效运行。资源有限的情况下也能高效运行。

【技术实现步骤摘要】
一种使用SIMD指令提高缓存利用率的方法


[0001]本专利技术涉及数据存储
,特别涉及一种使用SIMD指令提高缓存利用率的方法。

技术介绍

[0002]在现有技术中,在向量计算过程中,常常要求取平方根倒数,例如将向量归一化。C数学函数库中的平方根倒数方法具有高精度,但是在追求计算速度的情况下可能无法满足快速计算的要求。平方根倒数速算法(Fast Inverse Square Root)是用于快速计算平方根倒数的一种算法,(输入的待计算数据需符合IEEE 754标准格式的32位单精度浮点数),该算法在保证足够的精度的同时,提高了运算速度。此算法最早被认为是由约翰
·
卡马克所专利技术,但后来的调查显示,该算法在这之前就于计算机图形学的硬件与软件领域有所应用,此算法不仅原作者不明,而且至今为止仍未能确切知晓算法中所使用的特殊常数的起源,该特殊常数被称为“魔术数字”。
[0003]此外,目前平方根倒数速算法普遍使用c语言实现,即首先接收一个符合IEEE 754标准格式的32位单精度浮点数,然后将其作为一个32位整数看待,再将其向右进行一次逻辑移位取半,并用十六进制“魔术数字”0x5f3759df减去取半的结果,得到输入浮点数的平方根倒数的首次近似值;而后重新将其作为浮点数,以牛顿迭代法反复迭代,以求出更精确的近似值,直至求出匹配精确度要求的近似值。在计算浮点数的平方根倒数的同一精度的近似值时,此算法比直接使用浮点数除法要快四倍。
[0004]但是,在处理数据的过程中,经常采用的C语言编程,其中平方根倒数速算方法一次只能处理一个数据,造成缓存浪费,数据交互时间长从而造成运算速度慢,在一些硬件资源有限的平台或芯片上无法运行,特别是针对很多芯片厂商而言,针对不同需求使用不同的芯片,例如北京君正集成电路股份有限公司(简称:北京君正)的芯片上,采用C语言会大大限制芯片的速度,造成缓存浪费。
[0005]现有技术中的常用术语如下:
[0006]1.SIMD全称Single Instruction Multiple Data,单指令多数据流,能够一次处理多个操作数,并把它们打包在大型寄存器的一组指令集。
[0007]2.牛顿迭代法又称为牛顿

拉夫逊(拉弗森)方法,它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。
[0008]设r是f(x)=0的根,选取x0作为r的初始近似值,过点(x0,f(x0))做曲线y=f(x)的切线L,L:y=f(x0)+f

(x0)(x

x0),则L与x轴交点的横坐标x1=x0

f(x0)/f

(x0),称x1为r的一次近似值。过点(x1,f(x1))做曲线y=f(x)的切线,并求该切线与x轴交点的横坐标x2=x1

f(x1)/f

(x1),称x2为r的二次近似值。重复以上过程,得r的近似值序列,其中,x(n+1)=xn

f(xn)/f

(xn),称为r的n+1次近似值,上式称为牛顿迭代公式。

技术实现思路

[0009]为了解决上述问题,本方法的目的在于:使用SIMD指令实现快速求解平方根倒数,可以提高缓存利用率,一次性加载多个数据,减少硬盘与内存数据的交互时间,从而大大提高了运算速度,占用少量资源,在硬件资源有限的情况下也能高效运行。
[0010]具体地,本专利技术提供一种使用SIMD指令提高缓存利用率的方法,所述方法使用SIMD指令实现快速求解平方根倒数的方法以提高缓存利用率,其中使用的SIMD指令集能够一次加载512的整数倍的bit数据,使用至少一个寄存器完成加载,在计算时一次对512bit数据进行相同操作;并用十六进制魔术数字0x5f3759df减去对寄存器中的数据进行直接逻辑右移1位操作后的结果,得到输入浮点数的平方根倒数的首次近似值;而后重新将其作为浮点数,以牛顿迭代法反复迭代,直至求出匹配精确度要求的近似值并存储到寄存器中,最后将寄存器中的数据存储到内存中。
[0011]所述完成加载的寄存器一共有32个,能够重复使用。
[0012]所述SIMD指令集包括加、减、乘、取绝对值、最大值、最小值的算术运算,包括与、或、非、异或、移位的逻辑运算,包括小于、等于、小于等于的比较运算,对于复杂运算需求通过多个指令结合实现。
[0013]所述方法包括以下步骤:
[0014]S1.加载数据,是以32bit的整数倍加载,一个寄存器最多加载512bit数据;
[0015]表示为Register1的寄存器1,用以保存计算结果;
[0016]使用一条加载数据的SIMD指令,表示为:
[0017]Register1=Ingenic_simd512_load((float)data),
[0018]其中,(float)data为输入的16个32bit单精度浮点数;
[0019]S2.将Register1里的数据进行直接逻辑右移1位操作,
[0020]使用一条逻辑右移1位的SIMD指令,表示为:
[0021]Register2=Ingenic_simd512_logical_shift_right_1_bit(Register1)Register1为操作数,Register1里的16个32bit单精度浮点数被同时执行逻辑右移1位操作,结果保存在表示为Register2的寄存器2里;
[0022]S3.使用32bit的十六进制魔术数字0x5f3759df减去步骤S2的结果,得到平方根倒数的首次近似值,
[0023]使用一条加载立即数的SIMD指令,表示为:
[0024]Register3=Ingenic_simd512_load_immediate(0x5f3759df),
[0025]将0x5f3759df加载到Register3里,该指令能够将一个32bit数据复制成16个32bit数据加载到一个512bit的寄存器里;
[0026]使用一条整数减法的SIMD指令,表示为:
[0027]Register2=Ingenic_simd512_int_sub(Register3,Register2),
[0028]将Register3里的16个32bit数据与步骤S2的结果相减,该指令能够同时完成16个减法操作,该步骤相减的两个操作数都为整数,所以使用整数相减指令,相减后的结果仍然保存在Register2里;
[0029]S4.使用一条浮点数相乘的SIMD指令,即Register1里的16个浮点数与Register3里的16个浮点数对应相乘,表示为:
[0030]Register4=Ingenic_simd512_float_mul(Register1,Register3),
[0031]将Register1里的数据与浮本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种使用SIMD指令提高缓存利用率的方法,其特征在于,所述方法使用SIMD指令实现快速求解平方根倒数的方法以提高缓存利用率,其中使用的SIMD指令集能够一次加载512的整数倍的bit数据,使用至少一个寄存器完成加载,在计算时一次对512bit数据进行相同操作;并用十六进制魔术数字0x5f3759df减去对寄存器中的数据进行直接逻辑右移1位操作后的结果,得到输入浮点数的平方根倒数的首次近似值;而后重新将其作为浮点数,以牛顿迭代法反复迭代,直至求出匹配精确度要求的近似值并存储到寄存器中,最后将寄存器中的数据存储到内存中。2.根据权利要求1所述的一种使用SIMD指令提高缓存利用率的方法,其特征在于,所述完成加载的寄存器一共有32个,能够重复使用。3.根据权利要求1所述的一种使用SIMD指令提高缓存利用率的方法,其特征在于,所述SIMD指令集包括加、减、乘、取绝对值、最大值、最小值的算术运算,包括与、或、非、异或、移位的逻辑运算,包括小于、等于、小于等于的比较运算,对于复杂运算需求通过多个指令结合实现。4.根据权利要求3所述的一种使用SIMD指令提高缓存利用率的方法,其特征在于,所述方法包括以下步骤:S1.加载数据,是以32bit的整数倍加载,一个寄存器最多加载512bit数据;表示为Register1的寄存器1,用以保存计算结果;使用一条加载数据的SIMD指令,表示为:Register1=Ingenic_simd512_load((float)data),其中,(float)data为输入的16个32bit单精度浮点数;S2.将Register1里的数据进行直接逻辑右移1位操作,使用一条逻辑右移1位的SIMD指令,表示为:Register2=Ingenic_simd512_logical_shift_right_1_bit(Register1)Register1为操作数,Register1里的16个32bit单精度浮点数被同时执行逻辑右移1位操作,结果保存在表示为Register2的寄存器2里;S3.使用32bit的十六进制魔术数字0x5f3759df减去步骤S2的结果,得到平方根倒数的首次近似值,使用一条加载立即数的SIMD指令,表示为:Register3=Ingenic_simd512_load_immediate(0x5f3759df),将0x5f3759df加载到Register3里,该指令能够将一个32bit数据复制成16个32bit数据加载到一个512bit的寄存器里;使用一条整数减法的SIMD指令,表示为:Register2=Ingenic_simd512_int_sub(Register3,Register2),将Register3里的16个32bit数据与步骤S2的结果相减,该指令能够同时完成16个减法操作,该步骤相减的两个操作数都为整数,所以使用整数相减指令,相减后的结果仍然保存在Register2里;S4.使用一条浮点数相乘的SIMD指令,即Register1里的16个浮点数与Register3里的16个浮点数对应相乘,表示为:Register4=Ingenic_simd512_float_mul(Register1,Register3)将Register1里的
数据与浮点数0.5相乘,需要先将0.5加载在Register3里,由于0.5是浮点数,不能使用加载立即数指令,只能使用普通加载指令,表示为:Register3=Ingenic_simd512_load(0.5),加载完一个0.5后,使用一条repeat指令,所述repeat指令是一条复制数据的指令,表示为:Register3=Ingenic_simd512_repeat(Register3)将一个32位浮点数0.5复制成16个32bit的浮点数保存在Register3里;此时相乘指令的两个操作数都为浮点数,所以使用浮点数相乘指令,结果保存在Register4里;再将32bit浮点数1.5以相同的方法加载到Register5里,表示为:Register5=Ingenic_simd512_load(1.5)Register5=Ingenic_simd512_repeat(Regist...

【专利技术属性】
技术研发人员:田喻
申请(专利权)人:北京君正集成电路股份有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1