一种基于INTEL AVX指令集的浮点峰值计算吞吐测试算法制造技术

技术编号:18426105 阅读:99 留言:0更新日期:2018-07-12 01:56
本发明专利技术公开了一种基于INTEL AVX指令集的浮点峰值计算吞吐测试算法,包括以下步骤:步骤1:AVX 128Bit ADD/Sub;步骤2:AVX 128bit Mul;步骤3:AVX 128Bit FMA;步骤4:AVX 128Bit ADD+Mul;步骤5:AVX 256Bit ADD/Sub;步骤6,AVX 256Bit Mul;步骤7,AVX 256Bit FMA;步骤8,AVX 256Bit ADD+Mul;步骤9,AVX 512Bit ADD/Sub;步骤10,AVX 512Bit Mul;步骤11,AVX 512Bit ADD+Mul;步骤12,AVX 512Bit FMA;步骤13,计算过程自动迭代和纳秒级计时;步骤14,针对不同处理器架构;步骤15,单线程测试+多线程调用;步骤16,显示出测试结果。本发明专利技术在尽可能短的测试时间下,可针对目前主流X86处理器的向量计算能力做出评估,帮助研究人员快速确定该架构处理器在SIMD吞吐中的设计,找到其基本计算能力的侧重点和性能峰值点。

A floating point peak computing huff and puff algorithm based on INTEL AVX instruction set

The invention discloses a floating point peak calculation and throughput test algorithm based on INTEL AVX instruction set, which includes steps: step 1:AVX 128Bit ADD/Sub; step 2:AVX 128bit Mul; step 3:AVX 128Bit FMA; step 4:AVX. Step 7, AVX 256Bit FMA; step 8, AVX 256Bit ADD+Mul; step 9, AVX 512Bit ADD/Sub; step 10, AVX 512Bit Mul; step 11; step 12; step 13, automatic iteration and nanosecond timing of the calculation procedure; step 14, for different processor architectures; step 15, step 15, Single thread test + multithread invocation; step 16 shows the test results. In the shortest possible test time, the invention can evaluate the vector computing power of the current mainstream X86 processor, and help researchers quickly determine the design of the architecture processor in SIMD throughput, and find the focus and performance peak point of its basic computing power.

