CN117492969A - 一种基于simd指令实现的快速求解正数倒数的方法 - Google Patents
一种基于simd指令实现的快速求解正数倒数的方法 Download PDFInfo
- Publication number
- CN117492969A CN117492969A CN202210876523.7A CN202210876523A CN117492969A CN 117492969 A CN117492969 A CN 117492969A CN 202210876523 A CN202210876523 A CN 202210876523A CN 117492969 A CN117492969 A CN 117492969A
- Authority
- CN
- China
- Prior art keywords
- simd512
- data
- ingenic
- register2
- floating point
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 65
- 238000004364 calculation method Methods 0.000 claims abstract description 12
- 230000008569 process Effects 0.000 description 4
- 230000003993 interaction Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000012545 processing Methods 0.000 description 2
- 238000011161 development Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 238000012856 packing Methods 0.000 description 1
- 230000000630 rising effect Effects 0.000 description 1
- 239000002699 waste material Substances 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline or look ahead
- G06F9/3885—Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units
- G06F9/3887—Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units controlled by a single instruction for multiple data lanes [SIMD]
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Executing Machine-Instructions (AREA)
Abstract
本发明提供一种基于SIMD指令实现的快速求解正数倒数的方法,包括:S1.加载数据,是以32bit的整数倍加载,一个寄存器最多能够加载512bit数据;单精度浮点数为32bit,一个寄存器能够加载16个浮点数,所以一条SIMD指令能够同时对16个浮点数加载或计算,设Register1=Ingenic_simd512_load((float)data);Ingenic_simd512_load为加载数据的SIMD指令;(float)data为输入的16个32bit单精度浮点数,Register1为寄存器1,将输入数据保存在Register1里;S2.将Register1里的数据使用SIMD指令利用快速求解平方根倒数的方法求出平方根倒数,结果保存在Register2里;S3.将步骤S2里的平方根倒数平方即得到倒数,设Register3=Ingenic_simd512_float_mul(Register2,Register2);Ingenic_simd512_float_mul为浮点相乘的SIMD指令,将Register2里的数据与Register2里的数据相乘,即将Register2里的数据平方,相乘后的结果保存在Register3;S4.将计算结果从寄存器中保存到内存中。
Description
技术领域
本发明属于多媒体计算技术领域,特别涉及一种基于SIMD指令实现的快速求解正数倒数的方法。
背景技术
随着互联网的普及,图片、音频、视频等多媒体应用迅速崛起,为应对多媒体领域密集的计算需求,对处理器硬件计算能力的需求越来越高。而传统的通过提高主频和增加硬件流水线级数来提升计算能力的方式逐渐达到极限,硬件设计者们开始考虑通过并行手段来提高计算能力,于是出现了多机结构、多核结构、SIMD结构等。其中,SIMD全称SingleInstruction Multiple Data,单指令多数据流,是一种能高效实现并行处理的扩展指令集,能够一次处理多个操作数,并把它们打包在大型寄存器的一组指令集。
此外,在常用的算法中包含各种数学逻辑、函数运算等内容,其中,倒数在数学上指两个数之间的一种关系,当数学上设一个数x与其相乘的积为1的数,记为1/x或x,过程为“乘法逆”,除了0以外的数都存在倒数,两个乘积是1的数互为倒数,0没有倒数。在数学中,要求出一个正数的倒数,只需用1除以这个数即可(前提是这个数不为0,否则这个计算过程无意义),如10的倒数就是1/10,也就是0.1。
随着集成电路技术的发展,很多芯片厂商也都开发自己的芯片。而在芯片应用中,在各自的芯片设计中也会产生各自的问题。在一些资源有限的平台和芯片上也需要计算正数的倒数,比如北京君正集成电路股份有限公司(简称:北京君正)的t40芯片计算正数的倒数时需要用到C语言的以1为被除数的除法。现有技术中,C语言的求正数倒数的方法即以1为被除数的除法一次只能处理一个数据,造成缓存浪费,数据交互时间长造成运算速度慢,对于一些硬件资源有限的平台或芯片比如北京君正的t40芯片,运行这种方法处理大量连续数据时熟读较慢,不适合在一些要求运算速度的场合使用。在其上直接使用C程序速度慢,不合理的使用有限的指令导致运行时间很慢。
此外,现有技术中涉及到的技术术语:
牛顿迭代法:又称为牛顿-拉夫逊(拉弗森)方法,它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。
设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次近似值,上式称为牛顿迭代公式。
发明内容
为了解决上述问题,本申请的目的在于:使用SIMD指令以及快速求解平方根倒数的方法以实现快速求解正数倒数。
具体地,本发明提供一种基于SIMD指令实现的快速求解正数倒数的方法,所述方法包括如下步骤:
S1.加载数据,是以32bit的整数倍加载,一个寄存器最多能够加载512bit数据;单精度浮点数为32bit,一个寄存器能够加载16个浮点数,所以一条SIMD指令能够同时对16个浮点数进行加载或计算,设
Register1=Ingenic_simd512_load((float)data);
Ingenic_simd512_load为加载数据的SIMD指令;(float)data为输入的16个32bit单精度浮点数,Register1为寄存器1,将输入数据保存在Register1里;
S2.将Register1里的数据使用SIMD指令利用快速求解平方根倒数的方法求出平方根倒数,设
Register2=Ingenic_simd512_rsqrt(Register1)
这里Ingenic_simd512_rsqrt为快速求解平方根倒数的方法名,其表示能够涵盖求解平方根倒数方法各个步骤,将这些步骤合一起命名为Ingenic_simd512_rsqrt,结果保存在Register2里;
S3.将步骤S2里的平方根倒数平方即得到倒数,设
Register3=Ingenic_simd512_float_mul(Register2,Register2);
Ingenic_simd512_float_mul为浮点相乘的SIMD指令,将Register2里的数据与Register2里的数据相乘,即将Register2里的数据平方,相乘后的结果保存在Register3里;
S4:将计算结果从寄存器中保存到内存中。
所述快速求解平方根倒数的方法,进一步包括:
S2.1.将Register1里的数据进行直接逻辑右移1位操作,
使用一条逻辑右移1位的SIMD指令,设为:
Register2=Ingenic_simd512_logical_shift_right_1_bit(Register1)Register1为操作数,Register1里的16个32bit单精度浮点数被同时执行逻辑右移1位操作,结果保存在表示为Register2的寄存器2里;S2.2.使用32bit的十六进制魔术数字0x5f3759df减去步骤S2.1的结果,得到平方根倒数的首次近似值,使用一条加载立即数的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.1的结果相减,该指令能够同时完成16个减法操作,该步骤相减的两个操作数都为整数,所以使用整数相减指令,相减后的结果仍然保存在Register2里;
S2.3.使用一条浮点数相乘的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(Register5);
该步骤得到的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_mul(Register2,Register2);
Register6=Ingenic_simd512_float_mul(Register4,Register6);
Register6=Ingenic_simd512_float_sub(Register5,Register6);
Register2=Ingenic_simd512_float_mul(Register2,Register6);
S2.5.为了达到实际应用精度的要求,需要根据需要进行n次牛顿迭代,即将步骤S2.4再重复进行(n-1)次。
所述步骤S2.1中,所述将Register1里的数据进行直接逻辑右移1位操作能够达到c语言中先将浮点数取为整数再进行逻辑右移1位操作的结果。
所述步骤S2.2中,所述魔术数字0x5f3759df是整数,能够使用加载立即数指令;所述寄存器3Register3能够重复使用。
所述步骤S2.5中,当n=3时,能够进行三次牛顿迭代,将步骤S2.4再重复进行两次,表示为:
第二次牛顿迭代:
Register6=Ingenic_simd512_float_mul(Register2,Register2);
Register6=Ingenic_simd512_float_mul(Register4,Register6);
Register6=Ingenic_simd512_float_sub(Register5,Register6);
Register2=Ingenic_simd512_float_mul(Register2,Register6);
第三次牛顿迭代:
Register6=Ingenic_simd512_float_mul(Register2,Register2);
Register6=Ingenic_simd512_float_mul(Register4,Register6);
Register6=Ingenic_simd512_float_sub(Register5,Register6);
Register2=Ingenic_simd512_float_mul(Register2,Register6)。
所述步骤S4中,设为
Result=Ingenic_simd512_store(Register3)
Ingenic_simd512_store为数据保存指令,将寄存器Register3里的16个数据保存到能够存放16个数据的Result内存中。
所述方法只能计算正数的倒数。
由此,本申请的优势在于:本方法可以提高缓存利用率,一次性加载多个数据,尽可能的利用缓存空间,减少硬盘或内存与缓存之间数据交互的次数,从而大大提高了运算速度,占用少量资源,在硬件资源有限的情况下也能高效运行。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,并不构成对本发明的限定。
图1是本发明方法的流程示意图。
具体实施方式
为了能够更清楚地理解本发明的技术内容及优点,现结合附图对本发明进行进一步的详细说明。
本方法使用了使用SIMD指令实现快速求解平方根倒数的方法,由于快速求解平方根倒数的输入数据只能是正数,所以本方法中也只能计算正数的倒数。
如图1所示,使用SIMD指令实现快速求解正数倒数的方法一共包括如下步骤:
S1.加载数据,是以32bit的整数倍加载,一个寄存器最多可以加载512bit数据。单精度浮点数为32bit,一个寄存器可以加载16个浮点数,所以一条SIMD指令可以同时对16个浮点数进行计算。Ingenic_simd512_load为加载数据的SIMD指令;(float)data为输入的16个32bit单精度浮点数,Register1为寄存器1,将输入数据保存在Register1里。
Register1=Ingenic_simd512_load((float)data)
S2.将Register1里的数据使用快速求解平方根倒数的方法求出平方根倒数,Ingenic_simd512_rsqrt为快速求解平方根倒数的方法名,结果保存在Register2里。
Register2=Ingenic_simd512_rsqrt(Register1)
S3.将S2步里的平方根倒数平方即得到倒数,Ingenic_simd512_float_mul为浮点相乘的SIMD指令,将Register2里的数据与Register2里的数据相乘,即将Register2里的数据平方,相乘后的结果保存在Register3里。
Register3=Ingenic_simd512_float_mul(Register2,Register2)。S4:将计算结果从寄存器中保存到内存中。
Result=Ingenic_simd512_store(Register3)
Ingenic_simd512_store为数据保存指令,将寄存器Register3里的16个数据保存到能够存放16个数据的Result内存中。
所述步骤S2中,所述快速求解平方根倒数的方法,进一步包括:S2.1.将Register1里的数据进行直接逻辑右移1位操作,
使用一条逻辑右移1位的SIMD指令,设为:
Register2=Ingenic_simd512_logical_shift_right_1_bit(Register1)Register1为操作数,Register1里的16个32bit单精度浮点数被同时执行逻辑右移1位操作,结果保存在表示为Register2的寄存器2里;所述步骤S2.1中,所述将Register1里的数据进行直接逻辑右移1位操作能够达到c语言中先将浮点数取为整数再进行逻辑右移1位操作的结果;
S2.2.使用32bit的十六进制魔术数字0x5f3759df减去步骤S2.1的结果,得到平方根倒数的首次近似值,使用一条加载立即数的SIMD指令,设为:Register3=Ingenic_simd512_load_immediate(0x5f3759df),将0x5f3759df加载到Register3里,该指令能够将一个32bit数据复制成16个32bit数据加载到一个512bit的寄存器里;
所述魔术数字0x5f3759df是整数,能够使用加载立即数指令;所述寄存器3Register3能够重复使用;
使用一条整数减法的SIMD指令,表示为:
Register2=Ingenic_simd512_int_sub(Register3,Register2),将Register3里的16个32bit数据与步骤S2.1的结果相减,该指令能够同时完成16个减法操作,该步骤相减的两个操作数都为整数,所以使用整数相减指令,相减后的结果仍然保存在Register2里;
S2.3.使用一条浮点数相乘的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(Register5);
该步骤得到的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_mul(Register2,Register2);
Register6=Ingenic_simd512_float_mul(Register4,Register6);
Register6=Ingenic_simd512_float_sub(Register5,Register6);
Register2=Ingenic_simd512_float_mul(Register2,Register6);
S2.5.为了达到实际应用精度的要求,需要根据需要进行n次牛顿迭代,即将步骤S2.4再重复进行(n-1)次;
其中,若n=3时,能够进行三次牛顿迭代,将步骤S2.4再重复进行两次,表示为:
第二次牛顿迭代:
Register6=Ingenic_simd512_float_mul(Register2,Register2);
Register6=Ingenic_simd512_float_mul(Register4,Register6);
Register6=Ingenic_simd512_float_sub(Register5,Register6);
Register2=Ingenic_simd512_float_mul(Register2,Register6);
第三次牛顿迭代:
Register6=Ingenic_simd512_float_mul(Register2,Register2);
Register6=Ingenic_simd512_float_mul(Register4,Register6);
Register6=Ingenic_simd512_float_sub(Register5,Register6);
Register2=Ingenic_simd512_float_mul(Register2,Register6)。
本方法计算精度与速度说明:
将C语言的求解正数倒数方法作为参考,在相同输入数据前提下,使用公式(1)得到本方法计算结果与C语言方法计算结果之间的精度损失,精度仅损失了0.00001%,达到实际应用的精度需求,本方法计算速度是C语言的28倍。
Precision_loss=(C_result-SIMD_result)/C_result公式(1)
公式(1)中,Precision_loss表示精度损失计算结果,C_result为C语言的正数倒数方法计算结果,SIMD_result为本方法计算结果。
综上所述,本申请方法在于:
1.使用北京君正T40芯片支持的Ingenic_simd512的SIMD指令集计算正数的倒数,提高缓存利用率,资源消耗少,计算速度是C语言计算正数的倒数方法的28倍,可以在硬件资源有限的平台上高效运行。
2.由于北京君正T40芯片支持的Ingenic_simd512的SIMD指令集没有除法指令,不能利用除法来求解正数的倒数,本方法使用SIMD指令实现快速求解平方根倒数的方法先求输入正数的平方根倒数,再将结果平方就得到了正数的倒数。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明实施例可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (7)
1.一种基于SIMD指令实现的快速求解正数倒数的方法,其特征在于,所述方法包括如下步骤:
S1.加载数据,是以32bit的整数倍加载,一个寄存器最多能够加载512bit数据;单精度浮点数为32bit,一个寄存器能够加载16个浮点数,所以一条SIMD指令能够同时对16个浮点数进行加载或计算,设
Register1=Ingenic_simd512_load((float)data);
其中,Ingenic_simd512_load为加载数据的SIMD指令;(float)data为输入的16个32bit单精度浮点数,Register1为寄存器1,将输入数据保存在Register1里;
S2.将Register1里的数据使用SIMD指令利用快速求解平方根倒数的方法求出平方根倒数,设
Register2=Ingenic_simd512_rsqrt(Register1)
这里Ingenic_simd512_rsqrt为快速求解平方根倒数的方法名,其表示能够涵盖求解平方根倒数方法各个步骤,将这些步骤合在一起命名为Ingenic_simd512_rsqrt,结果保存在Register2里;
S3.将步骤S2里的平方根倒数平方即得到倒数,设
Register3=Ingenic_simd512_float_mul(Register2,Register2);
其中,Ingenic_simd512_float_mul为浮点相乘的SIMD指令,将Register2里的数据与Register2里的数据相乘,即将Register2里的数据平方,相乘后的结果保存在Register3里;
S4.将计算结果从寄存器中保存到内存中。
2.根据权利要求1所述的一种基于SIMD指令实现的快速求解正数倒数的方法,其特征在于,所述步骤S2的快速求解平方根倒数的方法,进一步包括:
S2.1.将Register1里的数据进行直接逻辑右移1位操作,使用一条逻辑右移1位的SIMD指令,设为:
Register2=Ingenic_simd512_logical_shift_right_1_bit(Register1)
其中,Register1为操作数,Register1里的16个32bit单精度浮点数被同时执行逻辑右移1位操作,结果保存在表示为Register2的寄存器2里;
S2.2.使用32bit的十六进制魔术数字0x5f3759df减去步骤S2.1的结果,得到平方根倒数的首次近似值,使用一条加载立即数的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.1的结果相减,该指令能够同时完成16个减法操作,该步骤相减的两个操作数都为整数,所以使用整数相减指令,相减后的结果仍然保存在Register2里;
S2.3.使用一条浮点数相乘的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(Register5);
该步骤得到的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_mul(Register2,Register2);
Register6=Ingenic_simd512_float_mul(Register4,Register6);
Register6=Ingenic_simd512_float_sub(Register5,Register6);
Register2=Ingenic_simd512_float_mul(Register2,Register6);
S2.5.为了达到实际应用精度的要求,需要根据需要进行n次牛顿迭代,即将步骤S2.4再重复进行(n-1)次。
3.根据权利要求2所述的一种基于SIMD指令实现的快速求解正数倒数的方法,其特征在于,所述步骤S2.1中,所述将Register1里的数据进行直接逻辑右移1位操作能够达到C语言中先将浮点数取为整数再进行逻辑右移1位操作的结果。
4.根据权利要求3所述的一种基于SIMD指令实现的快速求解正数倒数的方法,其特征在于,所述步骤S2.2中,所述魔术数字0x5f3759df是整数,能够使用加载立即数指令;所述寄存器3Register3能够重复使用。
5.根据权利要求4所述的一种基于SIMD指令实现的快速求解正数倒数的方法,其特征在于,所述步骤S2.5中,当n=3时,能够进行三次牛顿迭代,将步骤S2.4再重复进行两次,表示为:
第二次牛顿迭代:
Register6=Ingenic_simd512_float_mul(Register2,Register2);
Register6=Ingenic_simd512_float_mul(Register4,Register6);
Register6=Ingenic_simd512_float_sub(Register5,Register6);
Register2=Ingenic_simd512_float_mul(Register2,Register6);
第三次牛顿迭代:
Register6=Ingenic_simd512_float_mul(Register2,Register2);
Register6=Ingenic_simd512_float_mul(Register4,Register6);
Register6=Ingenic_simd512_float_sub(Register5,Register6);
Register2=Ingenic_simd512_float_mul(Register2,Register6)。
6.根据权利要求1所述的一种基于SIMD指令实现的快速求解正数倒数的方法,其特征在于,所述步骤S4中,设为
Result=Ingenic_simd512_store(Register3)
Ingenic_simd512_store为数据保存指令,将寄存器Register3里的16个数据保存到能够存放16个数据的Result内存中。
7.根据权利要求1所述的一种基于SIMD指令实现的快速求解正数倒数的方法,其特征在于,所述方法只能计算正数的倒数。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210876523.7A CN117492969A (zh) | 2022-07-25 | 2022-07-25 | 一种基于simd指令实现的快速求解正数倒数的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210876523.7A CN117492969A (zh) | 2022-07-25 | 2022-07-25 | 一种基于simd指令实现的快速求解正数倒数的方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117492969A true CN117492969A (zh) | 2024-02-02 |
Family
ID=89681496
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210876523.7A Pending CN117492969A (zh) | 2022-07-25 | 2022-07-25 | 一种基于simd指令实现的快速求解正数倒数的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117492969A (zh) |
-
2022
- 2022-07-25 CN CN202210876523.7A patent/CN117492969A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Zhang et al. | Efficient multiple-precision floating-point fused multiply-add with mixed-precision support | |
TWI529613B (zh) | 一種用於可降低浮點運算功率之電腦實施方法及算術子系統 | |
JP3869269B2 (ja) | 単一サイクルにおける乗算累算演算の処理 | |
US7694112B2 (en) | Multiplexing output from second execution unit add/saturation processing portion of wider width intermediate result of first primitive execution unit for compound computation | |
US8341204B2 (en) | Vector SIMD processor | |
US7912883B2 (en) | Exponent processing systems and methods | |
JPH10124484A (ja) | データプロセッサ及びデータ処理システム | |
JP2002108606A (ja) | スティッキービット生成回路及び乗算器 | |
US8069200B2 (en) | Apparatus and method for implementing floating point additive and shift operations | |
US6341300B1 (en) | Parallel fixed point square root and reciprocal square root computation unit in a processor | |
CN105045560A (zh) | 一种定点乘加运算方法和装置 | |
US5341320A (en) | Method for rapidly processing floating-point operations which involve exceptions | |
Gerwig et al. | The IBM eServer z990 floating-point unit | |
WO2000045253A1 (en) | Division unit in a processor using a piece-wise quadratic approximation technique | |
Lee et al. | AIR: Iterative refinement acceleration using arbitrary dynamic precision | |
Schulte et al. | A variable-precision interval arithmetic processor | |
KR101073343B1 (ko) | 개선된 감소 트리 회로를 갖는 부스 곱셈기 | |
CN117492969A (zh) | 一种基于simd指令实现的快速求解正数倒数的方法 | |
US20040117423A1 (en) | Signed integer long division apparatus and methods for use with processors | |
CN111596886A (zh) | 混合矩阵乘法流水线 | |
CN118519684A (zh) | 一种基于simd指令实现快速求解正数算术平方根的方法 | |
TWI258698B (en) | Static floating-point processor suitable for embedded digital signal processing and shift control method thereof | |
Knöfel | A hardware kernel for scientific/engineering computations | |
Schulte et al. | A software interface and hardware design for variable-precision interval arithmetic | |
CN115904503A (zh) | 一种使用simd指令提高缓存利用率的方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |