CN108268349A - 一种基于intel avx指令集的浮点峰值计算吞吐测试算法 - Google Patents

一种基于intel avx指令集的浮点峰值计算吞吐测试算法 Download PDF

Info

Publication number
CN108268349A
CN108268349A CN201810014687.2A CN201810014687A CN108268349A CN 108268349 A CN108268349 A CN 108268349A CN 201810014687 A CN201810014687 A CN 201810014687A CN 108268349 A CN108268349 A CN 108268349A
Authority
CN
China
Prior art keywords
mul
mul1
mul0
add
avx
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.)
Granted
Application number
CN201810014687.2A
Other languages
English (en)
Other versions
CN108268349B (zh
Inventor
李艳兵
陆凯林
蒋钟文
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Qingdao Thunder God Polytron Technologies Inc
Original Assignee
Qingdao Thunder God Polytron Technologies Inc
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Qingdao Thunder God Polytron Technologies Inc filed Critical Qingdao Thunder God Polytron Technologies Inc
Priority to CN201810014687.2A priority Critical patent/CN108268349B/zh
Publication of CN108268349A publication Critical patent/CN108268349A/zh
Application granted granted Critical
Publication of CN108268349B publication Critical patent/CN108268349B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/22Detection or location of defective computer hardware by testing during standby operation or during idle time, e.g. start-up testing
    • G06F11/2205Detection 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/2236Detection 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
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/22Detection or location of defective computer hardware by testing during standby operation or during idle time, e.g. start-up testing
    • G06F11/2273Test methods
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/3001Arithmetic instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3885Concurrent instruction execution, e.g. pipeline, look ahead using a plurality of independent parallel functional units
    • G06F9/3887Concurrent instruction execution, e.g. pipeline, look ahead using a plurality of independent parallel functional units controlled by a single instruction for multiple data lanes [SIMD]

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指令集的浮点峰值计算吞吐测试算法
技术领域
本发明涉及浮点算法领域,具体为一种基于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=mul0xmul1+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
同上一步骤;
步骤10,AVX 512Bit Mul
同上一步骤;
步骤11,AVX 512Bit ADD+Mul
同上一步骤;
步骤12,AVX 512Bit FMA
同上一步骤,但AVX512指令集支持需集成ICC编译器支持,才能将C++语句编译为AVX512汇编语句;
步骤13,计算过程自动迭代和纳秒级计时;
从pentium开始,很多80x86微处理器都引入TSC,一个用于时间戳计数器的64位的寄存器,它在每个时钟信号到来时加一;
计算部分需要while—iterations循环迭代,迭代最好上十亿次,1G次
以上为测试线程的定义,确定计算的量和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,显示出测试结果:
当某个计算步骤迭代完成后,将由相应的计算次数与计算的时间进行除法,输出对应的浮点计算次数。
与现有技术相比,本发明的有益效果是:本发明在尽可能短的测试时间下,可针对目前主流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=mul0xmul1+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
以此类推;
步骤10,AVX 512Bit Mul
以此类推;
步骤11,AVX 512Bit ADD+Mul
以此类推;
步骤12,AVX 512Bit FMA
以此类推,但AVX512指令集支持需集成ICC编译器支持,才能将C++语句编译为AVX512汇编语句;
步骤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循环迭代,迭代最好上十亿次,1G次
以上为测试线程的定义,确定计算的量和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::threadt[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,基于AMDBulldozer和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=mul0xmul1+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
同上一步骤;
步骤10,AVX 512Bit Mul
同上一步骤;
步骤11,AVX 512Bit ADD+Mul
同上一步骤;
步骤12,AVX 512Bit FMA
同上一步骤,但AVX512指令集支持需集成ICC编译器支持,才能将C++语句编译为AVX512汇编语句;
步骤13,计算过程自动迭代和纳秒级计时;
从pentium开始,很多80x86微处理器都引入TSC,一个用于时间戳计数器的64位的寄存器,它在每个时钟信号到来时加一;
计算部分需要while—iterations循环迭代,迭代最好上十亿次,1G次
以上为测试线程的定义,确定计算的量和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,显示出测试结果:
当某个计算步骤迭代完成后,将由相应的计算次数与计算的时间进行除法,输出对应的浮点计算次数。
CN201810014687.2A 2018-01-08 2018-01-08 一种基于intel avx指令集的浮点峰值计算吞吐测试方法 Active CN108268349B (zh)

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 true CN108268349A (zh) 2018-07-10
CN108268349B 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)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110321161A (zh) * 2019-06-26 2019-10-11 中国人民解放军国防科技大学 使用simd指令的向量函数快速查表法、系统及介质

Citations (7)

* Cited by examiner, † Cited by third party
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 上海宽带技术及应用工程研究中心 反映计算机设备运算能效的测试方法
US20150220345A1 (en) * 2012-12-19 2015-08-06 Intel Corporation Vector mask driven clock gating for power efficiency of a processor
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 北京并行科技股份有限公司 计算资源的调度方法、调度中心及调度系统

Patent Citations (7)

* Cited by examiner, † Cited by third party
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 中国人民解放军国防科学技术大学 具有浮点精度保持功能的浮点累加/累减运算方法
US20150220345A1 (en) * 2012-12-19 2015-08-06 Intel Corporation Vector mask driven clock gating for power efficiency of a processor
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)