【技术实现步骤摘要】
一种基于INTELAVX指令集的浮点峰值计算吞吐测试算法
本专利技术涉及浮点算法领域,具体为一种基于INTELAVX指令集的浮点峰值计算吞吐测试算法。
技术介绍
过去,主流CPU通过提高每秒指令执行次数来提高CPU在单位时间内的计算能力,通常每个时钟周期执行一条指令完成一次计算,但随着计算的复杂度增加,CPU内部引入了流水线执行的方式,即将一个完整的指令执行步骤拆分成多个步骤,由各个寄存器按流水线的形式分别完成,每个时钟周期同样完成一次操作,只要流水线能稳定运行下去,依旧可以做到近似一个时钟周期有一条指令完成,这种一个时钟周期完成一条指令的形式,也被称为标量处理器。但随着CPU每秒时钟周期数不断提高,也就是CPU主频不断提高,要想继续提升主频就相当困难了,于是在CPU内加入多个指令执行流水线,做到同时有多个流水线在几乎同时进行指令执行的流水工作,在受到缓存缺失,分支预测失败等情况的影响下,依旧能实现每个时钟周期平均执行超过一条指令的微处理器,也被称为超标量流水线架构。标量或是超标量处理器,都没有解决一个问题,那就是仍然是一条计算指令实现一次数值计算,但随着单纯增加执行单元对功耗发热的影响越来越大,CPU的计算性能发展为多线程并发与SIMD并行两种思路,多线程仍然没有改变指令层面的执行,仍旧是提高单位时间内指令执行的数量,而SIMD则改变了过去指令执行的基本思想,引入了向量(矢量)计算的概念。过去无论计算8位/16位/32位抑或其他数据类型的计算,一次指令执行往往就是一组数值的计算,如1+1,2X2,1.00001X1.000001等,而SIMD指令集则提供了一条指令同时执行多组数值计算的可能,如定义数据类型为32位浮点(单精度浮点)。而有4组数值计算,如A+B,C+D,E+F,G+H,分别将A,C,E,G装入一个128bitSIMD寄存器,B,D,F,H装入另一个128bitSIMD寄存器,然后这两个寄存器相加的指令操作就完成了4次32位浮点计算,也就大大提高了计算效率,如图1所示。随着CPU的发展,如今向量指令集的位宽也在不断增大,支持的直接指令操作也在不断增加,不同数据类型之间的数据对齐支持,浮点数与整数数据的转换都越来越方便,X86CPU上从MMX到SSE再到AVX,如今AVX512指令集可支持512bit寄存器,同时打包8个64位(双精度浮点)浮点数和16个32位(单精度浮点数),同时为应对一些混合计算如乘法加法并存的计算,引入了FMA(FusedmultiplyAdd)融合乘加指令,如FMA3指令可实现三操作数的融合乘加指令,即完成单指令A=(A+B)*C的计算(A,B,C三个操作数),抑或四操作数的FMA4指令,即A=(B+C)*D的计算(A,B,C,D为四个操作数)。但是向量化指令对计算并行度要求也相当高,由于大量软件依旧使用较老的SIMD指令体系编译或专门的高度向量化编译的软件常人难以接触,使得最新处理器的峰值性能往往被人忽视,同时为了确定在不同处理器中,因为指令体系,寄存器,流水线的一些限制,也会使得在进行不同计算时吞吐量有所不同,如可能因为FMA单元和Add/Mul单元的设计不同,进行乘法,加法,或者乘法加法混合计算以及FMA融合计算下的吞吐量是不同的,甚至在某些SIMD寄存器中,整数计算和浮点计算可以占用的位宽也是不同的,所以通过编写相应计算程序,并调用最新指令集,尽可能将数据关联性降低,提高并行性和降低分支预测难度,通过精确的计时测算就可以计算出处理器的加法/减法/乘法或混合计算以及融合乘加计算下的最大峰值,也可通过不同矢量位宽指令的运用,计算出在128/256/512bitSIMD指令集/寄存器的浮点计算峰值。同时由于当代CPU多核多线程已成为主流,对CPU浮点峰值的计量不仅仅需要考虑SIMD向量指令集的充分利用,还要考虑多线程并发的实现,使其成为高并发,高并行,高向量化的可执行程序。同时,针对AVX512浮点计算的benchmark,由于为最新的SIMD指令集,需要参照Intel64andIA-32ArchitecturesSoftwareDeveloper’sManual以及IntelC++编译器(ICC编译器)的向量化操作得以实现。
技术实现思路
本专利技术的目的在于提供一种基于INTELAVX指令集的浮点峰值计算吞吐测试算法,在拿到一颗支持向量化指令集的CPU时,可以快速通过该算法软件迅速测的其在加法/减法,乘法或使用融合乘加指令下的浮点计算峰值,并且最大化使用最新向量指令集进行计算,从而准确计算出该CPU能达到的浮点计算峰值,分析CPU在进行矢量计算情况下的基本性能,以及运行类似浮点密集计算的基本运行情况。为实现上述目的,本专利技术提供如下技术方案:一种基于INTELAVX指令集的浮点峰值计算吞吐测试算法,包括以下步骤:步骤1:AVX128BitADD/Sub;使用AVX组合浮点计算,首先要对寄存器进行加载操作,将相应数据加载到相应寄存器,这里使用128bitSIMD指令将加法要做的数值加载:const__m128dadd0=_mm_set1_pd,vmovaps指令可把4个对准的单精度值传送到xmm寄存器或者内存,vmovupd可把4个不对准的单精度值传送到xmm寄存器或者内存,将数值送入128bitXMM寄存器后,便可使用加法与减法指令执行Add或者Sub;使用add_ps语句将add0的数值与r0-r7的数值进行加法计算r0=_mm_add_ps(r0,add0);r1=_mm_add_ps(r1,add0);r2=_mm_add_ps(r2,add0);r3=_mm_add_ps(r3,add0);r4=_mm_add_ps(r4,add0);r5=_mm_add_ps(r5,add0);r6=_mm_add_ps(r6,add0);r7=_mm_add_ps(r7,add0);使用sub_ps语句将sub0的数值与r0-r7的数值进行组合浮点减法计算r0=_mm_sub_ps(r0,sub0);r1=_mm_sub_ps(r1,sub0);r2=_mm_sub_ps(r2,sub0);r3=_mm_sub_ps(r3,sub0);r4=_mm_sub_ps(r4,sub0);r5=_mm_sub_ps(r5,sub0);r6=_mm_sub_ps(r6,sub0);r7=_mm_sub_ps(r7,sub0);编译器将使用SIMD模式编译为vaddpsxmm0,xmm6,xmm4的语句或者vsubpsxmm0,xmm6,xmm4的语句,这样就构成了AVX-128向量计算加法与减法的基本计算部分;步骤2:AVX128bitMul;Mul便是乘法计算的简写,在进行矢量乘法的时候,我们依旧要将数据装载入SIMD寄存器中,且保证对应的单精度和双精度占满SIMD寄存器,如计算32位单精度浮点数时,一个XMM寄存器需打包4个单精度浮点数和2个双精度浮点数乘法计算部分仍然为之前的数据加载,加载至mul0.mul1两个寄存器中,但计算部分调用12个寄存器,进行4组乘法计算,对mul0的两组,对mul1的两组;r0=_mm_mul_ps(r0,mul0);r1=_mm_mul本文档来自技高网
...

