APP下载

面向FT-M7002平台点积算法的优化实现*

2022-11-17郭盼盼陈梦雪梁祖达马晓畅许邦建

计算机工程与科学 2022年11期
关键词:数组向量运算

郭盼盼,陈梦雪,梁祖达,马晓畅,许邦建

(1.郑州大学计算机与人工智能学院,河南 郑州 450066;2.国家超级计算郑州中心(郑州大学),河南 郑州 450001;3.湖南大学电气与信息工程学院,湖南 长沙 410082;4.湖南大学信息科学与工程学院,湖南 长沙 410082)

1 引言

高性能计算在应用领域、应用规模及性能方面呈现快速发展态势,在人工智能、数字经济、航空航天、信息安全、生物医疗和气象预报等领域应用广泛[1,2]。数值计算对于社会应用和科学研究越来越重要。高度结构化的数值计算可以通过向量运算来提升性能。向量运算不同于传统的标量运算,需要提高系统结构的并行性。单指令流多数据流SIMD(Single Instruction Multiple Data)技术适用于大量的高速或矩阵运算,可以有效地提高系统的并行处理能力[3,4]。

数字信号处理器DSP(Digital Signal Processor)是通过数值计算来处理信号的理论和技术。目前,我国许多高校和科研机构都在积极研究数字信号处理设备,其中国防科技大学的微电子处理器研究团队的成果较为突出,其先后研发了以FT-M7002为代表的系列国产高性能DSP芯片。与之对应,业界常用的主流高性能数字信号处理计算平台是美国德州仪器公司(TI)推出的TMS320C6678。TMS320C6678平台的处理器集成了8个C66x核,最高主频可达1.25 GHz,定点运算能力高达320 GMACS,浮点运算能力达160 GFlops,在高性能数字信号处理计算应用中具有极大的竞争力和优势。FT-M7002采用超长指令字结构VLIW(Very Long Instruction Word)集成了2个DSP内核和1个CPU核,主频可达1 GHz,16位峰值性能可达200 GMACS,32位峰值性能可达200 GFlops,在对速度要求较高的浮点运算中具有极大的优势[5 - 9]。本文研究了数字信号处理中常见的点积(Dot Product)算法在FT-M7002平台上的优化实现问题。

点积算法是实现点乘运算的方式之一,点乘是数值计算的基础部分,在大规模线性代数计算中经常被调用[10]。文献[11]提出一个基于茫然传输(Oblivious Transfer)的高效安全点积协议,利用高效茫然传输扩展技术大幅度降低计算开销。文献[12]将内向(对角)向量积和一个向量的元素之和一起用于推广同一维数的不定数向量的标量积。 文献[13]介绍了具有随机顶点向量的稀疏随机点积图,并研究了其三角形数量的渐近行为。文献[14]采用高阶宽算术逻辑单元,提高了点乘运算的速度。但是,由于处理器体系结构不同和优化算法的差异性,上述算法并不适用于FT-M7002平台。

本文面向国防科技大学自主研发的FT-M7002高性能处理器,对不同类型的点积算法实现了优化,并进行了性能对比。研究内容主要包含以下几个方面:(1)分析了FT-M7002体系结构的特点;(2)对不同类型的点积算法进行标量实现;(3)在FT-M7002平台上对(2)中的点积算法进行优化,用到的优化方法有数据处理、DMA双通道传输、向量并行优化和SVR(Scalar Vector Register)传输等;(4)对不同规模不同类型点积算法的实验结果进行了性能分析。

2 FT-M7002芯片总体结构

FT-M7002是国防科技大学自主研发的一款高性能DSP处理器芯片,主频为1 GHz,功耗在30 W以下。该芯片包含1个CPU核和2个DSP内核,采用双向环形互连网络,全芯片构成4个结点挂接在环形互连网络上。DSP内核拥有32 KB的一级数据缓存和512 KB的阵列存储器AM(Array Memory),核外拥有32 GB大容量DDR存储空间,针对矩阵乘、FFT等运算密集型算法进行了高度优化,在进行大量数据运算时能很好地发挥其优势[15 - 18]。

如图1所示,DSP内核的寄存器长达512位,基于超长指令字结构,由取指单元、标量处理单元SPU(Scalar Processing Unit)、标向量共享寄存器SVR、向量处理单元VPU(Vector Processing Unit)、阵列存储器AM和直接存储访问DMA(Direct Memory Access)等组成。其中,取指单元通过控制指令流控来完成指令获取操作。SPU包括指令流控、标量执行单元SPE(Scalar Processing Element)、标量存储器SM(Scalar Memory)等。指令流控单元用于程序流控制,包括分支、中断/异常控制等。标量执行单元SPE接收由指令派发部件派发的标量运算类指令,并在其对应的功能运算单元执行接收的指令。标量存储器SM主要实现标量数据访存。SVR可以实现SPE和VPU之间的数据传输。VPU由16个同构的向量执行单元VPE(Vector Processing Element)的运算阵列以及混洗/归约部件组成。AM支持DMA和2条向量存储指令的并行访问操作,实现16路的向量数据访问,为VPU提供高内存访问带宽。DMA接收SPU配置的传输参数,启动对特定存储资源的访问,读操作过程和写操作过程的数据传输通过DMA通道实现[19,20]。

Figure 1 Architecture of FT-M7002 DSP kernel图1 FT-M7002 DSP内核体系结构

3 点积算法实现

3.1 实数点积

点积,又称数量积,可以用来实现点乘算法,是欧几里得空间的标准内积,指实数集R上的2个向量对应相乘再相加求和之后返回一个实数值的二元运算[21]。运算法则如下:设向量A=[A1,A2,…,An]和B=[B1,B2,…,Bn],那么这2个向量的点积定义为:A·B=A1B1+A2B2+…+AnBn。

2个元素类型为float类型的输入数组的点积实现如算法1所示。

算法1DSPF_sp_dotprod_cn

输入:float *x,float *y,intn。

输出:floatsum。

步骤1sum=0;

步骤2 for(inti=0;i

步骤3sum+=x[i]*y[i];}

2个元素类型为short类型的输入数组的点积实现如算法2所示。

算法2DSP_dotprod_cn

输入:short *x,short *y,intn。

输出:intsum。

步骤1sum=0;

步骤2 for(inti=0;i

步骤3sum+=x[i]*y[i];}

3.2 复数点积

2个复数的乘法法则如下:设A=x+yi,B=m+ni(x,y,m和n均属于实数集R)是任意2个复数,那么它们的乘积A·B=(x+yi)(m+ni)=(xm-yn)+(xn+ym)i。以此类推,2个向量的复数点积,运算后实部和虚部分开存放。

2个元素类型为float类型的输入数组的复数点积实现如算法3所示。

算法3DSPF_sp_dotp_cplx_cn

输入:float *x,float *y,intn/2。

输出:floatreal,floatimag。

步骤1floatreal=0,imag=0;

步骤2 for(inti=0;i

步骤3real+=(x[2*i] *y[2*i]-x[2*i+1] *y[2*i+1]);

步骤4imag+=(x[2*i] *y[2*i+1]+x[2*i+1] *y[2*i]);}

4 面向FT-M7002平台点积算法的优化

面向FT-M7002平台,点积算法的优化需要经过以下步骤:首先,需要对数据进行处理;其次,向量操作在向量空间AM中执行,需要先把数据从标量空间传输到向量空间;再次,对核心计算进行向量并行优化;最后,将数据再从向量空间传输到标量空间,返回结果值。在以上步骤中,涉及到的优化有以下几个方面:

(1)数据处理;

(2)DMA双通道传输;

(3)向量并行优化;

(4)SVR传输。

4.1 数据处理

由于向量处理单元有16个同构运算单元VPE,进行向量运算时这16个VPE一起参与运算,并且执行相同的操作,所以在运算之前需要判断连续的16个数据是否线性相关,能否进行相同的处理。一般向量操作只针对16的整数倍数据进行处理,不够16的尾部数据主要有以下3种处理方法:

(1)填0补全。用0将不够16的尾部数据补够16;或者将不够16的尾部数据所在的向量空间其它位置初始化为0。

(2)关闭部分运算单元VPE。向量处理单元为VPE0~VPE15,可以通过mov_to_vlr()接口控制开启或关闭,1表示VPEx为开启状态,0表示VPEx为关闭状态(x的取值为0~15)。VPEx在关闭状态下不再执行相关指令操作,直到VPEx再次被打开。

(3)数据作废。即放弃不够16的尾部数据,但这可能会影响函数结果的正确性。