* Cited by examiner, † Cited by third party
Title
MATTHIAS BOETTCHER: "Advanced SIMD: Extending the reach of contemporary SIMD architectures", 《2014 DESIGN, AUTOMATION & TEST IN EUROPE CONFERENCE & EXHIBITION (DATE)》 *
XINMIN TIAN: "Compiling C/C++ SIMD Extensions for Function and Loop Vectorizaion on Multicore-SIMD Processors", 《2012 IEEE 26TH INTERNATIONAL PARALLEL AND DISTRIBUTED PROCESSING SYMPOSIUM WORKSHOPS & PHD FORUM》 *
刘珊珊: "Minix操作系统的分析、改进与测评", 《中国优秀硕士学位论文全文数据库》 *

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110321161A (zh) * 2019-06-26 2019-10-11 中国人民解放军国防科技大学 使用simd指令的向量函数快速查表法、系统及介质

Also Published As

Publication number Publication date
CN108268349B (zh) 2021-05-18

Similar Documents

Publication Publication Date Title
Waidyasooriya et al. OpenCL-based FPGA-platform for stencil computation and its optimization methodology
Saavedra-Barrera et al. Machine characterization based on an abstract high-level language machine
Ernst Embedded program timing analysis based on path clustering and architecture classification
Ubal et al. Multi2Sim: A simulation framework for CPU-GPU computing
Stephenson et al. Bidwidth analysis with application to silicon compilation
Dubey et al. Instruction window size trade-offs and characterization of program parallelism
WO2013040271A1 (en) Vectorization of machine level scalar instructions in a computer program during execution of the computer program
CN108268349A (zh) 一种基于intel avx指令集的浮点峰值计算吞吐测试算法
Qui et al. Design and implementation of a 256-bit RISC-V-Based dynamically scheduled very long instruction word on FPGA
Févotte et al. Debugging and optimization of HPC programs in mixed precision with the Verrou tool
Brown et al. Profiling floating point value ranges for reconfigurable implementation
Zhang et al. Modelling SAMIPS: A synthesisable asynchronous MIPS processor
Starke et al. Evaluating the design of a VLIW processor for real-time systems
Saavedra-Barrera Machine characterization and benchmark performance prediction
Kwack et al. Roofline-based performance efficiency of hpc benchmarks and applications on current generation of processor architectures
Connors et al. Exploring alternative flexible OpenCL (FlexCL) core designs in FPGA-based MPSoC systems
Weiland et al. Benchmarking for power consumption monitoring: Description of benchmarks designed to expose power usage characteristics of parallel hardware systems, and preliminary results
Singh An Empirical Study of Programming Languages from the Point of View of Scientific Computing
CN102262553A (zh) 一种基于龙芯3b的线性系统软件包优化方法
Pandey Resolving control hazard by reconstituting processor's pipeline organization
Vianney et al. Performance analysis and visualization tools for cell/be multicore environment
Itzhak et al. Performance scalability and dynamic behavior of Parsec benchmarks on many-core processors
Yilmaz et al. Program analysis for process migration
Lilja When all else fails, guess: The use of speculative multithreading for high-performance computing
Gustafsson WCET challenge 2006–technical report

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