CN116594682A - 基于simd库的自动测试方法及装置 - Google Patents
基于simd库的自动测试方法及装置 Download PDFInfo
- Publication number
- CN116594682A CN116594682A CN202310375698.4A CN202310375698A CN116594682A CN 116594682 A CN116594682 A CN 116594682A CN 202310375698 A CN202310375698 A CN 202310375698A CN 116594682 A CN116594682 A CN 116594682A
- Authority
- CN
- China
- Prior art keywords
- simd
- library
- test
- user
- performance
- 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
- 238000012360 testing method Methods 0.000 title claims abstract description 70
- 238000000034 method Methods 0.000 claims abstract description 21
- 238000011056 performance test Methods 0.000 claims abstract description 11
- 238000010998 test method Methods 0.000 claims abstract description 5
- 230000006870 function Effects 0.000 claims description 58
- 238000010276 construction Methods 0.000 claims description 8
- 238000004590 computer program Methods 0.000 claims description 6
- 238000007620 mathematical function Methods 0.000 claims description 3
- 239000013598 vector Substances 0.000 description 25
- 239000008186 active pharmaceutical agent Substances 0.000 description 19
- 238000012545 processing Methods 0.000 description 6
- 238000005516 engineering process Methods 0.000 description 4
- 238000007667 floating Methods 0.000 description 4
- 238000004364 calculation method Methods 0.000 description 3
- 238000010586 diagram Methods 0.000 description 3
- 101000573447 Homo sapiens Multiple inositol polyphosphate phosphatase 1 Proteins 0.000 description 2
- 102100026284 Multiple inositol polyphosphate phosphatase 1 Human genes 0.000 description 2
- 230000001133 acceleration Effects 0.000 description 2
- 238000013459 approach Methods 0.000 description 2
- 238000013473 artificial intelligence Methods 0.000 description 2
- 230000008901 benefit Effects 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 238000011176 pooling Methods 0.000 description 2
- 101100285899 Saccharomyces cerevisiae (strain ATCC 204508 / S288c) SSE2 gene Proteins 0.000 description 1
- 238000004422 calculation algorithm Methods 0.000 description 1
- 125000004122 cyclic group Chemical group 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 230000000873 masking effect Effects 0.000 description 1
- 239000011159 matrix material Substances 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 229910052754 neon Inorganic materials 0.000 description 1
- GKAOGPIIYCISHV-UHFFFAOYSA-N neon atom Chemical compound [Ne] GKAOGPIIYCISHV-UHFFFAOYSA-N 0.000 description 1
- 238000005457 optimization Methods 0.000 description 1
- 238000004806 packaging method and process Methods 0.000 description 1
- 238000005096 rolling process Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/73—Program documentation
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Library & Information Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Test And Diagnosis Of Digital Computers (AREA)
Abstract
本发明提出了一种基于SIMD库的自动测试方法及装置。所述方法包括:获取用户目标和待测应用程序;基于不同的SIMD库向量化所述待测应用程序,得到各SIMD库对应的源文件;根据所述源文件,生成各SIMD库对应的新文件;在用户目标为代码大小测试的情况下,对所述新文件进行编译,得到目标文件,并基于所述目标文件中text section,得到代码大小最小的SIMD库;在用户目标为性能测试的情况下,通过将测试核心代码嵌入到所述新文件后进行性能测试,得到性能最佳的SIMD库。本发明能够帮助用户准确地找到目标应用程序在满足用户需求的情况下合适的SIMD库后端。
Description
技术领域
本发明属于计算机软件工程技术领域,尤其涉及一种基于SIMD库的自动测试方法及装置。
背景技术
SIMD(单指令多数据)是一种经典的计算模式,它最初被引入于向量机,如今它是大多数商用微处理器不可或缺的功能。SIMD扩展描述的是在微处理器中以单个指令就能完成多个数据的并行处理,其所用寄存器是独有的SIMD寄存器,一个寄存器上能够存储多个数据。在计算的时候,寄存器上的多个数据同时进行计算而不是单个数据按照顺序去计算,以此实现了数据的并行处理。随着人们对程序处理性能的要求的提高,SIMD寄存器也在不断地变大。拿英特尔举例来说,从一开始为图像处理而引入的MMX技术到专门为SIMD引入的指令集SSE、SSE2、SSE3、SSE4以及高级向量扩展AVX和AVX2。2013年还引入了AVX-512,一个SIMD寄存器的容量是512位,能存放16个单精度浮点数同时运算,或者8个双精度浮点数同时运算。另外,SIMD指令集扩展也已经出现在了ARM、PowerPC和RISC-V架构中,例如ARM架构的NEON和SVE,PowerPC的VMX和RISC-V的vector向量扩展。SIMD技术有助于提高多线程应用和矩阵计算的性能,广泛应用于计算机图形学、视频编解码、音频处理、信号处理等领域。
为了能够应用到底层的SIMD单元,程序代码必须首先通过向量化来适应底层硬件。向量化是一种编程技术,可以通过将一个单一的指令应用于多个数据来提高程序的并行性能。其中最简便的方式就是编译器的自动向量化。这些编译器实现一个或多个自动向量化通道,通常应用循环向量化和超字级并行(SLP)。在这样的优化通道过程中,编译器会分析代码并寻找可以从标量转换到向量的指令,然后将其转换为相应的向量指令。对于传统的自动循环向量化,这种方法对于符合规则的诱导变量和静态可分析的循环间和循环内预测都是成功的,但它无法对具有复杂控制流或结构化数据布局的代码进行向量化。因此,为了能够更好地利用SIMD的性能,开发人员可能需要手动向量化代码。这可能需要深入了解SIMD指令集和编写特定于底层硬件的代码,并且可能会导致代码可移植性问题。
当程序员选择使用intrinsics函数对代码进行手动向量化时,他们需要花费更多的精力来编写代码。intrinsics是一种底层函数,用于实现处理器架构中的所有SIMD指令。虽然它们处于比汇编编程更高的抽象层次,但使用它们进行编码也有一些缺点,例如工作量、可移植性和兼容性。尽管如此,intrinsic编码仍然被认为是最先进的,可以获得最大的性能收益,因为它的底层方法可以有效地利用硬件。
在使用SIMD技术进行编程时,我们需要在工作量和性能之间进行权衡。为了找到一个平衡点,研究人员一直在研究开发更方便的编程模型,既可以提供良好的性能,又能减少工作量。由于SIMD指令集的移植性、兼容性和工作量大等问题,目前已经有许多SIMD高级抽象库,如VCL、Vc、highway、MIPP和xsimd等。这些库主要通过C++的模板编程技术来封装不同架构的intrinsics函数,在intrinsics级之上抽象一层,消除intrinsics函数的细节,提供可读性良好、可移植性良好的接口供用户使用。这些库能够在保留intrinsics编程的高性能的同时,解决SIMD指令集的不可移植性、不可兼容性和工作量大等问题
引入SIMD库之后,虽然解决了在保留高性能的情况下的可移植性和可兼容性问题,但是,到目前为止越来越多的SIMD库涌现出来。例如,VCL、Vc、highway、MIPP、xsimd、EVE、tsimd、nsimd、std_simd、Simde、ume::simd等等。可是,不同的SIMD库支持不同的架构不同,性能好坏不同,生成的代码大小不同,支持的元素类型不同。由于SIMD库的众多,用户在使用其对自己的应用程序进行向量化加速时,不清楚如何去选择合适的SIMD库。
发明内容
为了解决以上所提出的问题,本发明提供一种基于SIMD库的自动测试方法及装置,能够帮助用户准确地找到目标应用程序在满足用户需求的情况下合适的SIMD库后端。
本发明的技术内容包括:
一种基于SIMD库的自动测试方法,所述方法包括:
获取用户目标和待测应用程序;
基于不同的SIMD库向量化所述待测应用程序,得到各SIMD库对应的源文件;
根据所述源文件,生成各SIMD库对应的新文件;
在用户目标为代码大小测试的情况下,对所述新文件进行编译,得到目标文件,并基于所述目标文件中text section,得到代码大小最小的SIMD库;
在用户目标为性能测试的情况下,通过将测试核心代码嵌入到所述新文件后进行性能测试,得到性能最佳的SIMD库。
进一步地,所述基于不同的SIMD库向量化所述待测应用程序,得到各SIMD库对应的源文件,包括:
在各个SIMD库之上抽象出一通用API;其中,所述通用API通过重载SIMD库个数个版本的代码依次来让编译器选择匹配的SIMD库,以实现同一函数接口对应不同的SIMD库的相应函数的实现,所述通用API提供的函数包括:基本算术运算、存储加载、reduce操作、数学函数、掩码操作和逻辑运算。
将所述待测应用程序送入所述通用API,以得到各SIMD库对应的源文件。
进一步地,所述通用API包括:单指令多数据和单程序多数据;其中,所述单指令多数据为底层的SIMD指令,所述单程序多数据为有若干个不同的实例化程序,且实例化程序之间不存在依赖。
进一步地,所述根据所述源文件,生成各SIMD库对应的新文件之后,还包括:
检测是否获取本机架构参数,并在未获取本机架构参数的情况下,自动检测本机架构,以得到本机架构参数;
根据本机架构参数,获取支持本机架构的SIMD库;
对支持本机架构的SIMD库进行用户目标的测试。
进一步地,所述根据所述源文件,生成各SIMD库对应的新文件之后,还包括:
检测编译器路径是否为空;
在所述编译器路径是为空的情况下,选择系统默认编译器路径;
在所述编译器路径是不为空的情况下,选择用户指定的编译器路径。
进一步地,所述在用户目标为性能测试的情况下,通过将测试核心代码嵌入到所述新文件后进行性能测试,得到性能最佳的SIMD库,包括:
判断测试函数名是否为main函数;
若是main函数,则在main函数内部插入测试核心代码,以生成测试程序;
若不是main函数,则删除main函数并插入测试核心代码,以生成测试程序;
在测试函数参数正确的情况下,基于所述测试程序,得到性能最佳的SIMD库。
进一步地,所述测试核心代码的测试性能包括:最大运行时间、最小运行时间、性能的平均值、性能的中位数、性能的标准差和运行次数中的一种或多种。
一种基于SIMD库的自动测试装置,所述装置包括:
获取模块,用于获取用户目标和待测应用程序;
通用API,用于基于不同的SIMD库向量化所述待测应用程序,得到各SIMD库对应的源文件;
autobench模块,用于根据所述源文件,生成各SIMD库对应的新文件;在用户目标为代码大小测试的情况下,对所述新文件进行编译,得到目标文件,并基于所述目标文件中text section,得到代码大小最小的SIMD库;在用户目标为性能测试的情况下,通过将测试核心代码嵌入到所述新文件后进行性能测试,得到性能最佳的SIMD库。
一种电子设备,其特征在于,所述电子设备包括:处理器以及存储有计算机程序指令的存储器;所述处理器执行所述计算机程序指令时实现上述任一所述方法。
一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序指令,所述计算机程序指令被处理器执行时实现上述任一所述方法。
与现有技术相比,本发明能够帮助用户准确地找到此刻所写的应用程序在满足用户需求的情况下合适的SIMD库后端,并且提供了一套不同领域的benchmark以供用户以及库开发人员发掘底层SIMD单元的利用率,以及通过不同领域具有代表性的benchmark来判断不同的SIMD库对哪种领域更友好。
附图说明
图1是本发明的系统整体架构图。
图2是本发明的autobench前端架构图。
图3是本发明的后端架构图。
图4是本发明的方法流程图。
具体实施方式
为使本发明要解决的技术问题、技术方案和优点更加清楚,下面通过其具体实施例,并结合附图,对本发明做进一步详细说明。
目前,各个领域的算法都在通过向量化来利用底层的SIMD单元来提高性能。比如,在人工智能领域中频繁出现的卷积运算和池化运算。然而,由于市面上有太多的SIMD库可供选择,用户不知道如何选择最适合他们应用程序所在领域的SIMD库进行向量化。更确切地说,缺少一套可用来评估各个SIMD库在各个领域的性能或者生成代码大小的基准测试,这也是第一个问题。
另外,有些SIMD基准测试集是采用汇编语言、GCC vector extension和利用宏包裹的intrinsics函数来向量化标量代码,以探索底层SIMD单元的特性。但是,这些方法都有一些弊端。汇编语言可读性不强,而且极度依赖于架构和指令集,这使得同一版本的代码无法应用于不同的架构和指令集。此外,汇编语言的编写要求很高,对于普通程序员来说并不容易学习。GCC Vector Extensions为C和C++提供了跨架构的向量代码可移植性,但是它的使用仍然受限于GCC提供的操作和builtin函数。另外,利用宏包裹的intrinsics函数并没有真正地隐藏架构和指令集之间的差异,实际上并不支持可移植性。这就需要为不同的SIMD指令集中的类别和操作定义大量的宏,这样会增加工作量并降低代码可读性。这也是第二个问题:有些SIMD基准测试集是采用汇编语言、GCC vector extension、利用宏包裹的intrinsics函数来向量化标量代码,这三种方法有的不支持可移植性,有的局限性太强。
在比较不同SIMD高级抽象库的性能时,由于每个库提供的用户API不同,因此需要为每个库编写多份benchmark代码。这会导致代码复用性差、冗余代码较多,这是第三个问题。另外,由于SIMD库的众多,用户在使用其对自己的应用程序进行向量化加速时,不清楚如何去选择合适的SIMD库,这是第四个问题。
针对上述问题,如图1-3所示,本发明在众多不同的SIMD库之上抽象一层统一的API,并把不同的SIMD库实现做为统一API的后端(到这里解决了第三个问题);我们提供了一套利用统一的API编写不同领域的benchmark代码包括人工智能领域的卷积和池化benchmark、经济学领域的blackscholes、数学领域的mandelbrot及julia等等具有代表性的benchmark(到这里解决了第一和第二个问题);考虑到以上提到的各个领域的经典的benchmark虽然具有代表性,但是不能代表该领域所有程序都适合此SIMD库。因此我们提供了一个自动测试系统,当用户使用我们提供的API编写向量化代码时,可以利用该自动测试系统进行实时测试并选择符合用户需求的SIMD库后端(到这里解决了第四个问题)。
即用户利用本发明提供的API手动向量化自己的应用程序作为autobench的输入,另外用户需要指明应用程序中需要测试的函数作为参数传入autobench。如果用户希望测试整个文件,则传入main函数即可。另外,由于不同的编译器和编译参数对性能或者生成代码的影响不同,所以用户还需要输入本机中想要测试的编译器路径和编译参数作为autobench的输入。最后,根据用户的需求,是希望得到性能最佳抑或是生成代码最小,作为目标传入。传入以上各个参数之后,autobench会实时测试该应用程序并输出满足用户需求的SIMD后端。
具体来说,本发明的基于SIMD库的自动测试方法,如图4所示,包括以下步骤(1-3)。
步骤1:用户利用本发明提供的通用API手动向量化待测应用程序后得到源文件,将其路径作为autobench输入之一。
用户通过使用本发明提供的通用API提供的各种函数来手动向量化待测试的应用程序,API提供的各种函数包括基本算术运算、存储加载、reduce操作、数学函数、掩码操作和逻辑运算,向量化完成之后的源文件路径作为autobench模块的输入。
在一个实施例中,该通用API的细节如下述。不论是intrinsics函数还是SIMD高级抽象库所提供的函数,它们都是利用了底层的SIMD指令,所以具体还是取决于SIMD指令的操作的类型。不同的SIMD库只是在这些intrinsics函数之上抽象了通俗易懂的接口,使用户更简单容易开发出自己的程序。而每个intrinsic函数通常都会对应一条向量指令,从而这两种编程模型即intrinsics编程和simd高级抽象库就都有了共同的源头。
以x86的AVX2指令集为例,intrinsic提供了三种不同的向量类型,__m256i表示256位长的整数向量类型,__m256和__m256d分别表示256位长的单浮点和双浮点向量类型。而simd高级抽象库通过c++类模板的方式把这些向量类型包裹起来设计出一个可读性强的c++自定义类型,如EVE的wide<Tp>和wide<Tp,fixed<N>>类型。再通过指令集派发的技巧让这些自定义类型静态或动态地选择对应的指令集。不同的simd库的自定义类型的相似性在于基本上都会抽象出两种类型,即选择指定平台最好的指令集类型和用户指定向量长度或指令集的自定义类型。如,xsimd的batch<Tp>和batch<Tp,arch>、nsimd的pack<Tp>和pack<Tp,N>以及std_simd的native_simd<Tp>和fixed_size_simd<Tp,N>。可以看到这些simd库所自定义的类型都有相同特性,一个是根据基本元素类型Tp而选择平台最好的指令集类型,另一个是用户指定向量长度或指令集的自定义类型。因此,本测试系统根据这种相同的特性选择指定平台最好的指令集向量类型作为不同的后端类型xxxx_t_v_native,通过传递不同的后端类型来选择不同的后端,以此来对不同的编程模型进行评估。对于不同simd库所提供的操作,根据所包裹的intrinsics函数大体也可分为以下几种类型:数据移动、规约操作、掩码操作以及shuffles操作。为了实现同一个函数接口对应不同的SIMD库的相应函数的实现,我们重载了SIMD库个数个版本的代码依次来让编译器选择匹配的SIMD库的实现,其中对于一些类型的约束,我们使用了C++20的概念和requires子句的特性。有些特殊的元素类型要求,我们在测试系统的接口处进行了类型的约束,如移位运算需要元素类型为整型以及指数运算需要元素类型为浮点型。另外,对于VCL库的不同的向量类型VecNT,我们为了减少不必要的重载,利用条件编译的方法在编译期获取当前指令集所对应的类型。如在传入-mavx选项的时候,我们就会根据基础元素类型选择Vec8f、Vec4d、Vec8i等不同的类型。依次来确定当前指令集情况下,vcl_t_v_native类型所包裹的VCL类型。为了检测不同的benchmark的语义是否相同,我们设计了test模块,通过检测各个不同重载版本测试系统函数接口的运行结果是否相同来判断。由于不同的benchmark都是通过一套代码来包裹不同simd库的实现,所以说每个SIMD库的代码逻辑都是一样的,因此只需要测试不同的接口是否正确便可知道benchmark的语义是否相同。在代码复用性方面,原本需要写1000多行的代码,现在只需要100多行即可实现。对于后续添加的其他SIMD库,我们可以轻松地创建一个xxx_core.h头文件并按照其他库的包装方式来进行添加,在test模块中只需要在头文件里添加新增的simd库的类型即可,这样大幅增加了代码的复用性。
可选地,本发明通用API可以达到SPMD+SIMD。SIMD就是单指令多数据,也就是API用到了底层的SIMD指令,SPMD就是单程序多数据。SPMD就是同一程序复制到各个处理器上,而不同的数据分布在不同的处理器上。这样在系统中各处理器均运行相同的程序,但对不同的数据执行操作
一示例的代码如下:
AXPY_SIMD<scalar t v<ElemType>,ElemType>(a,x,y,res);
AXPY_SIMD<highway_t v_native<ElemType>,ElemType>(a,x,y,res);
AXPY_SIMD<eve t v native<ElemType>,ElemType>(a,x,y,res);
上述代码中,单程序是指就AXPY_SIMD这一个程序,但是我们对相同的程序传递了三个不同的模板参数,也就有三个不同的实例化程序,而且每个程序之间不存在依赖,这样把三个不同的实例化程序放到三个线程中运行吗,每个线程又用到底层的SIMD指令,这样就可以达到SPMD+SIMD并行了。
步骤2:用户根据自己的需求传入autobench其余的参数。
autobench是通过perl语言编写的脚本程序,内部嵌入测试核心。首先,autobench接收到源文件路径之后复制一个新文件,根据测试需求autobench会把所复制文件中的main函数整体删除掉。随后根据用户输入的所测试的函数名和函数参数以及元素类型(因为元素类型的不同对性能的影响也很大)把测试代码嵌入到所复制的文件中去。通过传入不同的后端类型,再根据用户传入的编译器路径以及编译器参数进行实时测试。随后autobench会把输出内容重定向到一个txt文件中去,利用文本处理筛选出来其中性能最好的SIMD后端类型输出给用户。
关于生成代码大小的实时测试,autobench是通过根据用户传入的源文件路径、编译器路径、编译器参数以及元素类型依次执行不同SIMD后端生成不同的目标文件。随后根据目标文件中text section来输出生成代码大小中最小的SIMD后端类型给用户。
在一个实施例中,用户目标为用户对应用程序待测试的指标,如性能或生成代码大小。编译器路径的选择是选择系统默认编译器路径还是用户特定的编译器路径,由于不同的编译器类型会造成结果的不同,autobench会默认选择默认编译器路径。编译器参数为编译器进行编译时的编译选项,由于不同的编译选项会造成结果的不同,此参数可以省略。元素类型参数为用户在向量化自己的应用程序中向量元素的类型,由于不同的元素类型会造成结果的不同。测试函数名为待测试源文件中特定的函数名,若要测试整个程序,需要传入“main”。测试函数参数为待测试的函数中需要提供的实参。本机架构为autobench所运行的处理器架构类型,如x86、RISCV等,此参数可以省略,autobench会自动检测本机架构类型。
步骤3:autobench会根据所提供的参数对待测试应用程序进行测试,最终输出满足用户目标的SIMD后端类型。
在一个实施例中,本发明对待测试应用程序的测试包括以下步骤(3.1-3.7)
步骤3.1:用户把待测试源文件路径和autobench其余参数作为输入,输入到autobench模块。
步骤3.2:autobench模块首先检测用户是否传入了“本机架构”参数,如若未传入则autobench自动检测本机架构。Autobench根据本机架构参数检测所有simd后端中是否存在支持此架构的库,若不存在则直接结束程序输出错误,若存在则进行步骤3.
步骤3.3:autobench检测编译器路径是否为空,若为空则选择系统默认编译器路径,若不为空则选择用户指定的编译器路径。
步骤3.4:autobench根据用户提供的“用户目标”参数选择是进行性能测试还是代码大小测试。若为代码大小测试则对待测试应用程序进行编译,根据编译之后得到的目标文件.text段计算其生成代码大小最小的SIMD后端作为输出。若为性能测试则进行步骤5。
步骤3.5:autobench判断“测试函数名”参数是否为main函数,若是main函数,则测试整个程序的性能,在main函数内部插入测试核心代码进行测试。若不是main函数按照测试核心的要求则删除main函数并插入测试代码。
步骤3.6:autobench判断“测试函数参数”参数是否正确,若不正确会报错,提示用户输入正确的函数参数。若正确则进行步骤7.
步骤3.7:由autobench提供的测试核心对待测试程序进行测试,最终输出性能最佳的SIMD后端类型。
综上所述,本发明针对如今为解决可读性和移植性问题而涌现的众多SIMD库中出现各种差异性问题,在各个SIMD库之上添加一层抽象,使各个SIMD库成为该测试系统的后端。用户可以直接用我们所提供的统一抽象去编写SIMD向量化代码,但是在选择不同SIMD后端的时候用户可能一时间无法根据自己的需求选择符合自己心里目标的SIMD后端类型。为了减轻用户选择上的困难,我们设计了autobench模块作为我们系统的前端,对于用户输入的源文件、各个参数等autobench模块会在本地实时测试,输出符合用户需求的SIMD后端类型。并且我们还提供了面向不同领域的一套benchmark,是利用我们设计的统一API抽象层编写,以供广大测试人员参考。
本领域的普通技术人员可以对本发明的技术方案进行修改或者等同替换,本发明的保护范围应以权利要求所述为准。
Claims (10)
1.一种基于SIMD库的自动测试方法,其特征在于,所述方法包括:
获取用户目标和待测应用程序;
基于不同的SIMD库向量化所述待测应用程序,得到各SIMD库对应的源文件;
根据所述源文件,生成各SIMD库对应的新文件;
在用户目标为代码大小测试的情况下,对所述新文件进行编译,得到目标文件,并基于所述目标文件中text section,得到代码大小最小的SIMD库;
在用户目标为性能测试的情况下,通过将测试核心代码嵌入到所述新文件后进行性能测试,得到性能最佳的SIMD库。
2.如权利要求1所述的方法,其特征在于,所述基于不同的SIMD库向量化所述待测应用程序,得到各SIMD库对应的源文件,包括:
在各个SIMD库之上抽象出一通用API;其中,所述通用API通过重载SIMD库个数个版本的代码依次来让编译器选择匹配的SIMD库,以实现同一函数接口对应不同的SIMD库的相应函数的实现,所述通用API提供的函数包括:基本算术运算、存储加载、reduce操作、数学函数、掩码操作和逻辑运算。
将所述待测应用程序送入所述通用API,以得到各SIMD库对应的源文件。
3.如权利要求2所述的方法,其特征在于,所述通用API包括:单指令多数据和单程序多数据;其中,所述单指令多数据为底层的SIMD指令,所述单程序多数据为有若干个不同的实例化程序,且实例化程序之间不存在依赖。
4.如权利要求1所述的方法,其特征在于,所述根据所述源文件,生成各SIMD库对应的新文件之后,还包括:
检测是否获取本机架构参数,并在未获取本机架构参数的情况下,自动检测本机架构,以得到本机架构参数;
根据本机架构参数,获取支持本机架构的SIMD库;
对支持本机架构的SIMD库进行用户目标的测试。
5.如权利要求1所述的方法,其特征在于,所述根据所述源文件,生成各SIMD库对应的新文件之后,还包括:
检测编译器路径是否为空;
在所述编译器路径是为空的情况下,选择系统默认编译器路径;
在所述编译器路径是不为空的情况下,选择用户指定的编译器路径。
6.如权利要求1所述的方法,其特征在于,所述在用户目标为性能测试的情况下,通过将测试核心代码嵌入到所述新文件后进行性能测试,得到性能最佳的SIMD库,包括:
判断测试函数名是否为main函数;
若是main函数,则在main函数内部插入测试核心代码,以生成测试程序;
若不是main函数,则删除main函数并插入测试核心代码,以生成测试程序;
在测试函数参数正确的情况下,基于所述测试程序,得到性能最佳的SIMD库。
7.如权利要求1所述的方法,其特征在于,所述测试核心代码的测试性能包括:最大运行时间、最小运行时间、性能的平均值、性能的中位数、性能的标准差和运行次数中的一种或多种。
8.一种基于SIMD库的自动测试装置,其特征在于,所述装置包括:
获取模块,用于获取用户目标和待测应用程序;
通用API,用于基于不同的SIMD库向量化所述待测应用程序,得到各SIMD库对应的源文件;
autobench模块,用于根据所述源文件,生成各SIMD库对应的新文件;在用户目标为代码大小测试的情况下,对所述新文件进行编译,得到目标文件,并基于所述目标文件中textsection,得到代码大小最小的SIMD库;在用户目标为性能测试的情况下,通过将测试核心代码嵌入到所述新文件后进行性能测试,得到性能最佳的SIMD库。
9.一种电子设备,其特征在于,所述电子设备包括:处理器以及存储有计算机程序指令的存储器;所述处理器执行所述计算机程序指令时实现如权利要求1-7任一项所述方法。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序指令,所述计算机程序指令被处理器执行时实现如权利要求1-7任一项所述方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310375698.4A CN116594682A (zh) | 2023-04-10 | 2023-04-10 | 基于simd库的自动测试方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310375698.4A CN116594682A (zh) | 2023-04-10 | 2023-04-10 | 基于simd库的自动测试方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116594682A true CN116594682A (zh) | 2023-08-15 |
Family
ID=87598020
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310375698.4A Pending CN116594682A (zh) | 2023-04-10 | 2023-04-10 | 基于simd库的自动测试方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116594682A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117171053A (zh) * | 2023-11-01 | 2023-12-05 | 睿思芯科(深圳)技术有限公司 | 一种用于向量化编程的测试方法、系统及相关设备 |
-
2023
- 2023-04-10 CN CN202310375698.4A patent/CN116594682A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117171053A (zh) * | 2023-11-01 | 2023-12-05 | 睿思芯科(深圳)技术有限公司 | 一种用于向量化编程的测试方法、系统及相关设备 |
CN117171053B (zh) * | 2023-11-01 | 2024-02-20 | 睿思芯科(深圳)技术有限公司 | 一种用于向量化编程的测试方法、系统及相关设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US5202889A (en) | Dynamic process for the generation of biased pseudo-random test patterns for the functional verification of hardware designs | |
US9015684B1 (en) | Profiler-based optimization of automatically generated code | |
Kim et al. | Macsim: A cpu-gpu heterogeneous simulation framework user guide | |
Collange et al. | Dynamic detection of uniform and affine vectors in GPGPU computations | |
US8938381B1 (en) | Automatic numerical simulation of processor environment | |
CN116594682A (zh) | 基于simd库的自动测试方法及装置 | |
Parasyris et al. | Scalable Tuning of (OpenMP) GPU Applications via Kernel Record and Replay | |
CN107729118A (zh) | 面向众核处理器的修改Java虚拟机的方法 | |
TW201738734A (zh) | 用於在運行時指令的情境向量化的系統及方法 | |
Moreno et al. | Simulation/evaluation environment for a VLIW processor architecture | |
JP7295469B2 (ja) | 関数生成プログラム、関数生成方法、及び情報処理装置 | |
CN112230995B (zh) | 一种指令的生成方法、装置以及电子设备 | |
JP7315872B2 (ja) | プロセッサ、シミュレータプログラム、アセンブラプログラム、及び情報処理プログラム | |
Afonso et al. | Fancier: a unified framework for java, c, and opencl integration | |
Mattson et al. | Imagine programming system user’s guide | |
CN117313595B (zh) | 用于功能验证的随机指令生成方法、设备及系统 | |
Fauster et al. | Intelligent editor for writing worst-case-execution-time-oriented programs | |
Perugini | Evaluation of the Parallel features of Rust for Space Systems | |
Terrosi et al. | Modeling of GPGPU architectures for performance analysis of CUDA programs | |
US20140075253A1 (en) | Method for verification of reconfigurable processor | |
Eswari | Raising MIPS Binaries to LLVM IR | |
Yaneva-Cormack | Accelerating software test execution using GPUs | |
CN114518901A (zh) | 随机生成指令序列的方法和处理单元 | |
Kavvadias et al. | A portable specification of zero-overhead looping control hardware applied to embedded processors | |
P Joseph | Accelerating Java on Embedded GPU |
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 |