经实验判断,方法3会使结果不正确,方法2反复打开或关闭VPE很费时间。方法1中用0将不够16的部尾数据补够16是在标量空间中进行的,相比较而言,向量空间初始化为0所用的时间周期更少、效果更好。

4.2 DMA双通道传输

在FT-M7002平台中,DMA作为单核数据传输的枢纽,可以通过配置其传输参数来实现数据搬移。数据传输包括读操作过程和写操作过程。完成1次DMA数据搬移需要经历DMA参数配置、DMA启动搬移数据和DMA结束确认3个过程。

DMA数据传输模式包括点对点传输、分段数据传输、广播数据传输、核外主机数据访问和ET(Emulation Test)调试请求。DMA事务支持多种不同的启动方式,包括写事件置位寄存器ESR(Event Set Register)启动、同步事件启动、参数链接启动、通道链接启动和帧同步传输启动。DMA传输结束确认有2种方式:(1)通过DMA产生传输完成中断;(2)检测传输完成标识寄存器。

点对点传输是指DSP内核通过DMA发起核内、核外存储资源之间的数据交换。传输源和目的中一个是DSP内核内存储资源,另一个是核外存储资源。这些点到点传输允许按行进行同步,也可以按数据块进行同步。

在本文点积算法优化实现中,DMA数据传输模式是点对点传输,DMA启动方式是写ESR启动,DMA传输结束确认方式是检测传输完成标识寄存器CIPR(Complete Identity Processing Register)。实现1次DMA传输搬移2个数组的数据,需要对第1个参数的通道链接进行配置,这样第1个数组传输完毕后,可以立刻转向下一个逻辑通道对第2个数组进行传输,这里称为DMA双通道传输。DMA传输结束确认后,只需要检测1次传输完成标识寄存器,节省了时间成本。

4.2.1 DMA参数配置

在启动DMA之前,需要对DMA的传输参数和全局寄存器进行配置。如图2所示,DMA参数配置由8个字构成,每个字32位。其中,传输控制字1和传输控制字2中的参数域用来控制传输模式;源地址表示源数据块首地址的低32位;源单元计数为数据块中每个数据行中的数据单元字数;源帧计数表示源数据块中包含的数据帧数目,值为0时表示1个帧,值为1时表示2个帧,依次类推;目的地址表示目的数据块首地址的低32位;目的单元计数表示目的数据块中每个数据行中的数据单元字数;目的帧计数表示目的数据块中包含的数据帧数目[22],值为0时表示1个帧,值为1时表示2个帧,依次类推;源帧索引为源数据块中2个数据帧之间的地址偏移量;目的帧索引为目的数据块中2个数据帧之间的地址偏移量;块索引表示2个数据块之间的地址偏移量;参数链接地址表示连接参数地址的低16位。

Figure 2 DMA parameters图2 DMA参数

DMA有16个逻辑通道,每个通道都有一个与之关联的事件,用于触发相应通道的传输。为使用DMA双通道传输,需要在第1个传输参数中配置其传输控制字1参数中的“传输结束中断使能(TCINT)”值为1,“传输结束中断码(TCC)”值为 7~15,同时,还需置位“事件使能寄存器(EER)”。

TCINT位于传输控制字1中的第2位,1表示传输结束后产生中断,0表示不产生。TCC位于传输控制字1中的第3~6位,取值在0000b~1111b。EER是事件控制相关的寄存器之一,有32位,0~15位为通道x(x为0~15)使能信号,1为有效;16~31位保留。

4.2.2 DMA写ESR启动

配置好DMA参数之后执行写ESR启动。DMA设置16个逻辑通道,每个逻辑通道对应参数的一个入口。在DMA通道启动后,将参数读出并提交给DMA通用通道处理,完成第1个数组的数据搬移。第1个数组传输结束后,通过4.1.1节中的参数配置,DMA会产生传输结束中断码TCC值对应的中断事件,从而启动对应的逻辑通道7~15,立刻对第2个数组的数据进行搬移。

4.2.3 DMA传输完成标识检测

由于是双通道传输,没有对DMA的第2个参数进行通道链接配置,所以当第2个数组也传输完毕后,就可以检测传输完成标识寄存器,读取CIPR寄存器,检测CIPR相应位,相应位为1,表示传输结束。

