CN110321161B - 使用simd指令的向量函数快速查表法、系统及介质 - Google Patents
使用simd指令的向量函数快速查表法、系统及介质 Download PDFInfo
- Publication number
- CN110321161B CN110321161B CN201910561095.7A CN201910561095A CN110321161B CN 110321161 B CN110321161 B CN 110321161B CN 201910561095 A CN201910561095 A CN 201910561095A CN 110321161 B CN110321161 B CN 110321161B
- Authority
- CN
- China
- Prior art keywords
- vector
- function
- array
- load
- type
- 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
- 239000013598 vector Substances 0.000 title claims abstract description 332
- 230000006870 function Effects 0.000 claims abstract description 189
- 238000000034 method Methods 0.000 claims abstract description 57
- 238000004364 calculation method Methods 0.000 claims abstract description 31
- 238000004422 calculation algorithm Methods 0.000 claims abstract description 12
- 238000004590 computer program Methods 0.000 claims description 10
- 230000007704 transition Effects 0.000 claims description 2
- 238000006243 chemical reaction Methods 0.000 claims 1
- 238000010586 diagram Methods 0.000 description 8
- 230000002776 aggregation Effects 0.000 description 6
- 238000004220 aggregation Methods 0.000 description 6
- 230000008569 process Effects 0.000 description 5
- 238000011161 development Methods 0.000 description 2
- 230000018109 developmental process Effects 0.000 description 2
- 238000013459 approach Methods 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 230000008140 language development Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000005457 optimization Methods 0.000 description 1
- 238000012545 processing Methods 0.000 description 1
Images
Classifications
-
- 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/30036—Instructions to perform operations on packed data, e.g. vector, tile or matrix operations
Landscapes
- Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Mathematical Physics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Advance Control (AREA)
- Complex Calculations (AREA)
Abstract
本发明公开了一种使用SIMD指令的向量函数快速查表法、系统及介质,快速查表法包括传入操作数,将向量函数的各算法区间的常系数作为被查表数值存入内存中的暂存数组AA,生成查表所需的索引向量VI;使用加载函数将内存中的数组AA加载至向量VA中;按照索引向量VI中元素指示,使用置换函数将VA中的指定元素加载至目的向量VD的指定位置;使用目的向量VD进行后续计算并输出结果。本发明能够充分利用现代SIMD指令集提供的超宽寄存器以及灵活的寄存器操作指令,既能通过保留查表操作来减少向量函数的计算开销,也能保证查表操作的速度,从而提升向量化函数的性能。
Description
技术领域
本发明涉及处理器数据并行与程序向量化领域,具体涉及一种使用SIMD(SingleInstruction Multiple Data,单指令多数据流)指令的向量函数快速查表法、系统及介质,用于基于SIMD指令和向量寄存器的快速向量查表。
背景技术
现代处理器中包含向量处理单元,能够进行数据并行计算,是处理器的重要部件。处理器向量单元的核心是其支持的SIMD指令集(也称为浮点指令集、向量指令集)和向量寄存器。向量寄存器,又称浮点寄存器,相比普通的通用寄存器可以存储多个元素,是运行SIMD指令集的核心存储部件。而SIMD指令集的一条SIMD指令可以同时对存储于向量寄存器的多个元素进行操作。具体而言,例如AVX2、SVE、AVX512F三个SIMD指令集:1、AVX2指令集被用于Intel处理器中。在该指令集中,一共有16个向量寄存器,寄存器宽度为256位。该指令集中提供有加载(load)指令用于一次性加载内存中连续存放的多个值至向量寄存器中,以及置换(permute)指令对向量寄存器内的元素进行动态重构。2、AVX512F指令集被用于Intel Xeon Phi和最新的Intel处理器中。在该指令集下,一共有16个向量寄存器,宽度为512位。和AVX2一样提供了类似的加载指令和置换指令。3、SVE指令集则被应用于ARM架构最新的ARMv8.2-A+指令集中,其特点是其向量寄存器是可伸缩的。向量寄存器宽度可以是128位-2048位。同样SVE指令集也提供了加载和置换指令用于操纵向量寄存器内的元素。
基于SIMD指令集的SIMD intrinsic(SIMD内建函数)是各SIMD指令集提供的一套C语言接口。SIMD intrinsic使得程序员可以在C/C++语言中直接使用向量寄存器与SIMD指令集的指令功能。各SIMD指令集的intrinsic均提供了向量类型用于直接操作向量寄存器(下文中向量便等同于向量寄存器),以及向量函数用于直接调用向量指令。具体而言,1、AVX2指令集的intrinsic有如下向量类型:__m256i类型向量存储8个32位整型或者4个64位整型,__m256类型向量储存8个单精度浮点数,__m256d类型向量储存4个双精度浮点数。2、AVX512F指令集的intrinsic:__m512i类型向量存储16个32位整型或者8个64位整型,__m512类型向量储存16个单精度浮点数,__m512d类型向量储存8个双精度浮点数。3、SVE指令集的intrinsic提供的向量类型(svfloat64_t 、svfloat32_t 、svint32_t)内存储的元素个数与特定的CPU平台有关。以上三个SIMD指令集提供的向量类型,实际实现时会直接使用各个SIMD指令集的向量寄存器,也就是说在C语言中使用向量类型,便能直接使用SIMD指令集的向量寄存器。同时它们也为加载指令和置换指令提供了对应的intrinsic函数接口,分别称为加载函数和置换函数,这两个函数内部会直接调用对应的加载指令和置换指令。本专利提出的方法适用于使用SIMD指令集的intrinsic编写的向量函数。
查表法是指在计算机程序开发过程使用的一种优化方法,通过预先将一些需要的数值结果计算好,并存储在常量数组中,运行时直接从数组中取出,而不是临时计算得到,这节省了计算开销。查表法会采用如下的步骤:把算法相似的各计算区间所需的不同的常量数值放置于数组(内存)中,计算前先判断所属算法区间并生成索引,随后使用该索引从数组(内存)中取出所需要的常量数值,并使用该常数进后续计算。通过查表法可以减少计算机程序的计算量,从而提升其性能。
向量函数,指在计算机程序中,所有在内部实现时使用了SIMD指令集的向量指令以及向量寄存器的算法函数。通过使用向量指令以及全部宽度向量寄存器,使得函数内部计算时均以指令级数据并行的方式实现。相比普通的函数(既标量函数),向量函数可以同时处理多个数据,理论上其性能是使用同样算法的标量函数的数倍。向量函数既可以使用汇编语言进行开发,也可以使用C/C++并配合SIMD指令的intrinsic进行开发。
向量查表法,指在向量函数中使用的查表法。由于向量函数的内部实现使用了向量指令,所以向量查表法也必须使用对应的向量指令以保持向量函数的指令级数据并行能力。向量查表法相比普通查表法(标量查表),查表过程中,需要计算出多个索引,然后根据多个索引一次性从内存(数组)中取出多个常量数值并存放至一个向量中,然后使用该向量参与后面的计算。为了实现向量查表的功能,较新的SIMD指令集(比如AVX2、AVX512F、SVE)提供了聚合访存(gather-load)指令以及其intrinsic中对应的聚合访存函数,以便能将内存不同位置中的值按需加载至一个向量寄存器中。但是聚合访存指令内部的实现仍旧是多次内存读取,而不是将内存中存放的多个值一次性加载至一个向量寄存器中。内存读写又是现代计算机结构的性能瓶颈,无疑使用多次内存读操作的聚合访存指令仍旧十分耗时。这使得现阶段开发的向量化函数程序要么不使用聚合访存指令放弃查表法而增加计算量,要么保持较少的计算量而使用很耗时的聚合访存指令进行查表。这无疑使得开发向量函数处于一种两难的境地。
发明内容
本发明要解决的技术问题:针对现有技术的上述问题,提供一种使用SIMD指令的向量函数快速查表法、系统及介质,本发明利用现代SIMD指令集提供的超宽寄存器以及灵活的寄存器操作指令,将向量寄存器当作待查表的暂存数组,以及置换指令当作间接查表指令,以减少内存读取次数,从而间接达到快速向量查表的目的。
为了解决上述技术问题,本发明采用的技术方案为:
一种使用SIMD指令的向量函数快速查表法,实施步骤包括:
1)将操作数传入向量函数,并将向量函数各算法区间的常系数作为被查表数值存入内存中的数组AA,并生成查表所需的索引向量VI;
2)使用加载函数将内存中的数组AA加载至向量VA中;
3)按照索引向量VI中元素指示,使用置换函数将向量VA中的指定元素加载至目的向量VD的指定位置;
4)使用目的向量VD进行向量函数的后续计算,输出计算结果。
优选地,步骤2)在各SIMD指令集下的具体实现方法是下述指令集中的一种:
AVX2指令集的实现为:使用_mm256_loadu_si256函数将32位整型数组AA加载至__m256i类型的向量VA中;或使用_mm256_load_ps函数将单精度浮点数组AA加载至__m256类型的向量VA中;
在SVE指令集下的实现为:先将32位整型数组AA强制转换为32位无符号整型数组,然后使用svld1uw_s64函数将转换后的数组AA加载至svint64_t类型的过渡向量VT中,最后使用svreinterpret_s32_s64函数将变量VT转换加载至svint32_t类型向量VA中;或先将64位整型数组AA强制转换变为32位无符号整型数组,再使用svld1uw_s64函数将转换后的数组AA加载至svint64_t类型的向量VA中;或使用svld1_f32函数将单精度浮点数组AA加载至svfloat32_t类型的向量VA中;或使用svld1_f64函数将双精度浮点数组AA加载至svfloat64_t类型的向量VA中;
AVX512F指令集的实现为:使用_mm512_loadu_si512函数将32位整型数组AA加载至__m512i类型的向量VA中;或将64位整型数组AA强制转换为32位整型数组,再使用_mm512_loadu_si512函数将数组AA加载至__m512i类型的向量VA中;或使用_mm512_loadu_ps函数将单精度浮点数组AA加载至__m512f类型的向量VA中;或使用_mm512_loadu_pd函数将双精度浮点数组AA加载至__m512d类型的向量VA中。
优选地,步骤3)在各SIMD指令集下的具体实现方法是下述指令集中的一种:
在AVX2指令集下的实现为:若数组AA为32位整型数组,应在索引向量VI的指示下,对应地使用_mm256_permutevar8x32_epi32函数将VA内的各元素分别加载至__m256i类型向量VD的指定位置中;若数组AA为单精度浮点数组,则应在索引向量VI的指示下,使用_mm256_permutevar8x32_ps函数将VA内的各元素分别加载至__m256类型向量VD的指定位置中;
在SVE指令集下的实现为:若数组AA为32位整型数组,则在索引向量VI的指示下,对应地使用svtbl_s32函数将VA内的各元素分别加载至svint32_t类型向量VD的指定位置中;若数组AA为64位整型数组,则在索引向量VI的指示下,对应地使用svtbl_s64函数,将VA内的各元素分别加载至svint64_t类型向量VD的指定位置中;若数组AA为单精度浮点数组,则对应地使svtbl_f32函数,在索引向量VI的指示下,将VA内的各元素分别加载至svfloat32_t类型向量VD的指定位置中;若数组AA为双精度浮点数组,则对应地使用svtbl_f64函数将VA内的各元素分别加载至svfloat64_t类型向量VD的指定位置中。
在AVX512F指令集下的实现为:若数组AA为32位整型数组,则应在索引向量VI指定下,对应地使用_mm512_permutexvar_epi32函数将VA内的各元素分别加载至__m512i类型向量VD的指定位置中;若数组AA为64位整型数组,则应在索引向量VI指定下,对应地使用_mm512_permutexvar_epi64函数将VA内的各元素分别加载至__m512i类型向量VD的指定位置中;若数组AA为单精度浮点数组,则应在索引向量VI指定下,对应地使用_mm512_permutexvar_ps函数将VA内的各元素分别加载至__m512类型向量VD的指定位置中;若数组AA为双精度浮点数组,则应在索引向量VI指定下,对应地使用_mm512_permutexvar_pd函数将VA内的各元素分别加载至__m512d类型向量VD的指定位置中。
本发明还提供一种使用SIMD指令的向量函数快速查表系统,包括:
数组及索引向量生成程序单元,用于将操作数传入向量函数,并将向量函数的各算法区间的常系数作为被查表数值存入内存中的数组AA,并生成查表所需的索引向量VI;
数组暂存程序单元,用于使用加载函数将内存中的数组AA加载至向量VA中;
间接向量查表程序单元,用于按照索引向量VI中元素指示,使用置换函数将向量VA中的指定元素加载至目的向量VD的指定位置;
向量函数计算程序单元,用于使用目的向量VD进行向量函数的后续计算,输出计算结果。
本发明还提供一种使用SIMD指令的向量函数快速查表系统,包括计算机设备,该计算机设备被编程或配置以执行所述使用SIMD指令的向量函数快速查表法的步骤。
本发明还提供一种使用SIMD指令的向量函数快速查表系统,包括计算机设备,该计算机设备的存储介质上存储有被编程或配置以执行所述使用SIMD指令的向量函数快速查表法的计算机程序。
本发明还提供一种计算机可读存储介质,该计算机可读存储介质上存储有被编程或配置以执行所述使用SIMD指令的向量函数快速查表法的计算机程序。
和现有技术相比,本发明具有下述优点:
1、本发明使用的实现方法内部会调用SIMD指令集的向量加载指令与向量置换指令来替代聚合访存指令以间接实现的向量查表。在整个过程中只有加载指令会进行了一次内存读写,而现有部分指令集提供用于向量查表的聚合访存指令则要进行最多N次内存读写(N为索引向量VI的长度)。无疑本发明提供的方法加快了向量查表的速度。
2、众所周知在设计向量函数时会陷入一个两难的境地:要么保证计算量较小的情况下使用慢速的聚合访存指令进行向量查表操作,要么不使用该指令并放弃向量查表而增加向量函数的计算开销。本发明通过将加载指令与原本广泛引用于软件加密领域的置换指令结合,创造性的把与访存无关的置换指令应用到向量内存查表操作中,以替换常规的聚合访存指令。这解决了当前向量函数设计的两难境地,既能通过引入向量查表来来减少向量函数实现时的计算开销,也能保证向量查表的速度较快。
3、本发明方法可通过任何提供了加载指令以及置换指令、并且有着较宽向量寄存器(向量)的SIMD指令集实现,不局限于AVX2、SVE、AVX512F三个指令集,具有通用性好、应用范围广的优点。
附图说明
图1为本发明实施例方法的基本流程示意图。
图2为本发明实施例方法的基本原理示意图。
图3为本发明实施例方法执行步骤1)后的数组及相关寄存器状态示意图。
图4为本发明实施例方法执行步骤2)后的数组及相关寄存器状态示意图。
图5为本发明实施例方法执行步骤3)后的数组及相关寄存器状态示意图。
图6为本发明实施例方法在AVX2指令集下实现的伪代码示意图。
图7为本发明实施例方法在SVE指令集下实现的伪代码示意图。
图8为本发明实施例方法在AVX512F指令集下实现的伪代码示意图。
具体实施方式
如图1所示,本实施例使用SIMD指令的向量函数快速查表法的实施步骤包括:
1)将操作数传入向量函数,并将向量函数的各算法区间的常系数作为被查表数值存入内存中的数组AA,并生成查表所需的索引向量VI;其中,数组AA作为后续使用的待查表,索引向量VI是AA中某些元素(全部或者部分)的位置索引的集合,为后面的查表操作指定位置;
2)使用加载(load)函数将内存中的数组AA加载至向量VA中,向量VA内元素将和数组AA完全一致,并可以看作是数组AA的暂存区;
3)按照索引向量VI中元素指示,使用置换(permute)函数将向量VA中的指定元素加载至目的向量VD的指定位置;目的向量VD中元素来自于VA中某个指定位置,这些位置放置于索引向量VI中。从而间接地达到从数组AA进行向量查表的目的;
4)使用目的向量VD进行向量函数的后续计算,输出计算结果。
需要说明的是,本实施例使用SIMD指令的向量函数快速查表法可以适用于各类向量函数:只要一个程序函数是向量函数,并且在函数中要用到向量查表操作,并且待查表尺寸较小(小于向量寄存器的宽度),那么该程序函数在过程中就可以使用本实施例提出的SIMD指令的向量函数快速查表法。由于本实施例使用SIMD指令的向量函数快速查表法和向量函数的后续计算的具体内容无关,因此本实施例中不对后续计算的具体内容进行举例说明。本实施例使用SIMD指令的向量函数快速查表法是一种基于SIMD指令集的加载指令和置换指令并将向量寄存器(向量)当作存储表的容器,来间接实现一种快速的向量查表,从而提升了向量函数性能的方法。由于C语言开发的便利性,本实例的实现会通过使用各个SIMD指令集intrinsic提供的向量类型来读写向量寄存器,以及使用加载指令和置换指令在intrinsic中对应的加载函数和置换函数来操作向量寄存器中的数据。
如图2所示,内存中的数组AA保存了元素A0-A7,索引向量VI中元素A0-A7的索引号分为3、7、0、0、1、6、2、2;步骤2)将整个数组AA加载至向量VA中。步骤3)按照索引向量VI中元素指示,使用置换函数将向量VA中的指定元素加载至目的向量VD的指定位置,则元素A0分别加载至VD的第3、4个位置,元素A1分别加载至VD的第5位置,元素A2分别加载至VD的第7、8位置,以此类推。
步骤1)传入操作数,将向量函数的各算法区间的常系数作为待查表数值存入内存中的数组AA,并生成查表所需的索引向量VI后,此时对应数组AA、相关寄存器的内容如图3所示。
步骤2)使用SIMD指令集intrinsic的加载函数,将整个数组(内存)AA加载至某一向量(向量寄存器)VA中,那么VA内元素将和数组AA完全一致,并可以看作是数组AA的暂存区。此时对应数组AA、相关寄存器的内容如图4所示。
步骤3)在索引向量VI的指引下,使用SIMD指令集中的置换函数生成目的向量VD,VD中元素来自于VA中某个指定位置,这些位置放置于VI中。从而间接地达到从数组AA进行向量查表的目的。此时指定数组、相关寄存器的内容如图5所示。
本实施例中,使用加载函数将内存中的数组AA加载至向量VA中的具体实现方法在各个SIMD指令集下是下述指令集中的一种:
(I)AVX2指令集下的代码实现为:如图6(a)所示,使用_mm256_loadu_si256函数将32位整型数组AA加载至__m256i类型的向量VA中;或如图6(b)所示,使用_mm256_load_ps函数将单精度浮点数组AA加载至__m256类型的向量VA中;
(II)SVE指令集下的代码实现为:如图7(a)所示,先将32位整型数组AA强制转换为32位无符号整型数组,然后使用svld1uw_s64函数将转换后的数组AA加载至svint64_t类型向量VT中,最后使用svreinterpret_s32_s64函数将向量VT转换加载至svint32_t类型向量VA中;或如图7(b)所示,将64位整型数组AA强制转换变为32位无符号整型数组,使用svld1uw_s64函数将转换后的数组AA加载至svint64_t类型的向量VA中;或如图7(c)所示,使用svld1_f32函数将单精度浮点数组AA加载至svfloat32_t类型的向量VA中;或如图7(d)所示,使用svld1_f64函数将双精度浮点数组AA加载至svfloat64_t类型的向量VA中;
(III)AVX512F指令集下的代码实现为:如图8(a)所示,使用_mm512_loadu_si512函数将32位整型数组AA加载至__m512i类型的向量VA中;或如图8(b)所示,将64位整型数组AA强制转换为32位整型数组,使用_mm512_loadu_si512函数将数组AA加载至__m512i类型的向量VA中;或如图8(c)所示,使用_mm512_loadu_ps函数将单精度浮点数组AA加载至__m512f类型的向量VA中;或如图8(d)所示,使用_mm512_loadu_pd函数将双精度浮点数组AA加载至__m512d类型的向量VA中。
本实施例中,按照索引向量VI中元素指示,使用置换函数将向量VA中的指定元素加载至目的向量VD的指定位置的具体实现方法在各个SIMD指令集下是下述指令集中的一种:
(I)AVX2指令集下的代码实现为:如图6(a)所示,若数组AA为32位整型数组,应在索引向量VI的指示下,对应地使用_mm256_permutevar8x32_epi32函数将VA内的各元素分别加载至__m256i类型向量VD的指定位置中;如图6(b)所示,若数组AA为单精度浮点数组,则应在索引向量VI的指示下,使用_mm256_permutevar8x32_ps函数将VA内的各元素分别加载至__m256类型向量VD的指定位置中;
(II)SVE指令集下的代码实现为:如图7(a)所示,若数组AA为32位整型数组,则在索引向量VI的指示下,对应地使用svtbl_s32函数将VA内的各元素分别加载至svint32_t类型向量VD的指定位置中;如图7(b)所示,若数组AA为64位整型数组,则在索引向量VI的指示下,对应地使用svtbl_s64函数,将VA内的各元素分别加载至svint64_t类型向量VD的指定位置中;如图7(c)所示,若数组AA为单精度浮点数组,则对应地使用svtbl_f32函数,在索引向量VI的指示下,将VA内的各元素分别加载至svfloat32_t类型向量VD的指定位置中;如图7(d)所示,若数组AA为双精度浮点数组,则对应地使用svtbl_f64函数将VA内的各元素分别加载至svfloat64_t类型向量VD的指定位置中。
(III)AVX512F指令集下的代码实现为:如图8(a)所示,若数组AA为32位整型数组,则应在索引向量VI指定下,对应地使用_mm512_permutexvar_epi32函数将VA内的各元素分别加载至__m512i类型向量VD的指定位置中;如图8(b)所示,若数组AA为64位整型数组,则应在索引向量VI指定下,对应地使用_mm512_permutexvar_epi64函数将VA内的各元素分别加载至__m512i类型向量VD的指定位置中;如图8(c)所示,若数组AA为单精度浮点数组,则应在索引向量VI指定下,对应地使用_mm512_permutexvar_ps函数将VA内的各元素分别加载至__m512类型向量VD的指定位置中;如图8(d)所示,若数组AA为双精度浮点数组,则应在索引向量VI指定下,对应地使用_mm512_permutexvar_pd函数将VA内的各元素分别加载至__m512d类型向量VD的指定位置中。
综上所述,综合分析现代SIMD指令集的特点,向量函数开发的特点,本实施例提供了一种基于SIMD指令集的加载函数和置换函数并将向量寄存器(向量)当作存储表的容器,来间接实现一种快速的向量查表,从而提升向量函数性能的方法,本实施例包括传入操作数,将向量函数的各算法区间的常系数作为被查表数值存入内存中的数组AA,生成查表所需的索引向量VI;使用加载函数将内存中的数组AA加载至向量VA中;按照索引向量VI中元素指示,使用置换函数将向量VA中的指定元素加载至目的向量VD的指定位置;使用目的向量VD在向量函数中进行后续计算并输出结果。当向量函数内查表操作所需的表较小(能被存入至一个向量寄存器)时,先使用SIMD指令集的加载函数将整个数组(内存)加载至向量(向量寄存器)VA中,然后按照索引向量VI的指示,使用SIMD指令集提供的置换函数将VA中的各元素分别加载到目的向量VD的指定位置中,从而间接实现了一种快速的向量查表方法,并且在这个过程中只进行了一次内存读写,所以速度较快,使用本实施例方法既能保证向量函数在实现时以查表法来减少计算量,又能保证查表操作较快,这样就提升了向量函数的性能。本实施例能够充分利用现代SIMD指令集(如AVX2、SVE、AVX512F指令集等)提供的超宽寄存器以及灵活的寄存器操作指令,既能通过保留查表操作来减少向量化函数的计算量,也能保证查表操作的速度,从而提升向量化函数的性能。
此外,本实施例还提供一种使用SIMD指令的向量函数快速查表系统,包括:
数组及索引向量生成程序单元,用于传入操作数,将向量函数的各算法区间的常系数作为被查表数值存入内存中的数组AA,并生成查表所需的索引向量VI;
数组暂存程序单元,用于使用加载函数将内存中的数组AA加载至向量VA中;
间接向量查表程序单元,用于按照索引向量VI中元素指示,使用置换函数将向量VA中的指定元素加载至目的向量VD的指定位置;
向量函数计算程序单元,用于使用目的向量VD在向量函数中进行后续计算,输出计算结果。
此外,本实施例还提供一种使用SIMD指令的向量函数快速查表系统,包括计算机设备,该计算机设备被编程或配置以执行本实施例前述使用SIMD指令的向量函数快速查表法的步骤。
此外,本实施例还提供一种使用SIMD指令的向量函数快速查表系统,包括计算机设备,该计算机设备的存储介质上存储有被编程或配置以执行本实施例前述使用SIMD指令的向量函数快速查表法的计算机程序。
此外,本实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有被编程或配置以执行本实施例前述使用SIMD指令的向量函数快速查表法的计算机程序。
以上所述仅是本发明的优选实施方式,本发明的核心思想不局限于上面提到的加载与置换函数,任何能将整个数组AA加载至向量中的函数,以及任何能进行置换操作的函数都可以被用于该方法的实现中。其实现也不局限于只用一个向量作为数组的暂存区,如果SIMD指令集中也提供了能对多个向量进行置换操作的指令或函数,也可以将多个向量作为数组的暂存区。
需要说明的是,由于本申请提出的方法是使用C语言以及各SIMD指令集intrinsic来实现,所以上文均使用了SIMD指令集intrinsic中的术语‘向量函数’与‘向量’,而不是对应的‘向量指令’与‘向量寄存器’来描述该方法的具体实现,但本质上两者是一致的。另外以上的描述的方法中使用的向量VA、向量VI、向量VT、向量VD以及数组AA仅作为示范说明所用的变量名,实际使用时无需限定于同样的名称。
本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,应视为本发明的保护范围。
Claims (7)
1.一种使用SIMD指令的向量函数快速查表法,其特征在于实施步骤包括:
1)将操作数传入向量函数,并将向量函数的各算法区间的常系数作为被查表数值存入内存中的数组AA,并生成查表所需的索引向量VI;
2)使用加载函数将内存中的数组AA加载至向量VA中;
3)按照索引向量VI中元素指示,使用置换函数将向量VA中的指定元素加载至目的向量VD的指定位置;
4)使用目的向量VD进行向量函数的后续计算,输出计算结果。
2.根据权利要求1所述的使用SIMD指令的向量函数快速查表法,其特征在于,步骤2)在各SIMD指令集下的具体实现方法是下述指令集中的一种:
在AVX2指令集下的实现为:使用_mm256_loadu_si256函数将32位整型数组AA加载至__m256i类型的向量VA中;或使用_mm256_load_ps函数将单精度浮点数组AA加载至__m256类型的向量VA中;
在SVE指令集下的实现为:先将32位整型数组AA强制转换为32位无符号整型数组,然后使用svld1uw_s64函数将转换后的数组AA加载至svint64_t类型的过渡向量VT中,最后使用svreinterpret_s32_s64函数将向量VT转换加载至svint32_t类型向量VA中;或先将64位整型数组AA强制转换为32位无符号整型数组,再使用svld1uw_s64函数将数组AA加载至svint64_t类型的向量VA中;或使用svld1_f32函数将单精度浮点数组AA加载至svfloat32_t类型的向量VA中;或使用svld1_f64函数将双精度浮点数组AA加载至svfloat64_t类型的向量VA中;
在AVX512F指令集下的实现为:使用_mm512_loadu_si512函数将32位整型数组AA加载至__m512i类型的向量VA中;或将64位整型数组AA强制转换为32位整型数组,再使用_mm512_loadu_si512函数将数组AA加载至__m512i类型的向量VA中;或使用_mm512_loadu_ps函数将单精度浮点数组AA加载至__m512f类型的向量VA中;或使用_mm512_loadu_pd函数将双精度浮点数组AA加载至__m512d类型的向量VA中。
3.根据权利要求1或2所述的使用SIMD指令的向量函数快速查表法,其特征在于,步骤3)在各SIMD指令集下的具体实现方法是下述指令集中的一种:
在AVX2指令集下的实现为:若数组AA为32位整型数组,应在索引向量VI的指示下,对应地使用_mm256_permutevar8x32_epi32函数将VA内的各元素分别加载至__m256i类型向量VD的指定位置中;若数组AA为单精度浮点数组,则应在索引向量VI的指示下,使用_mm256_permutevar8x32_ps函数将VA各元素分别加载至__m256类型向量VD指定位置;
在SVE指令集下的实现为:若数组AA为32位整型数组,则在索引向量VI的指示下,对应地使用svtbl_s32函数将VA内的各元素分别加载至svint32_t类型向量VD的指定位置中;若数组AA为64位整型数组,则在索引向量VI的指示下,对应地使用svtbl_s64函数,将VA内的各元素分别加载至svint64_t类型向量VD的指定位置中;若数组AA为单精度浮点数组,则对应地使用svtbl_f32函数,在索引向量VI的指示下,将VA内的各元素分别加载至svfloat32_t类型向量VD的指定位置中;若数组AA为双精度浮点数组,则对应地使用svtbl_f64函数将VA内的各元素分别加载至svfloat64_t类型向量VD的指定位置中;
在AVX512F指令集下的实现为:若数组AA为32位整型数组,则应在索引向量VI指定下,对应地使用_mm512_permutexvar_epi32函数将VA内的各元素分别加载至__m512i类型向量VD的指定位置中;若数组AA为64位整型数组,则应在索引向量VI指定下,对应地使用_mm512_permutexvar_epi64函数将VA内的各元素分别加载至__m512i类型向量VD的指定位置中;若数组AA为单精度浮点数组,则应在索引向量VI指定下,对应地使用_mm512_permutexvar_ps函数将VA内的各元素分别加载至__m512类型向量VD的指定位置中;若数组AA为双精度浮点数组,则应在索引向量VI指定下,对应地使用_mm512_permutexvar_pd函数将VA内的各元素分别加载至__m512d类型向量VD的指定位置中。
4.一种使用SIMD指令的向量函数快速查表系统,其特征在于包括:
数组及索引向量生成程序单元,用于传入操作数,并将向量函数的各算法区间的常系数作为被查表数值存入内存中的数组AA,并生成查表所需的索引向量VI;
数组暂存程序单元,用于使用加载函数将内存中的数组AA加载至向量VA中;
间接向量查表程序单元,用于按照索引向量VI中元素指示,使用置换函数将向量VA中的指定元素加载至目的向量VD的指定位置;
向量函数计算程序单元,用于使用目的向量VD进行向量函数的后续计算,输出计算结果。
5.一种使用SIMD指令的向量函数快速查表系统,包括计算机设备,其特征在于,该计算机设备被编程或配置以执行权利要求1~3中任意一项所述使用SIMD指令的向量函数快速查表法的步骤。
6.一种使用SIMD指令的向量函数快速查表系统,包括计算机设备,其特征在于,该计算机设备的存储介质上存储有被编程或配置以执行权利要求1~3中任意一项所述使用SIMD指令的向量函数快速查表法的计算机程序。
7.一种计算机可读存储介质,其特征在于,该计算机可读存储介质上存储有被编程或配置以执行权利要求1~3中任意一项所述使用SIMD指令的向量函数快速查表法的计算机程序。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910561095.7A CN110321161B (zh) | 2019-06-26 | 2019-06-26 | 使用simd指令的向量函数快速查表法、系统及介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910561095.7A CN110321161B (zh) | 2019-06-26 | 2019-06-26 | 使用simd指令的向量函数快速查表法、系统及介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110321161A CN110321161A (zh) | 2019-10-11 |
CN110321161B true CN110321161B (zh) | 2021-03-02 |
Family
ID=68120383
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910561095.7A Active CN110321161B (zh) | 2019-06-26 | 2019-06-26 | 使用simd指令的向量函数快速查表法、系统及介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110321161B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114442993A (zh) * | 2020-10-30 | 2022-05-06 | 北京晶视智能科技有限公司 | 浮点数函数运算查表计算装置 |
CN112989683A (zh) * | 2021-04-19 | 2021-06-18 | 中国人民解放军国防科技大学 | 一种sph的向量化并行计算方法及装置 |
CN114510427B (zh) * | 2022-02-24 | 2024-09-13 | 南京航空航天大学 | 一种基于simd向量化的数据流软错误检测方法 |
CN114968367B (zh) * | 2022-06-09 | 2024-11-29 | 中国人民解放军国防科技大学 | 一种基于转置的向量三角函数快速查表方法及系统 |
CN114840255B (zh) * | 2022-07-04 | 2022-09-27 | 飞腾信息技术有限公司 | 处理数据的方法、装置及设备可读存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102446160A (zh) * | 2011-09-06 | 2012-05-09 | 中国人民解放军国防科学技术大学 | 面向双精度simd部件的矩阵乘实现方法 |
CN103309813A (zh) * | 2012-03-15 | 2013-09-18 | 国际商业机器公司 | 数据处理方法和装置 |
CN107729053A (zh) * | 2017-10-17 | 2018-02-23 | 安徽皖通邮电股份有限公司 | 一种实现高速缓存表的方法 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20130212353A1 (en) * | 2002-02-04 | 2013-08-15 | Tibet MIMAR | System for implementing vector look-up table operations in a SIMD processor |
US20160124651A1 (en) * | 2014-11-03 | 2016-05-05 | Texas Instruments Incorporated | Method for performing random read access to a block of data using parallel lut read instruction in vector processors |
CN108268349B (zh) * | 2018-01-08 | 2021-05-18 | 青岛雷神科技股份有限公司 | 一种基于intel avx指令集的浮点峰值计算吞吐测试方法 |
-
2019
- 2019-06-26 CN CN201910561095.7A patent/CN110321161B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102446160A (zh) * | 2011-09-06 | 2012-05-09 | 中国人民解放军国防科学技术大学 | 面向双精度simd部件的矩阵乘实现方法 |
CN103309813A (zh) * | 2012-03-15 | 2013-09-18 | 国际商业机器公司 | 数据处理方法和装置 |
CN107729053A (zh) * | 2017-10-17 | 2018-02-23 | 安徽皖通邮电股份有限公司 | 一种实现高速缓存表的方法 |
Non-Patent Citations (1)
Title |
---|
"基于GPP平台的802.11n物理层高速处理关键技术实现";丁忆南;《中国优秀硕士学位论文全文数据库 信息科技辑》;中国学术期刊(光盘版)电子杂志社;20150415(第04期);I136-606 * |
Also Published As
Publication number | Publication date |
---|---|
CN110321161A (zh) | 2019-10-11 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110321161B (zh) | 使用simd指令的向量函数快速查表法、系统及介质 | |
EP3651017B1 (en) | Systems and methods for performing 16-bit floating-point matrix dot product instructions | |
ES2982493T3 (es) | Acelerador de multiplicación de matrices densas-dispersas | |
JP7582591B2 (ja) | 装置、方法、および機械可読媒体 | |
US8583898B2 (en) | System and method for managing processor-in-memory (PIM) operations | |
BR102020019657A2 (pt) | aparelhos, métodos e sistemas para instruções de um acelerador de operações de matriz | |
JP2020533691A (ja) | Simd命令を用いた効率的な直接畳み込み | |
TWI740851B (zh) | 用於向量負載指示之資料處理設備、方法及電腦程式 | |
JP7324754B2 (ja) | ベクトル・キャリー付き加算命令 | |
TW202217603A (zh) | 用於融合乘加運算的系統、裝置及方法 | |
CN106030514B (zh) | 用于执行采用传播的被屏蔽源元素存储指令的处理器及其方法 | |
KR20110055629A (ko) | 단일 명령 다중 데이터(simd)데이터 처리기에서 확장된 어드레싱 모드들의 제공 | |
CN110235099B (zh) | 用于处理输入操作数值的装置和方法 | |
EP3716054A2 (en) | Interleaved pipeline of floating-point adders | |
US9483244B2 (en) | Compiling method and compiling device | |
US20110302394A1 (en) | System and method for processing regular expressions using simd and parallel streams | |
CN112148251A (zh) | 跳过无意义的矩阵运算的系统和方法 | |
US20230315450A1 (en) | Apparatuses, methods, and systems for 8-bit floating-point matrix dot product instructions | |
CN114327362A (zh) | 大规模矩阵重构和矩阵-标量操作 | |
TW202223633A (zh) | 用於實施16位元浮點矩陣點積指令的裝置、方法及系統 | |
US8655935B2 (en) | Processing apparatus and control method performing taylor series operation associated with executing floating point instruction | |
US20220156567A1 (en) | Neural network processing unit for hybrid and mixed precision computing | |
JP3645574B2 (ja) | データ処理システムにおける入力オペランド制御 | |
Neves et al. | Implementing blake with avx, avx2, and xop | |
US8332447B2 (en) | Systems and methods for performing fixed-point fractional multiplication operations in a SIMD processor |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |