CN116414461A - 一种基于simd指令的线性插值算法的优化方法 - Google Patents
一种基于simd指令的线性插值算法的优化方法 Download PDFInfo
- Publication number
- CN116414461A CN116414461A CN202111648459.9A CN202111648459A CN116414461A CN 116414461 A CN116414461 A CN 116414461A CN 202111648459 A CN202111648459 A CN 202111648459A CN 116414461 A CN116414461 A CN 116414461A
- Authority
- CN
- China
- Prior art keywords
- word
- linear interpolation
- instruction
- simd
- halfword
- 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
- 238000004422 calculation algorithm Methods 0.000 title claims abstract description 92
- 238000000034 method Methods 0.000 title claims abstract description 42
- 238000005457 optimization Methods 0.000 title claims abstract description 11
- 238000013461 design Methods 0.000 claims description 5
- 230000009471 action Effects 0.000 claims description 3
- 238000013500 data storage Methods 0.000 claims description 3
- 230000006870 function Effects 0.000 description 11
- 230000008901 benefit Effects 0.000 description 5
- 230000008569 process Effects 0.000 description 5
- 238000012545 processing Methods 0.000 description 4
- 238000004364 calculation method Methods 0.000 description 2
- 238000010586 diagram Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 238000011160 research Methods 0.000 description 2
- 238000013473 artificial intelligence Methods 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 238000007620 mathematical function Methods 0.000 description 1
- 230000008520 organization Effects 0.000 description 1
- 238000012856 packing Methods 0.000 description 1
- 239000013598 vector Substances 0.000 description 1
Images
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/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]
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F17/00—Digital computing or data processing equipment or methods, specially adapted for specific functions
- G06F17/10—Complex mathematical operations
- G06F17/11—Complex mathematical operations for solving equations, e.g. nonlinear equations, general mathematical optimization problems
- G06F17/12—Simultaneous equations, e.g. systems of linear equations
-
- 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/30003—Arrangements for executing specific machine instructions
- G06F9/30007—Arrangements for executing specific machine instructions to perform operations on data operands
- G06F9/30032—Movement instructions, e.g. MOVE, SHIFT, ROTATE, SHUFFLE
Landscapes
- Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Mathematical Physics (AREA)
- Mathematical Optimization (AREA)
- Mathematical Analysis (AREA)
- Computational Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- Pure & Applied Mathematics (AREA)
- Data Mining & Analysis (AREA)
- Operations Research (AREA)
- Algebra (AREA)
- Databases & Information Systems (AREA)
- Advance Control (AREA)
Abstract
本发明提供一种基于simd指令的线性插值算法的优化方法,包括:S1,基于simd指令的srlriw vrd,vrs,imm指令:将vrs右移并舍入,将最终结果更新到vrd;将vrs中的每个word右移imm所指定的位数,将零插入空的高阶位,然后将移位结果与word的最后一位相加并将结果更新到vrd中的对应的word;S2,线性插值算法的优化:S2.1,16组用于线性插值的值a以halfword的形式存放在simd寄存器vr1中每个word的低半halfword;S2.2,16组线性插值算法的y0值以halfword形式存放在simd寄存器vr2中每个word的低半halfword,16组线性插值算法的y1值以halfword形式存放在simd寄存器vr4中每个word的低半halfword;S2.3,最终计算出的16组线性插值算法的结果以halfword形式保存在simd寄存器vr2中每个word的低半halfword;S2.4,同时进行16组数据的线性插值运算。
Description
技术领域
本发明涉及数据处理技术领域,特别涉及一种基于simd指令的线性插值算法的优化方法。
背景技术
随着互联网、人工智能的发展,大量的数学算法被发明出来,日益复杂的数学算法给处理器带来了严重的运算负担。针对这一问题,硬件设计者为处理器设计了simd扩展指令,即一条指令实现多数据流操作,simd扩展指令大大提高了处理器在大量数据运算时的执行速度。
simd全称single instruction multiple data,单指令多数据流,能够复制多个操作数,并把他们打包在大型寄存器的一组指令集。以加法指令为例,单指令单数据的CPU对加法指令译码后,执行部件先访问内存,取得第一个操作数;之后再一次访问内存,取得第二个操作数;随后才能进行求和运算。而在支持simd扩展的CPU中,指令译码后几个执行部件同时访问内存,一次性获得所有操作数进行运算。这个特点使simd特别适合于多媒体应用等数据密集型运算。
simd技术:simd全称Single Instruction Multiple Data,单指令多数据流。是一种采用一个控制器来控制多个处理器,同时对一组数据(又称“数据向量”)中的每一个分别执行相同的操作从而实现空间上的并行性的技术。在图像处理过程中,由于图像的数据常用的数据类型是RGB565,RGBA8888,YUV422等格式,这些格式的数据特点是一个像素点的一个分量总是用小于等于8bit的数据表示的。如果使用传统的处理器做计算,虽然处理器的寄存器是32位或是64位的,处理这些数据却只能用于他们的低8位,效率太低。如果把64位寄存器拆成8个8位寄存器就能同时完成8个操作,计算效率提升了8倍。这就是simd指令的核心思想。
线性插值法:线性插值是指插值函数为一次多项式的插值方式,其在插值节点上的插值误差为零。线性插值相比其他插值方式,如抛物线插值,具有简单、方便的特点。线性插值的几何意义即为概述图中利用过A点和B点的直线来近似表示原函数。
如图1所示,假设已知坐标A(x0,y0)与B(x1,y1),要得到[x0,x1]区间内某一位置x在直线上的值。根据图中所示,得到:
(y-y0)/(x-x0)=(y1-y0)/(x1-x0)
由于x已知,所以可从公式得到y的值:
y=y0+(x-x0)*(y1-y0)/(x1-x0)
=y0+{(x-x0)*y1-(x-x0)*y0}/(x1-x0)
=y0*(x1-x)/(x1-x0)+y1*(x-x0)/(x1-x0)
设定x1-x0=65536*k(即将x0到x1之间65536等分。65536等分是由于65536在计算机中占16bit即halfword,这样的数据形式在本算法中便于组织与算法设计),x-x0=a*k。则x1-x=(65536-a)*k。
将上式化简得:y={y0*(65536-a)+y1*a}/65536
其中a为x在(x0,x1)中所占的权重,a越大x越靠近x1,a越小x越靠近x0。y0,y1为两个相邻值。
在CPU支持simd指令情况下,越来越多的算法需要针对CPU的架构特点进行改进从而充分提高算法的执行速度。在各种数学算法中,存在着大量且复杂的数学函数,如exp函数。此类函数在计算机中是采用泰勒公式进行等效计算的。即
而此类公式的特点就是公式复杂,运算量大,指令相关性大,这就导致了在此类算法内部无法使用simd指令优化。处理器计算这类函数将花费几十上百个周期,而对计算速度要求极为苛刻的今天,这样的时间消耗实在令人难以满意。
为了解决此类问题,在某些对算法精度要求不是很高的场景下,算法开发者提出了采用线性插值算法以替代原有的复杂算法。
然而,现有技术中存在如下缺陷:
1.传统的线性插值算法是采用单指令单数据指令实现的,采用此种算法的在执行过程中消耗的周期数较多,速度较慢。
2.虽然目前存在利用simd指令对线性插值算法进行改进,但是普遍采用普通的simd指令进行大量逻辑操作实现的线性插值算法,虽然也能提高线性插值算法的执行速度,但是额外开销很大,得到的收益很小。
此外,现有技术的术语包括:
simd:指令流多数据流(single instruction multiple data),是一种能高效实现并行处理的扩展指令集。
exp函数:高等数学里以自然常数e为底的指数函数。
指令相关性:在程序运行中,等前一条指令执行完成后,才能执行下一条指令,那么这两条指令是相关的。
发明内容
为了解决上述问题,本申请的目的在于:基于对传统的线性插值算法进行研究,结合simd指令单指令多数据的优势,对线性插值算法创新地进行改进,消除了算法在执行过程中的额外开销,提高了算法的并行能力。优化后相比传统的线性插值算法,大幅提升处理器执行该算法的速度。
具体地,本发明提供一种基于simd指令的线性插值算法的优化方法,所述方法包括:
S1,16组用于线性插值的值a以半字halfword的形式存放在simd寄存器vr1中每个word的低半halfword;
S2,16组线性插值算法的y0值以halfword形式存放在simd寄存器vr2中每个word的低半halfword,16组线性插值算法的y1值以halfword形式存放在simd寄存器vr4中每个word的低半halfword;
S3,最终计算出的16组线性插值算法的结果以halfword形式保存在simd寄存器vr2中每个word的低半halfword;
S4,同时进行16组数据的线性插值运算:
所述线性插值算法流程:
S4.1,初始化;
S4.2,通过a的值计算65536-a的值;
S4.3,获取y0、y1的值;
S4.4,根据公式y={y0*(65536-a)+y1*a}/65536计算出最终值;
其中,假设已知坐标A(x0,y0)与B(x1,y1),公式y表示在[x0,x1]区间内某一位置x在直线上的值;a为x在[x0,x1]区间中所占的权重,a越大x越靠近x1,a越小x越靠近x0;y0,y1为两个相邻值。
所述方法中采用的simd指令如下:
subh vrd vrs vrp指令:该条指令的作用将vrs中的每个halfword其有符号元素减去vrp中的每个halfword其有符号元素并将结果更新到vrd的对应的halfword;
smulhe vrd vrs vrp指令:该条指令的作用是将vrs的偶数halfword其有符号元素乘以vrp的偶数halfword其有符号元素,并将结果更新到vrd中的word;
addw vrd vrs vrp指令:该条指令的作用是将vrs中的每个word加上vrp中的每个word并将结果更新到vrd的对应的word;
srlriw vrd vrs imm指令:该条指令的作用是将vrs右移并舍入,将最终结果更新到vrd;
其具体设计说明:将vrs中的每个word右移imm所指定的位数,将零插入空的高阶位,然后将移位结果与word的最后一位相加并将结果更新到vrd中的对应的word;
上述指令中,
vrp:simd指令中的一号源操作数;
vrs:simd指令中的二号源操作数;
vrd:simd指令中目的操作数;
imm:simd指令中的立即数;
bit:位,数据存储的最小单位;
word:字,长度为32bit;
halfword:半字,长度为16bit;
byte:字节,长度为8bit。
所述方法采用simd指令宽度为512bit,共包含32个寄存器,使用vr0~vr31表示;
vrx[](W):32个512bit simd寄存器中第x个寄存器按word进行分割后,对其每个单元进行操作,(x∈[0,31]);
vrx[](H):32个512bit simd寄存器中第x个寄存器按halfword进行分割后,对其每个单元进行操作,(x∈[0,31]);
vrx[2i](H):32个512bit simd寄存器中第x个寄存器中按halfword进行分割后,对其中的偶数单元进行操作,(x∈[0,31])(i∈[0,15])。
所述步骤S4进一步包括:
S4.1:初始化算法所需的simd寄存器;
寄存器vr12:每个word中存65536;
即vr12每个word用于存储65536,由于S4.2中要计算65536-a,对应于simd减法指令subh vrd,vrs,vrp,而subh的所有操作数都是寄存器,所以将65536装载进vr12寄存器;
S4.2:计算线性插值算法设定的a的值和65536-a的值;
其中vr1[2i](H)即a的值;
vr5[](H)=vr12[](H)-vr1[](H)其中vr5[2i](H)即65536-a的值;
执行subh vr5,vr12,vr3指令:将vr12中的每个halfword减去vr3中对应的halfword,并将结果更新至vr5;
S4.3:获取线性插值算法设定的y0的值和y1的值;
其中vr2[2i](H)即y0的值;
其中vr4[2i](H)即y1的值;
S4.4:根据上面所述的线性插值公式计算所求得y的值:
vr2[](W)=vr5[2i](H)*vr2[2i](H);
执行smulhe vr2,vr2,vr5指令:将vr2中的每个偶数有符号halfword乘以vr5中对应的halfword,并将结果更新vr2中对应的word;
vr4[](W)=vr3[2i](H)*vr4[2i](H);
执行smulhe vr4,vr4,vr3指令:将vr4中的每个偶数有符号halfword乘以vr3中对应的halfword,并将结果更新vr4中对应的word;
vr2[](W)=vr2[](W)+vr4[](W);
执行addw vr2,vr2,vr4指令:将vr2中的每个word与vr4中的对应的word相加,并将结果更新vr2中的对应word;
vr2[](W)=vr2[](W)>>16;
执行srlriw vr2,vr2,16指令:将vr2中的每个word右移16位,向空的高阶位插入零,然后将移位结果与移开的元素的最后一位相加,并将最终舍入结果更新vr2中的对应word。
所述步骤S4.3中,y0和y1的值能够作为本算法的输入参数直接给出,或由查表法查出。
所述步骤S4.4中,
vr2[](W)=vr5[2i](H)*vr2[2i](H)对应线性插值法公式:
vr2=(65536-a)*y0;
vr4[](W)=vr3[2i](H)*vr4[2i](H)对应线性插值法公式:
vr4=a*y1;
vr2[](W)=vr2[](W)+vr4[](W)对应线性插值法公式:
vr2=y0*(65536-a)+y1*a;
vr2[](W)=vr2[](W)>>16对应线性插值法公式:
y={y0*(65536-a)+y1*a}/65536。
所述方法设定的应用场景为:
1>.线性插值算法的y0,y1的数据长度不大于16bits;
2>.线性插值算法中的值a∈[0,65535];
3>.最多同时完成16组数据的线性插值运算。
所述方法能够同时完成同时查16bits数据的操作。
由此,本申请的优势在于:针对线性插值算法的特点,利用simd指令改良了线性插值算法,大幅提高了算法的执行速度,并且能实现同时进行多组线性插值算法的运算。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,并不构成对本发明的限定。
图1是本申请线性插值算法的示意图。
图2是本申请方法中线性插值算法的流程示意图。
图3是本申请涉及方法的示意图。
具体实施方式
为了能够更清楚地理解本发明的技术内容及优点,现结合附图对本发明进行进一步的详细说明。
传统的线性插值算法根据线性插值法公式,采用单指令单数据指令编写合适的指令序列。本发明根据线性插值算法的特点,发挥simd指令的单指令多数据的优势创新地对线性插值算法进行改进,大幅度提高线性插值算法的并行度和执行效率。
本申请中涉及的代码、指令和术语如下:
vrp:simd指令中的一号源操作数;
vrs:simd指令中的二号源操作数;
vrd:simd指令中目的操作数;
imm:simd指令中的立即数;
bit:位,数据存储的最小单位;
word:字,长度为32bit;
halfword:半字,长度为16bit;
byte:字节,长度为8bit。
本申请采用simd指令宽度为512bit,共包含32个寄存器,使用vr0~vr31表示。
vrx[](W):32个512bit simd寄存器中第x个寄存器按word进行分割后,对其每个单元进行操作,(x∈[0,31]);
vrx[](H):32个512bit simd寄存器中第x个寄存器按halfword进行分割后,对其每个单元进行操作,(x∈[0,31]);
vrx[2i](H):32个512bit simd寄存器中第x个寄存器中按halfword进行分割后,对其中的偶数单元进行操作,(x∈[0,31])(i∈[0,15])。
本申请涉及一种基于simd指令的线性插值算法的优化方法:
(1)线性插值算法中所使用的指令介绍:
subh vrd vrs vrp该条指令的作用将vrs中的每个halfword(有符号元素)减去vrp中的每个halfword(有符号元素)并将结果更新到vrd的对应的halfword。
smulhe vrd vrs vrp该条指令的作用是将vrs的偶数halfword(有符号元素)乘以vrp的偶数halfword(有符号元素),并将结果更新到vrd中的word。addw vrd vrs vrp该条指令的作用是将vrs中的每个word加上vrp中的每个word并将结果更新到vrd的对应的word。
srlriw vrd,vrs,imm该条指令的作用是将vrs右移并舍入,将最终结果更新到vrd。
其具体设计说明如下:将vrs中的每个word右移imm所指定的位数,将零插入空的高阶位,然后将移位结果与word的最后一位相加并将结果更新到vrd中的对应的word。
(2)线性插值算法流程图:如图2所示。
(3)线性插值适用场景:
1.线性插值算法的y0,y1的数据在计算机中长度不大于16bits;
2.线性插值算法中的a∈[0,65535];
3.最多同时完成16组数据的线性插值运算;
(4)线性插值法原理详述:
设定应用场景:
1.16组用于线性插值的值a以halfword的形式存放在simd寄存器vr1中每个word的低半halfword;
2.16组线性插值算法的y0值以halfword形式存放在simd寄存器vr2中每个word的低半halfword,16组线性插值算法的y1值以halfword形式存放在simd寄存器vr4中每个word的低半halfword;
3.最终计算出的16组线性插值算法的结果以halfword形式保存在simd寄存器vr2中每个word的低半halfword;
4.同时进行16组数据的线性插值运算;
具体实现步骤:
S1:初始化算法所需的simd寄存器。
vr12:每个word中存65536。
S2:计算线性插值算法设定的a的值和65536-a的值。
其中vr1[2i](H)即a的值。
vr5[](H)=vr12[](H)-vr1[](H)其中vr5[2i](H)即65536-a的值。
=>subh vr5,vr12,vr3:将vr12中的每个halfword减去vr3中对应的halfword,并将结果更新至vr5。
S3:获取线性插值算法设定的y0的值和y1的值(注意:y0和y1的值可由前面算法传递的,也可由查表法查出,本发明不关心y0、y1值的得出过程)。
其中vr2[2i](H)即y0的值;
其中vr4[2i](H)即y1的值。
S4:根据上面所述的线性插值公式计算所求得y的值。
vr2[](W)=vr5[2i](H)*vr2[2i](H)(对应线性插值法公式:vr2=(65536-a)*y0)=>smulhe vr2,vr2,vr5:将vr2中的每个偶数有符号halfword乘以vr5中对应的halfword,并将结果更新vr2中对应的word。
vr4[](W)=vr3[2i](H)*vr4[2i](H)(对应线性插值法公式:vr4=a*y1)
=>smulhe vr4,vr4,vr3:将vr4中的每个偶数有符号halfword乘以vr3中对应的halfword,并将结果更新vr4中对应的word。
vr2[](W)=vr2[](W)+vr4[](W)(对应线性插值法公式:vr2=y0*(65536-a)+y1*a)=>addw vr2,vr2,vr4:将vr2中的每个word与vr4中的对应的word相加,并将结果更新vr2中的对应word。
vr2[](W)=vr2[](W)>>16(对应线性插值法公式:y={y0*(65536-a)+y1*a}/65536)=>srlriw vr2,vr2,16:将vr2中的每个word右移16位,向空的高阶位插入零,然后将移位结果与移开的元素的最后一位相加,并将最终舍入结果更新vr2中的对应word。
综上所述,如图3所示,本申请所述方法可以描述如下,包括:
S1,16组用于线性插值的值a以半字halfword的形式存放在simd寄存器vr1中每个word的低半halfword;
S2,16组线性插值算法的y0值以halfword形式存放在simd寄存器vr2中每个word的低半halfword,16组线性插值算法的y1值以halfword形式存放在simd寄存器vr4中每个word的低半halfword;
S3,最终计算出的16组线性插值算法的结果以halfword形式保存在simd寄存器vr2中每个word的低半halfword;
S4,同时进行16组数据的线性插值运算:
S4.1:初始化算法所需的simd寄存器;
寄存器vr12:每个word中存65536;
即vr12每个word用于存储65536,由于S4.2中要计算65536-a,对应于simd减法指令subh vrd,vrs,vrp,而subh指令的所有操作数都是寄存器,所以将65536装载进vr12寄存器;
S4.2:计算线性插值算法设定的a的值和65536-a的值;
其中vr1[2i](H)即a的值;
vr5[](H)=vr12[](H)-vr1[](H)其中vr5[2i](H)即65536-a的值;
执行subh vr5,vr12,vr3指令:将vr12中的每个halfword减去vr3中对应的halfword,并将结果更新至vr5;
S4.3:获取线性插值算法设定的y0的值和y1的值;本申请方法并不需要关心y0、y1值的得出过程,y0和y1的值能够作为本算法的输入参数直接给出,也可由查表法查出:
其中vr2[2i](H)即y0的值;
其中vr4[2i](H)即y1的值;
S4.4:根据上面所述的线性插值公式计算所求得y的值:
vr2[](W)=vr5[2i](H)*vr2[2i](H),其对应线性插值法公式:
vr2=(65536-a)*y0;
执行smulhe vr2,vr2,vr5指令:将vr2中的每个偶数有符号halfword乘以vr5中对应的halfword,并将结果更新vr2中对应的word;
vr4[](W)=vr3[2i](H)*vr4[2i](H),其对应线性插值法公式:
vr4=a*y1;
执行smulhe vr4,vr4,vr3指令:将vr4中的每个偶数有符号halfword乘以vr3中对应的halfword,并将结果更新vr4中对应的word;
vr2[](W)=vr2[](W)+vr4[](W),其对应线性插值法公式:
vr2=y0*(65536-a)+y1*a;
执行addw vr2,vr2,vr4指令:将vr2中的每个word与vr4中的对应的word相加,并将结果更新vr2中的对应word;
vr2[](W)=vr2[](W)>>16,其对应线性插值法公式:
y={y0*(65536-a)+y1*a}/65536;
执行srlriw vr2,vr2,16指令:将vr2中的每个word右移16位,向空的高阶位插入零,然后将移位结果与移开的元素的最后一位相加,并将最终舍入结果更新vr2中的对应word。
所述方法能够同时完成同时查16bits数据的操作。
针对当前研究技术方案的缺陷与不足,本发明提出了采用simd指令对线性插值算法进行了优化,其关键点为:基于线性插值算法的原理,利用simd指令创新的改进的线性插值算法,可实现同时进行多组数据的线性插值运算,并且提高了线性插值运算的速度。特别是,基于simd指令改进的线性插值算法的指令序列。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明实施例可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (9)
1.一种基于simd指令的线性插值算法的优化方法,其特征在于,所述方法包括:
S1,16组用于线性插值的值a以半字halfword的形式存放在simd寄存器vr1中每个word的低半halfword;
S2,16组线性插值算法的y0值以halfword形式存放在simd寄存器vr2中每个word的低半halfword,16组线性插值算法的y1值以halfword形式存放在simd寄存器vr4中每个word的低半halfword;
S3,最终计算出的16组线性插值算法的结果以halfword形式保存在simd寄存器vr2中每个word的低半halfword;
S4,同时进行16组数据的线性插值运算:
所述线性插值算法流程:
S4.1,初始化;
S4.2,通过a的值计算65536-a的值;
S4.3,获取y0、y1的值;
S4.4,根据公式y={y0*(65536-a)+y1*a}/65536计算出最终值;
其中,假设已知坐标A(x0,y0)与B(x1,y1),公式y表示在[x0,x1]区间内某一位置x在直线上的值;a为x在[x0,x1]区间中所占的权重,a越大x越靠近x1,a越小x越靠近x0;y0,y1为两个相邻值。
2.根据权利要求1所述的一种基于simd指令的线性插值算法的优化方法,其特征在于,所述公式y={y0*(65536-a)+y1*a}/65536中,设定x1-x0=65536*k,即将x0到x1之间65536等分;65536等分是由于65536在计算机中占16bit即halfword,x-x0=a*k;则x1-x=(65536-a)*k。
3.根据权利要求2所述的一种基于simd指令的线性插值算法的优化方法,其特征在于,所述方法中采用的simd指令如下:
subh vrd vrs vrp指令:该条指令的作用将vrs中的每个halfword其有符号元素减去vrp中的每个halfword其有符号元素并将结果更新到vrd的对应的halfword;
smulhe vrd vrs vrp指令:该条指令的作用是将vrs的偶数halfword其有符号元素乘以vrp的偶数halfword其有符号元素,并将结果更新到vrd中的word;
addw vrd vrs vrp指令:该条指令的作用是将vrs中的每个word加上vrp中的每个word并将结果更新到vrd的对应的word;
srlriw vrd vrs imm指令:该条指令的作用是将vrs右移并舍入,将最终结果更新到vrd;
其具体设计说明:将vrs中的每个word右移imm所指定的位数,将零插入空的高阶位,然后将移位结果与word的最后一位相加并将结果更新到vrd中的对应的word;
上述指令中,
vrp:simd指令中的一号源操作数;
vrs:simd指令中的二号源操作数;
vrd:simd指令中目的操作数;
imm:simd指令中的立即数;
bit:位,数据存储的最小单位;
word:字,长度为32bit;
halfword:半字,长度为16bit;
byte:字节,长度为8bit。
4.根据权利要求3所述的一种基于simd指令的线性插值算法的优化方法,其特征在于,
所述方法采用simd指令宽度为512bit,共包含32个寄存器,使用vr0~vr31表示;
vrx[](W):32个512bit simd寄存器中第x个寄存器按word进行分割后,对其每个单元进行操作,x∈[0,31];
vrx[](H):32个512bit simd寄存器中第x个寄存器按halfword进行分割后,对其每个单元进行操作,x∈[0,31];
vrx[2i](H):32个512bit simd寄存器中第x个寄存器中按halfword进行分割后,对其中的偶数单元进行操作,x∈[0,31],i∈[0,15]。
5.根据权利要求3所述的一种基于simd指令的线性插值算法的优化方法,其特征在于,所述步骤S4进一步包括:
S4.1:初始化算法所需的simd寄存器;
寄存器vr12:每个word中存65536;
即vr12用于存储65536,由于S4.2中要计算65536-a,对应于simd减法指令subh vrd,vrs,vrp,而subh指令的所有操作数都是寄存器,所以需要将65536装载进vr12寄存器;
S4.2:计算线性插值算法设定的a的值和65536-a的值;
其中vr1[2i](H)即a的值;
vr5[](H)=vr12[](H)-vr1[](H)其中vr5[2i](H)即65536-a的值;
执行subh vr5,vr12,vr3指令:将vr12中的每个halfword减去vr3中对应的halfword,并将结果更新至vr5;
S4.3:获取线性插值算法设定的y0的值和y1的值;
其中vr2[2i](H)即y0的值;
其中vr4[2i](H)即y1的值;
S4.4:根据上面所述的线性插值公式计算所求得y的值:
vr2[](W)=vr5[2i](H)*vr2[2i](H);
执行smulhe vr2,vr2,vr5指令:将vr2中的每个偶数有符号halfword乘以vr5中对应的halfword,并将结果更新vr2中对应的word;
vr4[](W)=vr3[2i](H)*vr4[2i](H);
执行smulhe vr4,vr4,vr3指令:将vr4中的每个偶数有符号halfword乘以vr3中对应的halfword,并将结果更新vr4中对应的word;
vr2[](W)=vr2[](W)+vr4[](W);
执行addw vr2,vr2,vr4指令:将vr2中的每个word与vr4中的对应的word相加,并将结果更新vr2中的对应word;
vr2[](W)=vr2[](W)>>16;
执行srlriw vr2,vr2,16指令:将vr2中的每个word右移16位,向空的高阶位插入零,然后将移位结果与移开的元素的最后一位相加,并将最终舍入结果更新vr2中的对应word。
6.根据权利要求5所述的一种基于simd指令的线性插值算法的优化方法,其特征在于,所述步骤S4.3中,y0和y1的值能够作为本算法的输入参数直接给出,或由查表法查出。
7.根据权利要求6所述的一种基于simd指令的线性插值算法的优化方法,其特征在于,所述步骤S4.4中,
vr2[](W)=vr5[2i](H)*vr2[2i](H)对应线性插值法公式:
vr2=(65536-a)*y0;
vr4[](W)=vr3[2i](H)*vr4[2i](H)对应线性插值法公式:
vr4=a*y1;
vr2[](W)=vr2[](W)+vr4[](W)对应线性插值法公式:
vr2=y0*(65536-a)+y1*a;
vr2[](W)=vr2[](W)>>16对应线性插值法公式:
y={y0*(65536-a)+y1*a}/65536。
8.根据权利要求1所述的一种基于simd指令的线性插值算法的优化方法,其特征在于,所述方法设定的应用场景为:
1).线性插值算法的y0,y1的数据长度不大于16bits;
2).线性插值算法中的值a∈[0,65535];
3).最多同时完成16组数据的线性插值运算。
9.根据权利要求1所述的一种基于simd指令的线性插值算法的优化方法,其特征在于,所述方法能够完成同时查16bits数据的操作。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111648459.9A CN116414461A (zh) | 2021-12-30 | 2021-12-30 | 一种基于simd指令的线性插值算法的优化方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111648459.9A CN116414461A (zh) | 2021-12-30 | 2021-12-30 | 一种基于simd指令的线性插值算法的优化方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116414461A true CN116414461A (zh) | 2023-07-11 |
Family
ID=87049769
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111648459.9A Pending CN116414461A (zh) | 2021-12-30 | 2021-12-30 | 一种基于simd指令的线性插值算法的优化方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116414461A (zh) |
-
2021
- 2021-12-30 CN CN202111648459.9A patent/CN116414461A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
KR100267100B1 (ko) | 스케일러블 폭의 벡터 프로세서 아키텍쳐 | |
RU2263947C2 (ru) | Целочисленное умножение высокого порядка с округлением и сдвигом в архитектуре с одним потоком команд и множеством потоков данных | |
US6334176B1 (en) | Method and apparatus for generating an alignment control vector | |
US7281117B2 (en) | Processor executing SIMD instructions | |
JP3547139B2 (ja) | プロセッサ | |
Yu et al. | Vector processing as a soft-core CPU accelerator | |
US20110047360A1 (en) | Processor | |
CN109716290B (zh) | 用于经融合的乘加的系统、装置和方法 | |
JPH10207870A (ja) | ベクトルプロセッサプログラミング、及びベクトルプロセッサとriscプロセッサを備える非対称二重プロセッサの並列プログラミングにおけるコンピュータプログラム生成方法 | |
US10642586B2 (en) | Compiler optimizations for vector operations that are reformatting-resistant | |
US11635956B2 (en) | Fully pipelined hardware operator logic circuit for converting human-readable decimal character sequence floating-point representations to IEEE 754-2008 binary floating-point format representations | |
US6430684B1 (en) | Processor circuits, systems, and methods with efficient granularity shift and/or merge instruction(s) | |
CN112148251A (zh) | 跳过无意义的矩阵运算的系统和方法 | |
JP5326314B2 (ja) | プロセサおよび情報処理装置 | |
CN111782270A (zh) | 一种数据处理方法及装置、存储介质 | |
KR100520807B1 (ko) | 데이터 처리 조건 코드 플래그 | |
CN116414461A (zh) | 一种基于simd指令的线性插值算法的优化方法 | |
JP2748957B2 (ja) | データ処理装置 | |
KR20000048531A (ko) | 데이터 처리장치에서의 입력 오퍼랜드 제어 | |
WO2010067522A1 (ja) | 演算ユニット、プロセッサ及び並列演算方法 | |
US10331449B2 (en) | Encoding instructions identifying first and second architectural register numbers | |
CN112230993A (zh) | 数据处理方法及装置、电子设备 | |
JPH01116730A (ja) | デイジタル信号処理プロセツサ | |
US11550584B1 (en) | Implementing specialized instructions for accelerating Smith-Waterman sequence alignments | |
JP7315872B2 (ja) | プロセッサ、シミュレータプログラム、アセンブラプログラム、及び情報処理プログラム |
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 |