待处理通道中断标志寄存器CIPR有32位,第0~15位表示结束码x(x表示0~15)的点到点传输结束中断标志位,1表示中断,0表示无中断;第16~31位表示结束码x(x表示16~31)的分段数据传输或者广播结束中断标志位,1表示中断,0表示无中断。一般情况下,CIPR寄存器的值初始化成0xFFFFFFFF,然后再用“for(;!(*address&0x1);)”检测DMA传输是否完成。

4.2.4 小结

如果要实现2个数据类型为float的一维数组x和y的DMA双通道传输,即将x和y2个标量数组中的n个数据分别搬移到向量空间src1_v和src2_v中,由于数组的数据类型为float,则需要的空间大小为4n。若接口名称定义为M7002_datatrans_link,则需要传入6个参数,即其DMA双通道传输实现代码为“M7002_datatrans_link(x,src1_v,4n,y,src2_v,4n)”。假设第1个数组x使用逻辑通道0进行数据传输,第2个数组y使用逻辑通道7进行数据传输,先启动逻辑通道0后启动逻辑通道7,则要在逻辑通道0上进行通道链接配置,需要将其传输控制字1的TCINT参数域的值配置为1,TCC参数域的值配置为7,同时置位EER寄存器。由于是双通道传输,逻辑通道7不需要进行通道链接配置。最后,通过检测CIPR寄存器的值来判断DMA传输是否完成。

以此类推,如果要实现1次DMA传输3个数组,即开通3个逻辑通道,则需要对前2个通道进行通道链接配置,这样可以快速查找到下一个通道,对下一个数组进行传输。

4.3 向量并行优化

如果数据处理已完成并传输到向量空间之后,就可以进行核心计算了,向量运算1次可以计算16个数据,主要用到下列向量并行优化。

4.3.1 取数

进行计算之前,要先把数据从向量空间读取到向量计算单元中,每次读取16个。可以用“*++”自增来读取,也可以用FT-M7002平台提供的向量C接口“vec_ld()”读取,具体使用哪种方法视情况而定。

一般情况下,使用“*++”读取数据比使用“vec_ld()”所用周期数要少,但“*++”只能读取连续的16个数,数据类型还要保持一致。本文的float类型点积(算法1和算法3)使用“vec_ld()”读取数,short类型点积(算法2)使用“*++”读取数。

4.3.2 点积核心计算

算法1和算法3使用向量点积乘后加vec_dotp()函数进行优化;算法2使用复数点积乘后加进行优化,实部乘法使用vec_fcreal32()函数,虚部乘法使用vec_fcimag32()函数。下面分别对这3个算法进行核心计算的优化。

对算法1的核心计算优化后代码如下所示:

for(inti=0;i

tempx0=vec_ldm2(i,src1_v);

tempy0=vec_ldm2(i,src2_v);

tempz0=vec_dotp(tempx0,tempy0);

tempz1=vec_add(tempz0,tempz1);

}

其中,向量空间src1_v和src2_v为float类型;向量运算单元tempx0和tempy0为double类型,tempz0和tempz1为float类型。使用模二取vec_ldm2()1次循环可以取出32个float类型的数据,减少了循环次数。由于类型1个float数据占32位,1个double类型数据占64位。使用点积函数vec_dotp()时,tempx0的高32位乘以tempy0高32位的乘积加上tempx0的低32位乘以tempy0低32位的乘积,将和保存至tempz0中。最后再将点积之后的结果累加到tempz1中。

对算法2的核心计算优化后代码如下所示:

for(inti=0;i

tempz0=vec_dotp(*src1_v++,*src2_v++);

tempz1=vec_add(tempz0,tempz1);

}

其中,向量空间src1_v和src2_v为short类型,FT-M7002平台中short类型为打包在32位操作数中的2个16位整数,所以使用“*++”取数1次可以计算32个short类型的数据,使循环次数减半。由于和算法1的数据类型不一样,tempz0和tempz1为int类型,使用点积函数vec_dotp()时,src1_v的高16位乘以src2_v高16位的乘积加上src1_v的低16乘以src2_v低16位的乘积,将和保存至tempz0中。最后再将点积之后的结果累加到tempz1中。

算法3的数据类型和算法1的一样,取数方式也一样,只是使用的点积函数不一样。对算法3的核心计算优化后代码如下所示:

for(i=0;i

tempx0=vec_ldm2(i,src1_v);

tempy0=vec_ldm2(i,src2_v);

temp_real=vec_fcreal32(tempx0,tempy0);

temp_imag=vec_fcimag32(tempx0,tempy0);

sum_real=vec_add(temp_real,sum_real);

sum_imag=vec_add(temp_imag,sum_imag);

}

