CN108268349B - 一种基于intel avx指令集的浮点峰值计算吞吐测试方法 - Google Patents
一种基于intel avx指令集的浮点峰值计算吞吐测试方法 Download PDFInfo
- Publication number
- CN108268349B CN108268349B CN201810014687.2A CN201810014687A CN108268349B CN 108268349 B CN108268349 B CN 108268349B CN 201810014687 A CN201810014687 A CN 201810014687A CN 108268349 B CN108268349 B CN 108268349B
- Authority
- CN
- China
- Prior art keywords
- mul
- mul1
- add
- mul0
- instruction
- 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.)
- Active
Links
- 238000004364 calculation method Methods 0.000 title claims abstract description 83
- 238000012360 testing method Methods 0.000 title claims abstract description 34
- 238000000034 method Methods 0.000 claims abstract description 9
- 238000004422 calculation algorithm Methods 0.000 claims abstract description 5
- 101100403145 Danio rerio mul1a gene Proteins 0.000 claims description 120
- 230000004927 fusion Effects 0.000 claims description 37
- 238000012546 transfer Methods 0.000 claims description 6
- 238000004590 computer program Methods 0.000 claims description 4
- 101150098557 mul1 gene Proteins 0.000 claims description 4
- 239000011800 void material Substances 0.000 claims description 2
- 238000013461 design Methods 0.000 abstract description 3
- 238000005259 measurement Methods 0.000 description 3
- 239000000654 additive Substances 0.000 description 1
- 230000000996 additive effect Effects 0.000 description 1
- 230000004075 alteration Effects 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000006243 chemical reaction Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000010438 heat treatment Methods 0.000 description 1
- 238000013507 mapping Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000012545 processing Methods 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/22—Detection or location of defective computer hardware by testing during standby operation or during idle time, e.g. start-up testing
- G06F11/2205—Detection or location of defective computer hardware by testing during standby operation or during idle time, e.g. start-up testing using arrangements specific to the hardware being tested
- G06F11/2236—Detection or location of defective computer hardware by testing during standby operation or during idle time, e.g. start-up testing using arrangements specific to the hardware being tested to test CPU or processors
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/22—Detection or location of defective computer hardware by testing during standby operation or during idle time, e.g. start-up testing
- G06F11/2273—Test methods
-
- 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/3001—Arithmetic instructions
-
- 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]
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Quality & Reliability (AREA)
- Computer Hardware Design (AREA)
- Computational Mathematics (AREA)
- Mathematical Analysis (AREA)
- Mathematical Optimization (AREA)
- Pure & Applied Mathematics (AREA)
- Advance Control (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种基于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吞吐中的设计,找到其基本计算能力的侧重点和性能峰值点。
Description
技术领域
本发明涉及浮点算法领域,具体为一种基于INTEL AVX指令集的浮点峰值计算吞吐测试方法。
背景技术
过去,主流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装入一个128bit SIMD寄存器,B,D,F,H装入另一个128bit SIMD寄存器,然后这两个寄存器相加的指令操作就完成了4次32位浮点计算,也就大大提高了计算效率,如图1所示。
随着CPU的发展,如今向量指令集的位宽也在不断增大,支持的直接指令操作也在不断增加,不同数据类型之间的数据对齐支持,浮点数与整数数据的转换都越来越方便,X86CPU上从MMX到SSE再到AVX,如今AVX512指令集可支持512bit寄存器,同时打包8个64位(双精度浮点)浮点数和16个32位(单精度浮点数),同时为应对一些混合计算如乘法加法并存的计算,引入了FMA(Fused multiply Add)融合乘加指令,如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/512bit SIMD指令集/寄存器的浮点计算峰值。
同时由于当代CPU多核多线程已成为主流,对CPU浮点峰值的计量不仅仅需要考虑SIMD向量指令集的充分利用,还要考虑多线程并发的实现,使其成为高并发,高并行,高向量化的可执行程序。
同时,针对AVX512浮点计算的benchmark,由于为最新的SIMD指令集,需要参照Intel 64and IA-32Architectures Software Developer’s Manual以及Intel C++编译器(ICC编译器)的向量化操作得以实现。
发明内容
本发明的目的在于提供一种基于INTEL AVX指令集的浮点峰值计算吞吐测试方法,在拿到一颗支持向量化指令集的CPU时,可以快速通过该方法软件迅速测的其在加法/减法,乘法或使用融合乘加指令下的浮点计算峰值,并且最大化使用最新向量指令集进行计算,从而准确计算出该CPU能达到的浮点计算峰值,分析CPU在进行矢量计算情况下的基本性能,以及运行类似浮点密集计算的基本运行情况。
为实现上述目的,本发明提供如下技术方案:一种基于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);
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模式编译为vmulps xmm0,xmm6,xmm4的语句,这样就构成了AVX-128向量计算乘法的基本计算部分;
步骤3:AVX 128Bit FMA;
融合乘加指令集分两种,基于Intel处理器支持的为FMA3,基于AMD Bulldozer和Piledriver架构处理器的为FMA4指令集,这两者之间的区别在于支持的操作数有不同,FMA3指令可实现三操作数的融合乘加指令,即完成单指令A=(A+B)*C的计算,四操作数的FMA4指令,即A=(B+C)*D的计算,这样在运作中一次调用的寄存器数量也不同;
FMA3 128bit
同时FMA3主要有4种融合模式,即融合乘加Vfmadd,乘减融合Vfmsub,负的乘加融合Vfnmadd(-(axb)+c),负的乘减融合Vfnmsub(-(axb)-c)
针对三操作数的浮点计算算法,将融合乘加与负的融合乘加指令结合,让CPU执行基于FMA3指令集的融合乘加与负的融合乘加计算,同时加载命令不变,依旧是使用_mm_set1_ps指令,使用融合乘加FMA3需要同时执行三个操作数:
r0=_mm_fmadd_ps(mul0,mul1,r0);
r1=_mm_fmadd_ps(mul0,mul1,r1);
r2=_mm_fmadd_ps(mul0,mul1,r2);
r3=_mm_fmadd_ps(mul0,mul1,r3);
r4=_mm_fmadd_ps(mul0,mul1,r4);
r5=_mm_fmadd_ps(mul0,mul1,r5);
r6=_mm_fmadd_ps(mul0,mul1,r6);
r7=_mm_fmadd_ps(mul0,mul1,r7);
r8=_mm_fmadd_ps(mul0,mul1,r8);
r9=_mm_fmadd_ps(mul0,mul1,r9);
rA=_mm_fmadd_ps(mul0,mul1,rA);
rB=_mm_fmadd_ps(mul0,mul1,rB);
这里fmaddps语句将mul0,mul1和寄存器r0的数据进行融合乘加等价于r0=mul0x mul1+r0将结果存入r0到rb一共12个寄存器中,加上原本mul0与mul1的两个寄存器,一共占用14个寄存器,另一部分使用负的融合乘加指令fnmadd替换fmadd即可;
FMA4 128bit
FMA4指令的代码不同于FMA3的Vfmaddps这类语句,而是_mm_nmacc_ps和_mm_macc_ps这样的语句来执行融合乘加和负的融合乘加操作;
步骤4:AVX 128Bit ADD+Mul;
本步骤采用上述的乘法和加法的部分;
步骤5:AVX 256Bit ADD/Sub;
const__m256mul0=_mm256_set1_ps
const__m256mul1=_mm256_set1_ps,定义装载256位寄存器,同时计算部分要使用256bit定义,加法语句为:
r0=_mm256_add_ps(r0,add0);
步骤6,AVX 256Bit Mul;
同AVX128Bit Mul内容,需在_mm_mul前加入256进行定义即可;
步骤7,AVX 256Bit FMA;
同AVX128Bit FMA内容,需在_mm_fmaddps前加入256进行定义即可;
步骤8,AVX 256Bit ADD+Mul;
同AVX128Bit add与mul内容,需在_mm_addps和_mm_subps前加入256进行定义即可;
步骤9,AVX 512Bit ADD/Sub;
采用512位定义的AVX512 C++语言模式,即_mm512_add_ps和_mm512_sub_ps;
步骤10,AVX 512Bit Mul;
采用512位定义的AVX512 C++语言模式,即_mm512_mul_ps;
步骤11,AVX 512Bit ADD+Mul;
使用乘法与加法结合的形式,乘法和加法都分别计算,使用_mm512_add_ps和_mm512_mul_ps指令执行;
步骤12,AVX 512Bit FMA;
将步骤11的Mul ADD乘法加法指令分别执行,改用FMA指令执行,即_mm512_fmadd_ps;
步骤13,计算过程自动迭代和纳秒级计时;
从pentium开始,很多80x86微处理器都引入TSC,一个用于时间戳计数器的64位的寄存器,它在每个时钟信号到来时加一;计算部分需要while—iterations循环迭代,迭代上十亿次,定义struct结构体关键字,results是定义的结果,具体声明了拥有2个成员的结构体,分别为双精度的flops值和sum总和,flops值即浮点操作次数,定义相应的类名:benchmark,即测试结果,最终表示为Gflops/每秒,在固定的时间内即可,void run将执行线程和时间的值输入,同时每次迭代会有多个block进行计算,各个线程同时记录返回值,最终浮点操作次数=iterations*flops_per_iteration*block_size/seconds,iterations为迭代次数,flops_per_iteration为每次迭代的浮点操作次数,block_size为数据块大小,seconds为秒,以上为测试线程的定义,确定计算的量和flops的结果,将结果除以10亿即为Gflops;
步骤14,针对不同处理器架构:
由于不同时代的处理器支持的指令集不同,所以应当选择合适的指令集编译文件进行测试,以防运行出错,所以针对目前主流CPU,主要分为7个大类:
Core2-SSE 128bit体系
Sandy bridge-AVX体系
Haswell-AVX2 FMA3体系
AMD Bulldozer AVX FMA4体系
AMD Piledriver AVX2 FMA4体系
Intel purley AVX512 FMA3体系
AMD Zen AVX2 FMA3体系
验证处理器是否支持相应指令集才可运行,运行CPUID识别程序即可,识别是否支持AVX-AVX2-FMA3-FMA4-AVX512指令集,CPU信息现在存储于EAX寄存器,检测AVX和FMA指令集;通过读取EAX寄存器相应地址,获取返回值后识别,若不支持相应指令集,则不运行该指令集的浮点计算测试;
步骤15,单线程测试+多线程调用:
该计算程序的执行默认将执行单线程运算,C++11新标准中引入C++11新标准中引入四个头文件来支持多线程编程,他们分别是<atomic>,<thread>,<mutex>,<condition_variable>和<future>;语句std::thread::hardware_concurrency,返回实现支持的并发线程数;当确认支持的线程并发数之后,需要使用std::thread t[num_threads];建立相应数量的线程;
步骤16,显示出测试结果:
当某个计算步骤迭代完成后,将由相应的计算次数与计算的时间进行除法,输出对应的浮点计算次数。
与现有技术相比,本发明的有益效果是:本发明在尽可能短的测试时间下,可针对目前主流X86处理器的向量计算能力做出评估,包含SSE/AVX 128位矢量/256位矢量和512位矢量指令集下的乘加计算能力,实际测试结果可接近理论硬件吞吐峰值,帮助研究人员快速确定该架构处理器在SIMD吞吐中的设计,找到其基本计算能力的侧重点和性能峰值点。
附图说明
图1为4次32位浮点计算流程图;
图2为本发明流程图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
请参阅图2,本发明提供一种技术方案:一种基于INTEL AVX指令集的浮点峰值计算吞吐测试方法,包括以下步骤:进行此类程序编写,需明确需求,要实现的效果是测试CPU的SIMD峰值浮点性能,而还要考虑加法器,乘法器以及FMA融合乘加的吞吐量,同时基于AVX指令集来实现浮点峰值的计算,由于要追求较快速和精确的测试数据,需要对程序执行过程中的实际运行部分进行计时,将最终的浮点计算结果显示出来,单位flops。
首先是计算部分程序的编写,由于要测试矢量化的浮点计算性能,所以我们按先加减,后乘除,最后FMA融合乘加三大计算部分来进行计算,从而得到浮点计算值。
步骤1,AVX 128Bit ADD/Sub,加减:
使用AVX组合浮点计算,首先要对寄存器进行加载操作,将相应数据加载到相应寄存器,这里使用128bit SIMD指令将加法要做的数值加载:const__m128d add0=_mm_set1_pd(x(浮点数))(对应汇编语句vmovups/vmovaps指令),将要进行减计算的初始值装入到另一个128bit SIMD寄存器中:const__m128d sub0=_mm_set1_pd(y(浮点数)),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这样的语句(加法组合计算,XMM为128bit寄存器)或者vsubps xmm0,xmm6,xmm4(减法组合计算)的语句
这样就构成了AVX-128向量计算加法与减法的基本计算部分
步骤2,AVX 128bit Mul,乘;
Mul便是乘法计算的简写,在进行矢量乘法的时候,我们依旧要将数据装载入SIMD寄存器中,且保证对应的单精度和双精度占满SIMD寄存器,如计算32位单精度浮点数时,一个XMM寄存器需打包4个单精度浮点数和2个双精度浮点数乘法计算部分仍然为之前的数据加载,加载至mul0.mul1两个寄存器中,但计算部分调用12个寄存器,进行4组乘法计算(相当于48次128bit乘法),对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模式编译为vmulps xmm0,xmm6,xmm4这样的语句(乘法组合计算,XMM为128bit寄存器)这样就构成了AVX-128向量计算乘法的基本计算部分
步骤3,AVX 128Bit FMA,融合乘加;
融合乘加指令集分两种,基于Intel处理器支持的为FMA3,基于AMD Bulldozer和Piledriver架构处理器的为FMA4指令集,这两者之间的区别在于支持的操作数有不同,FMA3指令可实现三操作数的融合乘加指令,即完成单指令A=(A+B)*C的计算(A,B,C三个操作数),四操作数的FMA4指令,即A=(B+C)*D的计算(A,B,C,D为四个操作数),这样在运作中一次调用的寄存器数量也不同。
FMA3 128bit
同时FMA3主要有4种融合模式,即融合乘加Vfmadd,乘减融合Vfmsub,负的乘加融合Vfnmadd(-(axb)+c),负的乘减融合Vfnmsub(-(axb)-c)
针对三操作数的浮点计算算法,可以选择全部为融合乘法加法的模式,也可分不同模式。如融合乘加与融合乘减结合,我们将融合乘加与负的融合乘加指令结合,让CPU执行基于FMA3指令集的融合乘加与负的融合乘加计算,同时加载命令不变,依旧是使用_mm_set1_ps指令,但使用融合乘加FMA3需要同时执行三个操作数
r0=_mm_fmadd_ps(mul0,mul1,r0);
r1=_mm_fmadd_ps(mul0,mul1,r1);
r2=_mm_fmadd_ps(mul0,mul1,r2);
r3=_mm_fmadd_ps(mul0,mul1,r3);
r4=_mm_fmadd_ps(mul0,mul1,r4);
r5=_mm_fmadd_ps(mul0,mul1,r5);
r6=_mm_fmadd_ps(mul0,mul1,r6);
r7=_mm_fmadd_ps(mul0,mul1,r7);
r8=_mm_fmadd_ps(mul0,mul1,r8);
r9=_mm_fmadd_ps(mul0,mul1,r9);
rA=_mm_fmadd_ps(mul0,mul1,rA);
rB=_mm_fmadd_ps(mul0,mul1,rB);
这里fmaddps语句将mul0,mul1和寄存器r0的数据进行融合乘加等价于r0=mul0x mul1+r0将结果存入r0到rb一共12个寄存器中,加上原本mul0与mul1的两个寄存器,一共占用14个寄存器,同理另一部分使用负的融合乘加指令fnmadd替换fmadd即可
FMA4 128bit
FMA4指令的代码不同于FMA3的Vfmaddps这类语句,而是_mm_nmacc_ps和_mm_macc_ps这样的语句来执行融合乘加和负的融合乘加操作代码格式类似于FMA3操作,
例如:rA=_mm_macc_ps(mul0,mul1,rB);
r1=_mm_nmacc_ps(mul0,mul1,r0);
步骤4,AVX 128Bit ADD+Mul
这里可参考上文乘法和加法的部分;
步骤5,AVX 256Bit ADD/Sub(加减)
const__m256mul0=_mm256_set1_ps
const__m256mul1=_mm256_set1_ps,定义装载256位寄存器,同时计算部分要使用256bit定义,如加法语句应该为:
r0=_mm256_add_ps(r0,add0);
步骤6,AVX 256Bit Mul(乘)
参考AVX128Bit Mul内容,仅需在_mm_mul前加入256进行定义即可
步骤7,AVX 256Bit FMA(融合乘加)
参考AVX128Bit FMA内容,仅需在_mm_fmaddps前加入256进行定义即可
步骤8,AVX 256Bit ADD+Mul
参考AVX128Bit add与mul内容,仅需在_mm_addps和_mm_subps前加入256进行定义即可
步骤9,AVX 512Bit ADD/Sub;
采用512位定义的AVX512 C++语言模式,即_mm512_add_ps和_mm512_sub_ps;
步骤10,AVX 512Bit Mul;
采用512位定义的AVX512 C++语言模式,即_mm512_mul_ps;
步骤11,AVX 512Bit ADD+Mul;
使用乘法与加法结合的形式,乘法和加法都分别计算,使用_mm512_add_ps和_mm512_mul_ps指令执行;
步骤12,AVX 512Bit FMA;
将步骤11的Mul ADD乘法加法指令分别执行,改用FMA指令执行,即_mm512_fmadd_ps;
步骤13,计算过程自动迭代和纳秒级计时:
从pentium开始,很多80x86微处理器都引入TSC,一个用于时间戳计数器的64位的寄存器,它在每个时钟信号(CLK,CLK是微处理器中一条用于接收外部振荡器的时钟信号输入引线)到来时加一。
通过它可以计算CPU的主频,比如:如果微处理器的主频是1MHZ的话,那么TSC就会在1秒内增加1000000。除了计算CPU的主频外,还可以通过TSC来测试微处理器其他处理单元的运算速度。
那么如何获取TSC的值呢?可以使用rdtsc,一条读取TSC的指令,它把TSC的低32位存放在EAX寄存器中,把TSC的高32位存放在EDX中,通过获取主频确定CPU执行的时间和周期,由于CPU每周期时间都以纳秒以下计,所以能将时间计数精确到纳秒级
计算部分需要while—iterations循环迭代,迭代上十亿次,
以上为测试线程的定义,确定计算的量和flops的结果;
std::cout<<"GFlops="<<result.flops/1000000000<<std::endl;将结果除以10亿,单位为G flops;
步骤14,针对不同处理器架构:
由于不同时代的处理器支持的指令集不同,所以应当选择合适的指令集编译文件进行测试,以防运行出错,所以针对目前主流CPU,主要分为7个大类
Core2-SSE 128bit体系
Sandy bridge-AVX体系
Haswell-AVX2 FMA3体系
AMD Bulldozer AVX FMA4体系
AMD Piledriver AVX2 FMA4体系
Intel purley AVX512 FMA3体系
AMD Zen AVX2 FMA3体系
需验证处理器是否支持相应指令集才可运行,运行CPUID识别程序即可,识别是否支持AVX-AVX2-FMA3-FMA4-AVX512指令集,CPU信息现在存储于EAX寄存器,检测AVX和FMA指令集。需通过读取EAX寄存器相应地址,获取返回值后才能识别,若不支持相应指令集,则不能运行该指令集的浮点计算测试
步骤15,单线程测试+多线程调用:
一般计算机程序是默认串行计算的,所以,该计算程序的执行默认将执行单线程运算,但这是远远不够的,C++11新标准中引入C++11新标准中引入了四个头文件来支持多线程编程,他们分别是<atomic>,<thread>,<mutex>,<condition_variable>和<future>。语句std::thread::hardware_concurrency,返回实现支持的并发线程数。该值应该被认为只是一个提示。当确认支持的线程并发数之后,需要使用std::thread t[num_threads];建立相应数量的线程
步骤16,显示出测试结果;
当某个计算步骤迭代完成后,将由相应的计算次数(需要计算的计算总量是固定值)与计算的时间进行除法,输出对应的浮点计算次数,实测结果大约为理论值98%以上,由于使用顺序重复数值计算,CPU几乎不需考虑分支预测和缓存映射,能直接表现出几乎全部计算能力。
本发明在尽可能短的测试时间下,可针对目前主流X86处理器的向量计算能力做出评估,包含SSE/AVX 128位矢量/256位矢量和512位矢量指令集下的乘加计算能力,实际测试结果可接近理论硬件吞吐峰值,帮助研究人员快速确定该架构处理器在SIMD吞吐中的设计,找到其基本计算能力的侧重点和性能峰值点。
尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。
Claims (1)
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);
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模式编译为vmulps xmm0,xmm6,xmm4的语句,这样就构成了AVX-128向量计算乘法的基本计算部分;
步骤3:AVX 128Bit FMA;
融合乘加指令集分两种,基于Intel处理器支持的为FMA3,基于AMD Bulldozer和Piledriver架构处理器的为FMA4指令集,这两者之间的区别在于支持的操作数有不同,FMA3指令可实现三操作数的融合乘加指令,即完成单指令A=(A+B)*C的计算,四操作数的FMA4指令,即A=(B+C)*D的计算,这样在运作中一次调用的寄存器数量也不同;
FMA3 128bit
同时FMA3主要有4种融合模式,即融合乘加Vfmadd,乘减融合Vfmsub,负的乘加融合Vfnmadd(-(a*b)+c),负的乘减融合Vfnmsub(-(a*b)-c)
针对三操作数的浮点计算算法,将融合乘加与负的融合乘加指令结合,让CPU执行基于FMA3指令集的融合乘加与负的融合乘加计算,同时加载命令不变,依旧是使用_mm_set1_ps指令,使用融合乘加FMA3需要同时执行三个操作数:
r0=_mm_fmadd_ps(mul0,mul1,r0);
r1=_mm_fmadd_ps(mul0,mul1,r1);
r2=_mm_fmadd_ps(mul0,mul1,r2);
r3=_mm_fmadd_ps(mul0,mul1,r3);
r4=_mm_fmadd_ps(mul0,mul1,r4);
r5=_mm_fmadd_ps(mul0,mul1,r5);
r6=_mm_fmadd_ps(mul0,mul1,r6);
r7=_mm_fmadd_ps(mul0,mul1,r7);
r8=_mm_fmadd_ps(mul0,mul1,r8);
r9=_mm_fmadd_ps(mul0,mul1,r9);
rA=_mm_fmadd_ps(mul0,mul1,rA);
rB=_mm_fmadd_ps(mul0,mul1,rB);
这里Vfmaddps语句将mul0、mul1和寄存器r0的数据进行融合乘加等价于r0=mul0*mul1+r0将结果存入r0到rb一共12个寄存器中,加上原本mul0与mul1的两个寄存器,一共占用14个寄存器,另一部分使用负的融合乘加指令Vfnmadd替换Vfmadd即可;
FMA4 128bit
FMA4指令的代码不同于FMA3的Vfmaddps这类语句,而是_mm_nmacc_ps和_mm_macc_ps这样的语句来执行融合乘加和负的融合乘加操作;
步骤4:AVX 128Bit ADD+Mul;
本步骤采用上述的乘法和加法的部分;
步骤5:AVX 256Bit ADD/Sub;
const__m256mul0=_mm256_set1_ps
const__m256mul1=_mm256_set1_ps,定义装载256位寄存器,同时计算部分要使用256bit定义,加法语句为:
r0=_mm256_add_ps(r0,add0);
步骤6,AVX 256Bit Mul;
同AVX128Bit Mul内容,需在_mm_mul前加入256进行定义即可;
步骤7,AVX 256Bit FMA;
同AVX128Bit FMA内容,需在_mm_fmadd_ps前加入256进行定义即可;
步骤8,AVX 256Bit ADD+Mul;
同AVX128Bit ADD与Mul内容,需在_mm_add_ps和_mm_sub_ps前加入256进行定义即可;
步骤9,AVX 512Bit ADD/Sub;
采用512位定义的AVX512 C++语言模式,即_mm512_add_ps和_mm512_sub_ps;
步骤10,AVX 512Bit Mul;
采用512位定义的AVX512 C++语言模式,即_mm512_mul_ps;
步骤11,AVX 512Bit ADD+Mul;
使用乘法与加法结合的形式,乘法和加法都分别计算,使用_mm512_add_ps和_mm512_mul_ps指令执行;
步骤12,AVX 512Bit FMA;
将步骤11的Mul、ADD乘法加法指令分别执行,改用FMA指令执行,即_mm512_fmadd_ps;
步骤13,计算过程自动迭代和纳秒级计时;
从pentium开始,很多80x86微处理器都引入TSC,一个用于时间戳计数器的64位的寄存器,它在每个时钟信号到来时加一;计算部分需要while—iterations循环迭代,迭代上十亿次,定义struct结构体关键字,results是定义的结果,具体声明了拥有2个成员的结构体,分别为双精度的flops值和sum总和,flops值即浮点操作次数,定义相应的类名:benchmark,即测试结果,最终表示为Gflops/每秒,在固定的时间内即可,void run将执行线程和时间的值输入,同时每次迭代会有多个block进行计算,各个线程同时记录返回值,最终浮点操作次数=iterations*flops_per_iteration*block_size/seconds,iterations为迭代次数,flops_per_iteration为每次迭代的浮点操作次数,block_size为数据块大小,seconds为秒,以上为测试线程的定义,确定计算的量和flops的结果,将结果除以10亿即为Gflops;
步骤14,针对不同处理器架构:
由于不同时代的处理器支持的指令集不同,所以应当选择合适的指令集编译文件进行测试,以防运行出错,所以针对目前主流CPU,主要分为7个大类:
Core2-SSE 128bit体系
Sandy bridge-AVX体系
Haswell-AVX2 FMA3体系
AMD Bulldozer AVX FMA4体系
AMD Piledriver AVX2 FMA4体系
Intel purley AVX512 FMA3体系
AMD Zen AVX2 FMA3体系
验证处理器是否支持相应指令集才可运行,运行CPUID识别程序即可,识别是否支持AVX-AVX2-FMA3-FMA4-AVX512指令集,CPU信息现在存储于EAX寄存器,检测AVX和FMA指令集;通过读取EAX寄存器相应地址,获取返回值后识别,若不支持相应指令集,则不运行该指令集的浮点计算测试;
步骤15,单线程测试+多线程调用:
该计算程序的执行默认将执行单线程运算,C++11新标准中引入C++11新标准中引入四个头文件来支持多线程编程,他们分别是<atomic>,<thread>,<mutex>,<condition_variable>和<future>;语句std::thread::hardware_concurrency,返回实现支持的并发线程数;当确认支持的线程并发数之后,需要使用std::thread t[num_threads];建立相应数量的线程;
步骤16,显示出测试结果:
当某个计算步骤迭代完成后,将由相应的计算次数与计算的时间进行除法,输出对应的浮点计算次数。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810014687.2A CN108268349B (zh) | 2018-01-08 | 2018-01-08 | 一种基于intel avx指令集的浮点峰值计算吞吐测试方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810014687.2A CN108268349B (zh) | 2018-01-08 | 2018-01-08 | 一种基于intel avx指令集的浮点峰值计算吞吐测试方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108268349A CN108268349A (zh) | 2018-07-10 |
CN108268349B true CN108268349B (zh) | 2021-05-18 |
Family
ID=62773172
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810014687.2A Active CN108268349B (zh) | 2018-01-08 | 2018-01-08 | 一种基于intel avx指令集的浮点峰值计算吞吐测试方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108268349B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110321161B (zh) * | 2019-06-26 | 2021-03-02 | 中国人民解放军国防科技大学 | 使用simd指令的向量函数快速查表法、系统及介质 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102591616A (zh) * | 2011-12-29 | 2012-07-18 | 北京并行科技有限公司 | 浮点计算性能确定装置和方法 |
CN103019647A (zh) * | 2012-11-28 | 2013-04-03 | 中国人民解放军国防科学技术大学 | 具有浮点精度保持功能的浮点累加/累减运算方法 |
CN103514081A (zh) * | 2012-06-29 | 2014-01-15 | 上海宽带技术及应用工程研究中心 | 反映计算机设备运算能效的测试方法 |
US9332612B1 (en) * | 2014-02-25 | 2016-05-03 | Lumenetix, Inc. | System and method for rapidly generating color models for LED-based lamps |
CN106354616A (zh) * | 2016-08-18 | 2017-01-25 | 北京并行科技股份有限公司 | 监测应用执行性能的方法、装置及高性能计算系统 |
CN106790529A (zh) * | 2016-12-20 | 2017-05-31 | 北京并行科技股份有限公司 | 计算资源的调度方法、调度中心及调度系统 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10133577B2 (en) * | 2012-12-19 | 2018-11-20 | Intel Corporation | Vector mask driven clock gating for power efficiency of a processor |
-
2018
- 2018-01-08 CN CN201810014687.2A patent/CN108268349B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102591616A (zh) * | 2011-12-29 | 2012-07-18 | 北京并行科技有限公司 | 浮点计算性能确定装置和方法 |
CN103514081A (zh) * | 2012-06-29 | 2014-01-15 | 上海宽带技术及应用工程研究中心 | 反映计算机设备运算能效的测试方法 |
CN103019647A (zh) * | 2012-11-28 | 2013-04-03 | 中国人民解放军国防科学技术大学 | 具有浮点精度保持功能的浮点累加/累减运算方法 |
US9332612B1 (en) * | 2014-02-25 | 2016-05-03 | Lumenetix, Inc. | System and method for rapidly generating color models for LED-based lamps |
CN106354616A (zh) * | 2016-08-18 | 2017-01-25 | 北京并行科技股份有限公司 | 监测应用执行性能的方法、装置及高性能计算系统 |
CN106790529A (zh) * | 2016-12-20 | 2017-05-31 | 北京并行科技股份有限公司 | 计算资源的调度方法、调度中心及调度系统 |
Non-Patent Citations (3)
Title |
---|
Advanced SIMD: Extending the reach of contemporary SIMD architectures;Matthias Boettcher;《2014 Design, Automation & Test in Europe Conference & Exhibition (DATE)》;20140421;全文 * |
Compiling C/C++ SIMD Extensions for Function and Loop Vectorizaion on Multicore-SIMD Processors;Xinmin Tian;《2012 IEEE 26th International Parallel and Distributed Processing Symposium Workshops & PhD Forum》;20120820;全文 * |
Minix操作系统的分析、改进与测评;刘珊珊;《中国优秀硕士学位论文全文数据库》;20091130;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN108268349A (zh) | 2018-07-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Tagliavini et al. | A transprecision floating-point platform for ultra-low power computing | |
Smith et al. | Vector instruction set support for conditional operations | |
US20190005161A1 (en) | Processors, methods, and systems for a configurable spatial accelerator with performance, correctness, and power reduction features | |
Mach et al. | A transprecision floating-point architecture for energy-efficient embedded computing | |
US5923871A (en) | Multifunctional execution unit having independently operable adder and multiplier | |
Yu et al. | Vector processing as a soft-core CPU accelerator | |
KR20080094833A (ko) | 마이크로프로세서의 패킹된 가산-감산 연산 | |
GB2454201A (en) | Combined Magnitude Detection and Arithmetic Operation | |
JP2008250471A (ja) | 再構成可能なsimd型プロセッサ | |
Rupley et al. | The floating-point unit of the jaguar x86 core | |
Qui et al. | Design and implementation of a 256-bit RISC-V-based dynamically scheduled very long instruction word on FPGA | |
Bonet et al. | SPARROW: a low-cost hardware/software co-designed SIMD microarchitecture for AI operations in space processors | |
CN108268349B (zh) | 一种基于intel avx指令集的浮点峰值计算吞吐测试方法 | |
Xu et al. | Bitslice vectors: A software approach to customizable data precision on processors with simd extensions | |
US7793072B2 (en) | Vector execution unit to process a vector instruction by executing a first operation on a first set of operands and a second operation on a second set of operands | |
Jeangoudoux et al. | A correctly rounded mixed-radix fused-multiply-add | |
Huang et al. | Efficient multimedia coprocessor with enhanced SIMD engines for exploiting ILP and DLP | |
Starke et al. | Evaluating the design of a VLIW processor for real-time systems | |
Connors et al. | Exploring alternative flexible OpenCL (FlexCL) core designs in FPGA-based MPSoC systems | |
Fellows | A comparative study of the effects of parallelization on arm and intel based platforms | |
Støle | The Cost of Packed SIMD: Implementation and Evaluation of the Risc-V P-extension on Ibex | |
Mego et al. | A tool for VLIW processors code optimizing | |
Vega et al. | On-line decimal adder with RBCD representation | |
Mignotte et al. | Synthesis for mixed arithmetic | |
Mahalingam et al. | Adapting barrel shifter at compilation level for efficient implementation of multiplications |
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 | ||
CB03 | Change of inventor or designer information |
Inventor after: Li Yanbing Inventor after: Lu Kailin Inventor after: Jiang Zhongwen Inventor before: Li Yanbing Inventor before: Lu Kailin Inventor before: Jiang Zhongwen |
|
CB03 | Change of inventor or designer information | ||
GR01 | Patent grant | ||
GR01 | Patent grant |