【技术保护点】
1.一种基于INTEL AVX指令集的浮点峰值计算吞吐测试算法,其特征在于,包括以下步骤:步骤1:AVX 128Bit ADD/Sub;使用AVX组合浮点计算,首先要对寄存器进行加载操作,将相应数据加载到相应寄存器,这里使用128bit SIMD指令将加法要做的数值加载:const__m128d add0=_mm_set1_pd,vmovaps指令可把4个对准的单精度值传送到xmm寄存器或者内存,vmovupd可把4个不对准的单精度值传送到xmm寄存器或者内存,将数值送入128bit XMM寄存器后,便可使用加法与减法指令执行Add或者Sub;使用add_ps语句将add0的数值与r0‑r7的数值进行加法计算r0=_mm_add_ps(r0,add0);r1=_mm_add_ps(r1,add0);r2=_mm_add_ps(r2,add0);r3=_mm_add_ps(r3,add0);r4=_mm_add_ps(r4,add0);r5=_mm_add_ps(r5,add0);r6=_mm_add_ps(r6,add0);r7=_mm_add_ps(r7,add0);使用sub_ps语句将sub0的数值与r0‑r7的数值进行组合浮点减法计算r0=_mm_sub_ps(r0,sub0);r1=_mm_sub_ps(r1,sub0);r2=_mm_sub_ps(r2,sub0);r3=_mm_sub_ps(r3,sub0);r4=_mm_sub_ps(r4,sub0);r5=_mm_sub_ps(r5,sub0);r6=_mm_sub_ps(r6,sub0);r7=_mm_sub_ps(r7,sub0);编译器将使用SIMD模式编译为vaddps xmm0,xmm6,xmm4的语句或者vsubps xmm0,xmm6,xmm4的语句,这样就构成了AVX‑128向量计算加法与减法的基本计算部分;步骤2:AVX 128bit Mul;Mul便是乘法计算的简写,在进行矢量乘法的时候,我们依旧要将数据装载入SIMD寄存器中,且保证对应的单精度和双精度占满SIMD寄存器,如计算32位单精度浮点数时,一个XMM寄存器需打包4个单精度浮点数和2个双精度浮点数乘法计算部分仍然为之前的数据加载,加载至mul0.mul1两个寄存器中,但计算部分调用12个寄存器,进行4组乘法计算,对mul0的两组,对mul1的两组r0=_mm_mul_ps(r0,mul0);r1=_mm_mul_ps(r1,mul0);r2=_mm_mul_ps(r2,mul0);r3=_mm_mul_ps(r3,mul0);r4=_mm_mul_ps(r4,mul0);r5=_mm_mul_ps(r5,mul0);r6=_mm_mul_ps(r6,mul0);r7=_mm_mul_ps(r7,mul0);r8=_mm_mul_ps(r8,mul0);r9=_mm_mul_ps(r9,mul0);rA=_mm_mul_ps(rA,mul0);rB=_mm_mul_ps(rB,mul0);r0=_mm_mul_ps(r0,mul1);r1=_mm_mul_ps(r1,mul1);r2=_mm_mul_ps(r2,mul1);r3=_mm_mul_ps(r3,mul1);r4=_mm_mul_ps(r4,mul1);r5=_mm_mul_ps(r5,mul1);r6=_mm_mul_ps(r6,mul1);r7=_mm_mul_ps(r7,mul1);r8=_mm_mul_ps(r8,mul1);r9=_mm_mul_ps(r9,mul1);rA=_mm_mul_ps(rA,mul1);rB=_mm_mul_ps(rB,mul1);r0=_mm_mul_ps(r0,mul0);r1=_mm_mul_ps(r1,mul0);r2=_mm_mul_ps(r2,mul0);r3=_mm_mul_ps(r3,mul0);r4=_mm_mul_ps(r4,mul0);r5=_mm_mul_ps(r5,mul0);r6=_mm_mul_ps(r6,mul0);r7=_mm_mul_ps(r7,mul0);r8=_mm_mul_ps(r8,mul0);r9=_mm_mul_ps(r9,mul0);rA=_mm_mul_ps(rA,mul0);rB=_mm_mul_ps(rB,mul0);r0=_mm_mul_ps(r0,mul1);r1=_mm_mul_ps(r1,mul1);r2=_mm_mul_ps(r2,mul1);r3=_mm_mul_ps(r3,mul1);r4=_mm_mul_ps(r4,mul1);r5=_mm_mul_ps(r5,mul1);r6=_mm_mul_ps(r6,mul1...

【技术特征摘要】
1.一种基于INTELAVX指令集的浮点峰值计算吞吐测试算法,其特征在于,包括以下步骤:步骤1:AVX128BitADD/Sub;使用AVX组合浮点计算,首先要对寄存器进行加载操作,将相应数据加载到相应寄存器,这里使用128bitSIMD指令将加法要做的数值加载:const__m128dadd0=_mm_set1_pd,vmovaps指令可把4个对准的单精度值传送到xmm寄存器或者内存,vmovupd可把4个不对准的单精度值传送到xmm寄存器或者内存,将数值送入128bitXMM寄存器后,便可使用加法与减法指令执行Add或者Sub;使用add_ps语句将add0的数值与r0-r7的数值进行加法计算r0=_mm_add_ps(r0,add0);r1=_mm_add_ps(r1,add0);r2=_mm_add_ps(r2,add0);r3=_mm_add_ps(r3,add0);r4=_mm_add_ps(r4,add0);r5=_mm_add_ps(r5,add0);r6=_mm_add_ps(r6,add0);r7=_mm_add_ps(r7,add0);使用sub_ps语句将sub0的数值与r0-r7的数值进行组合浮点减法计算r0=_mm_sub_ps(r0,sub0);r1=_mm_sub_ps(r1,sub0);r2=_mm_sub_ps(r2,sub0);r3=_mm_sub_ps(r3,sub0);r4=_mm_sub_ps(r4,sub0);r5=_mm_sub_ps(r5,sub0);r6=_mm_sub_ps(r6,sub0);r7=_mm_sub_ps(r7,sub0);编译器将使用SIMD模式编译为vaddpsxmm0,xmm6,xmm4的语句或者vsubpsxmm0,xmm6,xmm4的语句,这样就构成了AVX-128向量计算加法与减法的基本计算部分;步骤2:AVX128bitMul;Mul便是乘法计算的简写,在进行矢量乘法的时候,我们依旧要将数据装载入SIMD寄存器中,且保证对应的单精度和双精度占满SIMD寄存器,如计算32位单精度浮点数时,一个XMM寄存器需打包4个单精度浮点数和2个双精度浮点数乘法计算部分仍然为之前的数据加载,加载至mul0.mul1两个寄存器中,但计算部分调用12个寄存器,进行4组乘法计算,对mul0的两组,对mul1的两组r0=_mm_mul_ps(r0,mul0);r1=_mm_mul_ps(r1,mul0);r2=_mm_mul_ps(r2,mul0);r3=_mm_mul_ps(r3,mul0);r4=_mm_mul_ps(r4,mul0);r5=_mm_mul_ps(r5,mul0);r6=_mm_mul_ps(r6,mul0);r7=_mm_mul_ps(r7,mul0);r8=_mm_mul_ps(r8,mul0);r9=_mm_mul_ps(r9,mul0);rA=_mm_mul_ps(rA,mul0);rB=_mm_mul_ps(rB,mul0);r0=_mm_mul_ps(r0,mul1);r1=_mm_mul_ps(r1,mul1);r2=_mm_mul_ps(r2,mul1);r3=_mm_mul_ps(r3,mul1);r4=_mm_mul_ps(r4,mul1);r5=_mm_mul_ps(r5,mul1);r6=_mm_mul_ps(r6,mul1);r7=_mm_mul_ps(r7,mul1);r8=_mm_mul_ps(r8,mul1);r9=_mm_mul_ps(r9,mul1);rA=_mm_mul_ps(rA,mul1);rB=_mm_mul_ps(rB,mul1);r0=_mm_mul_ps(r0,mul0);r1=_mm_mul_ps(r1,mul0);r2=_mm_mul_ps(r2,mul0);r3=_mm_mul_ps(r3,mul0);r4=_mm_mul_ps(r4,mul0);r5=_mm_mul_ps(r5,mul0);r6=_mm_mul_ps(r6,mul0);r7=_mm_mul_ps(r7,mul0);r8=_mm_mul_ps(r8,mul0);r9=_mm_mul_ps(r9,mul0);rA=_mm_mul_ps(rA,mul0);rB=_mm_mul_ps(rB,mul0);r0=_mm_mul_ps(r0,mul1);r1=_mm_mul_ps(r1,mul1);r2=_mm_mul_ps(r2,mul1);r3=_mm_mul_ps(r3,mul1);r4=_mm_mul_ps(r4,mul1);r5=_mm_mul_ps(r5,mul1);r6=_mm_mul_ps(r6,mul1);r7=_mm_mul_ps(r7,mul1);r8=_mm_mul_ps(r8,mul1);r9=_mm_mul_ps(r9,mul1);rA=_mm_mul_ps(rA,mul1);rB=_mm_mul_ps(rB,mul1);编译器将使用SIMD模式编译为vmulpsxmm0,xmm6,xmm4的语句,这样就构成了AVX-128向量计算乘法的基本计算部分;步骤3:AVX128BitFMA;融合乘加指令集分两种,基于Intel处理器支持的为FMA3,基于AMDBulldozer和Piledriver架构处理器的为FMA4指令集,这两者之间的区别在于支持的操作数有不同,FMA3指令可实现三操作数的融合乘加指令,即完成单指令A=(A+B)*C的计算,四操作数的FMA4指令,即...

【专利技术属性】
技术研发人员:李艳兵陆凯林蒋钟文
申请(专利权)人:青岛雷神科技股份有限公司
类型:发明
国别省市:山东,37

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

1