其中,向量空间src1_v和src2_v为float类型;向量运算单元tempx0和tempy0为double类型,分别存放32个float类型的x和y数组数据;向量运算单元temp_real和temp_imag为float类型,分别存放点积后的实部和虚部结果;向量运算单元sum_real和sum_imag为float类型,分别存放点积后的实部和虚部累加结果。复数实部乘法计算使用复数点积函数vec_fcreal32()时,tempx0的高32位乘以tempy0的高32位,tempx0的低32位乘以tempy0的低32位,2个乘法结果相减后实部结果赋值给temp_real。复数虚部乘法计算使用复数点积函数vec_fcreal32()时,tempx0的高32位乘以tempy0的高32位,tempx0的低32位乘以tempy0的低32位,2个乘法结果相减后虚部结果赋值给temp_imag。最后再分别将点积之后的结果累加到sum_real和sum_imag中。

4.3.3 向量归约

向量归约可以通过某种操作方式将多个向量运算单元中的数据归到一个或多个向量运算单元,方式有取最大值、取最小值、加法和SIMD加法,目前FT-M7002平台只支持int类型。算法2使用了归约函数vec_reduc16()中的加法,用法为“tempz2=vec_reduc16(tempz1,0,0)”,tempz1存放核心计算点积之后累加起来的结果,在其16个VPE里面,使用向量归约之后,结果累加到了tempz2的第1个VPE中,这样只需要输出一个结果,大大缩短了时间周期。

4.4 SVR传输

在向量运算单元计算完成之后,还需要把数据传输出来,返回给主函数。由于点积核心计算完成之后,结果存放在一个向量运算单元的1个或16个VPE中,只需要把它们传输出来即可,如果还使用DMA传输,又要经历DMA参数配置、DMA启动和DMA传输完成确认,这样很费时间。为快速传输少量数据,FT-M7002提供了SVR传输接口,可以把数据从向量运算单元直接传输到标量中。

数据的类型不同,使用的接口也稍有不同。在算法1优化中,数据类型为float类型,先使用“mov_to_svr_v16sf(tempz1)”,将向量运算单元tempz1里的16个数据搬移至SVR中;然后再使用“result[X]=mov_from_svrX_sf()”函数(X表示0~15),将SVR里的16个数据搬移到result数组中。算法2的优化中,点积之后进行了向量归约,在4.3.3节中,使用“mov_to_svr_v16si(tempz2)”将点积之后的结果tempz1中的16个数据归约到了tempz2中的第1个VPE中,数据类型为int,将向量运算单元tempz2中的数据搬移至SVR中,然后使用“sum=mov_from_svr0()”将第1个数据从SVR中传输出来。算法3的优化和算法1使用的SVR传输类似,这里不再赘述。

4.5 小结

以算法2的优化为例,核心计算优化后代码如下所示:

intsum;//存放最终返回值

vector signed inttempz0,tempz1,tempz2;

tempz1=vec_movi((int)0);//初始化0

vector signed short *src1_v=(vector signed short *)0x040000000;//申请向量空间

vector signed short *src2_v=(vector signed short *)0x040002000;

//尾部数据向量空间初始化0

vec_st(vec_movi((short)0),0,src1_v+n/32);

vec_st(vec_movi((short)0),0,src2_v+n/32);

//DMA双通道传输

M7002_datatrans_link(x,src1_v,n*2,y,src2_v,n*2);

for(inti=0;i

tempz0=vec_dotp(*src1_v++,*src2_v++);

tempz1=vec_add(tempz0,tempz1);

}//点积核心计算

tempz2=vec_reduc16(tempz1,0,0);//向量归约

mov_to_svr_v16si(tempz2);//SVR传输

sum=mov_from_svr0();

5 实验与结果分析

本文实验数据均来源于TI官网dsplib库中的数据。对其中不同类型的点积算法,float类型的数组是通过函数“UTIL_fillRandSP()”随机生成(-10,10)的小数,short类型的数组来源于dsplib库给定的数据。改变输入数组的规模n(n=128,256,512,1 024),分别在FT-M7002和TI的开发板上进行实验,根据开发程序统计DSP运行周期数。本节主要从实验环境、正确性分析和性能分析3个方面对实验进行分析。

5.1 实验环境

