首页 专利交易 科技果 科技人才 科技服务 国际服务 商标交易 会员权益 IP管家助手 需求市场 关于龙图腾
 /  免费注册
到顶部 到底部
清空 搜索

一种基于SIMD指令实现快速求解正数算术平方根的方法 

买专利卖专利找龙图腾,真高效! 查专利查商标用IPTOP,全免费!专利年费监控用IP管家,真方便!

申请/专利权人:北京君正集成电路股份有限公司

摘要:本发明提供一种基于SIMD指令实现快速求解正数算术平方根的方法,包括:S1.加载数据,为:Register1=Ingenic_simd512_loadfloatdata;S2.将Register1里的数据使用SIMD指令求出平方根倒数,表示为Register2=Ingenic_simd512_rsqrtRegister1;这里Ingenic_simd512_rsqrt为求出平方根倒数的方法名,其表示能够涵盖求解平方根倒数的各步骤,结果保存在寄存器Register2中;S3.将S2中获得的平方根倒数乘以输入数据得到输入数据的算术平方根,表示为Register3=Ingenic_simd512_float_mulRegister1,Register2;S4.将计算结果从寄存器中保存到内存中。本方法使用SIMD指令实现快速求解正数算术平方根的方法,可以提高缓存利用率,一次性加载多个数据,尽可能的利用缓存空间,减少硬盘或内存与缓存之间数据交互的次数,从而大大提高了运算速度,占用少量资源,在硬件资源有限的情况下也能高效运行。

主权项:1.一种基于SIMD指令实现快速求解正数算术平方根的方法,其特征在于,所述方法包括如下步骤:S1.加载数据,是以32bit的整数倍加载,一个寄存器最多能够加载512bit数据;单精度浮点数为32bit,一个寄存器能够加载16个浮点数,所以一条SIMD指令能够同时对16个浮点数进行计算;设Register1=Ingenic_simd512_loadfloatdata;其中,Ingenic_simd512_load为加载数据的SIMD指令;floatdata为输入的16个32bit单精度浮点数,Register1为寄存器1,将输入数据保存在寄存器Register1里;S2.将Register1里的数据使用SIMD指令求出平方根倒数,设Register2=Ingenic_simd512_rsqrtRegister1这里Ingenic_simd512_rsqrt为求出平方根倒数的方法名,其表示能够涵盖求解平方根倒数的各步骤,结果保存在寄存器Register2中;所述Ingenic_simd512_rsqrt进一步包括:S2.1.将Register1里的数据进行直接逻辑右移1位操作,使用一条逻辑右移1位的SIMD指令,表示为:Register2=Ingenic_simd512_logical_shift_right_1_bitRegister1其中,Register1为操作数,Register1里的16个32bit单精度浮点数被同时执行逻辑右移1位操作,结果保存在表示为Register2的寄存器2里;S2.2.使用32bit的十六进制魔术数字0x5f3759df减去步骤S2.1的结果,得到平方根倒数的首次近似值,使用一条加载立即数的SIMD指令,表示为:Register3=Ingenic_simd512_load_immediate0x5f3759df,所述魔术数字0x5f3759df是整数,能够使用加载立即数指令;所述寄存器3Register3能够重复使用;将0x5f3759df加载到Register3里,该指令能够将一个32bit数据复制成16个32bit数据加载到一个512bit的寄存器里;使用一条整数减法的SIMD指令,表示为:Register2=Ingenic_simd512_int_subRegister3,Register2,将Register3里的16个32bit数据与步骤S2.1的结果相减,该指令能够同时完成16个减法操作,该步骤相减的两个操作数都为整数,所以使用整数相减指令,相减后的结果仍然保存在Register2里;S2.3.使用一条浮点数相乘的SIMD指令,即Register1里的16个浮点数与Register3里的16个浮点数对应相乘,表示为:Register4=Ingenic_simd512_float_mulRegister1,Register3将Register1里的数据与浮点数0.5相乘,需要先将0.5加载在Register3里,由于0.5是浮点数,不能使用加载立即数指令,只能使用普通加载指令,表示为:Register3=Ingenic_simd512_load0.5,加载完一个0.5后,使用一条repeat指令,所述repeat指令是一条复制数据的指令,表示为:Register3=Ingenic_simd512_repeatRegister3将一个32位浮点数0.5复制成16个32bit的浮点数保存在Register3里;此时相乘指令的两个操作数都为浮点数,所以使用浮点数相乘指令,结果保存在Register4里;再将32bit浮点数1.5以相同的方法加载到Register5里,表示为:Register5=Ingenic_simd512_load1.5Register5=Ingenic_simd512_repeatRegister5;该步骤得到的Register4和Register5结果为下面进行牛顿迭代法做准备;S2.4.进行第一次牛顿迭代法:使用浮点数相乘的SIMD指令:Ingenic_simd512_float_mul指令将S2.2的Register2里的数据与Register2里的数据相乘得到平方的结果,将结果保存在Register6里,再与Register4里的数据相乘,结果仍然保存在Register6里,再使用浮点数相减指令,即Register5里的16个浮点数减去Register6里对应的16个浮点数,表示为:Ingenic_simd512_float_sub指令,将Register5数据减去Register6数据,该指令两个操作数都是浮点数,所以使用浮点相减指令,结果保存在Register6里,再将Register6数据与Register2数据相乘,结果保存在Register2里;这里的寄存器存储的都是16个32bit的单精度浮点数,每条指令都是同时操作16个浮点数;表示为:Register6=Ingenic_simd512_float_mulRegister2,Register2;Register6=Ingenic_simd512_float_mulRegister4,Register6;Register6=Ingenic_simd512_float_subRegister5,Register6;Register2=Ingenic_simd512_float_mulRegister2,Register6;S2.5.为了达到实际应用精度的要求,需要根据需要进行n次牛顿迭代,即将步骤S2.4再重复进行n-1次;S3.将步骤S2中获得的平方根倒数乘以输入数据得到输入数据的算术平方根,设Register3=Ingenic_simd512_float_mulRegister1,Register2其中,Ingenic_simd512_float_mul为浮点相乘的SIMD指令,将寄存器Register2里的数据与寄存器Register1里的数据相乘,相乘后的结果保存在寄存器Register3里;S4.将计算结果从寄存器中保存到内存中。

全文数据:

权利要求:

百度查询: 北京君正集成电路股份有限公司 一种基于SIMD指令实现快速求解正数算术平方根的方法

免责声明
1、本报告根据公开、合法渠道获得相关数据和信息,力求客观、公正,但并不保证数据的最终完整性和准确性。
2、报告中的分析和结论仅反映本公司于发布本报告当日的职业理解,仅供参考使用,不能作为本公司承担任何法律责任的依据或者凭证。