本文的实验环境有2个:一个是FT平台及其对应的开发板M7002;另一个是TI平台及其对应的开发板TMS320C6678。具体实验环境参数如表1所示。

Figure 3 Performance comparison after FT-M7002 optimization and before FT-M7002 optimization图3 FT-M7002优化后与FT-M7002优化前的性能对比

Table 1 Parameters of experimental environment表1 实验环境参数

5.2 正确性分析

在FT-M7002平台上,分别返回优化前后的结果,将2个结果相减取绝对值,以千分之一为标准,精确度小于千分之一则输出“Result Successful”,否则输出“Result Failure”。结果如表2所示,对于输入不同规模不同类型的数组,本文的点积算法均能输出正确的结果。

Table 2 Result correctness analysis

5.3 性能分析

本文对算法1、算法2和算法3在FT-M7002平台上进行不同类型的点积算法的实现和优化。由于主频不同,FT-M7002平台的周期数置换时间公式为:周期数*16/106,置换成ms;TI平台的周期数置换时间公式为:周期数/106,置换成ms。调用定时器的计时函数分别记录优化前后的算法执行时间,从以下2个方面对实验结果进行性能分析:(1)纵向对比,即FT-M7002优化前后的性能对比;(2)横向对比,即FT-M7002优化后的性能与TI性能对比。

5.3.1 FT-M7002优化后与其优化前的性能对比

输入不同类型不同规模的数组,在FT-M7002平台上进行float类型点积、short类型点积和float类型复数点积的实现与优化,分别记为DSPF_sp_dotprod()函数、DSP_dotprod()函数和DSPF_sp_dotp_cplx()函数。以优化前后定时器的时间周期来计算其性能比。

Figure 4 Performance comparison between optimized FT-M7002 and TI图4 FT-M7002优化后的性能与TI的性能对比

测试结果如图3所示,分别列出了不同类型情况下,n为128,256,512和1 024时点积算法优化后的性能比,以及3个函数的平均性能。相比于算法1、算法2、算法3,DSPF_sp_dotprod()、DSP_dotprod()、DSPF_sp_dotp_cplx()3个函数向量优化后的性能比分别为12.796 3~46.319 3, 13.666 7~54.049 0, 10.786 9~35.333 3,3个函数的平均性能比为12.416 6~45.233 8。可以看出,随着规模n的不断增大,性能比均不断提高。

5.3.2 FT-M7002优化后的性能与TI的性能对比

将FT-M7002 优化后的性能与TI的性能进行对比,测试结果如图4所示,同样地,分别求出了3个函数的性能比及其平均性能。相比于TI平台的测试结果,DSPF_sp_dotprod()、DSP_dotprod()、DSPF_sp_dotp_cplx()3个函数在FT-M7002 平台向量优化后的性能比分别为1.841 4~6.250 5, 0.905 6~3.171 0, 1.367 8~4.137 3,3个函数的平均性能比为1.371 6~4.519 6。

可以看到,输入数据类型为short、n为128时,性能比才达到0.905 6,这是因为TI平台的定点运算能力峰值比FT-M7002 平台的高,n比较小时,FT-M7002 平台中DMA传输时间占比较大。随着规模n的不断增大,性能比也在不断提高。

6 结束语

针对FT-M7002 DSP内核体系结构的特点,本文完成了对不同类型不同规模大小的点积算法的优化。本文结合FT-M7002平台的特性,使用向量并行化、DMA双通道传输和SVR传输等优化方法,提高了程序的性能。实验结果表明,在FT-M7002平台上,不同类型的点积算法优化后的性能与优化前的平均性能比为12.416 6~45.233 8。同时,本文还与TI平台的TMS320C6678处理器进行了实验对比,不同类型的点积算法在FT-M7002平台优化后的性能与TI平台的平均性能比为1.371 6~4.519 6。验证了本文所提出的点积算法优化方法的有效性以及FT-M7002平台的高性能计算优势,后续将针对其他数学算法完善其在FT-M7002平台上的实现与优化。

猜你喜欢

数组向量运算
向量的分解
重视运算与推理,解决数列求和题
JAVA稀疏矩阵算法
聚焦“向量与三角”创新题
JAVA玩转数学之二维数组排序
有趣的运算
更高效用好 Excel的数组公式
“整式的乘法与因式分解”知识归纳
向量垂直在解析几何中的应用
向量五种“变身” 玩转圆锥曲线