CN109716291A - 用于可变长度整数译码的指令集 - Google Patents
用于可变长度整数译码的指令集 Download PDFInfo
- Publication number
- CN109716291A CN109716291A CN201780057071.7A CN201780057071A CN109716291A CN 109716291 A CN109716291 A CN 109716291A CN 201780057071 A CN201780057071 A CN 201780057071A CN 109716291 A CN109716291 A CN 109716291A
- Authority
- CN
- China
- Prior art keywords
- varint
- size
- encoded
- instruction
- byte
- 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
- 238000000034 method Methods 0.000 claims abstract description 51
- 230000001052 transient effect Effects 0.000 claims description 28
- 238000013461 design Methods 0.000 claims description 8
- 238000005259 measurement Methods 0.000 claims description 7
- 239000004065 semiconductor Substances 0.000 claims description 7
- 238000010586 diagram Methods 0.000 description 12
- 239000000872 buffer Substances 0.000 description 11
- 238000012545 processing Methods 0.000 description 9
- 230000008569 process Effects 0.000 description 7
- 238000011156 evaluation Methods 0.000 description 6
- 230000006870 function Effects 0.000 description 6
- 101100534231 Xenopus laevis src-b gene Proteins 0.000 description 4
- 229910052754 neon Inorganic materials 0.000 description 4
- GKAOGPIIYCISHV-UHFFFAOYSA-N neon atom Chemical compound [Ne] GKAOGPIIYCISHV-UHFFFAOYSA-N 0.000 description 4
- 229910002056 binary alloy Inorganic materials 0.000 description 3
- 230000005540 biological transmission Effects 0.000 description 3
- 230000008878 coupling Effects 0.000 description 3
- 238000010168 coupling process Methods 0.000 description 3
- 238000005859 coupling reaction Methods 0.000 description 3
- 238000006073 displacement reaction Methods 0.000 description 3
- 235000013399 edible fruits Nutrition 0.000 description 3
- 238000000605 extraction Methods 0.000 description 3
- 230000000712 assembly Effects 0.000 description 2
- 238000000429 assembly Methods 0.000 description 2
- 230000006399 behavior Effects 0.000 description 2
- 239000000284 extract Substances 0.000 description 2
- 230000003993 interaction Effects 0.000 description 2
- 238000013507 mapping Methods 0.000 description 2
- 239000000463 material Substances 0.000 description 2
- 230000007246 mechanism Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000005457 optimization Methods 0.000 description 2
- 241000665848 Isca Species 0.000 description 1
- 230000003542 behavioural effect Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 238000006243 chemical reaction Methods 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 230000006835 compression Effects 0.000 description 1
- 238000007906 compression Methods 0.000 description 1
- 239000012141 concentrate Substances 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 239000006185 dispersion Substances 0.000 description 1
- 238000003780 insertion Methods 0.000 description 1
- 230000037431 insertion Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000004044 response Effects 0.000 description 1
- 235000013599 spices Nutrition 0.000 description 1
- 239000012536 storage buffer Substances 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
- 238000013519 translation Methods 0.000 description 1
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/30145—Instruction analysis, e.g. decoding, instruction word fields
- G06F9/3016—Decoding the operand specifier, e.g. specifier format
-
- 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/30003—Arrangements for executing specific machine instructions
- G06F9/30007—Arrangements for executing specific machine instructions to perform operations on data operands
- G06F9/30018—Bit or string 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/30003—Arrangements for executing specific machine instructions
- G06F9/30007—Arrangements for executing specific machine instructions to perform operations on data operands
- G06F9/30025—Format conversion instructions, e.g. Floating-Point to Integer, decimal conversion
-
- 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
- G06F9/30038—Instructions to perform operations on packed data, e.g. vector, tile or matrix operations using a mask
-
- 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/30181—Instruction operation extension or modification
- G06F9/30192—Instruction operation extension or modification according to data descriptor, e.g. dynamic data typing
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- Computational Mathematics (AREA)
- Mathematical Analysis (AREA)
- Mathematical Optimization (AREA)
- Pure & Applied Mathematics (AREA)
- Mathematical Physics (AREA)
- Executing Machine-Instructions (AREA)
Abstract
用于可变长度整数(varint)译码的指令集以及相关联的方法和装置。这些指令集包括用于对varint进行编码和解码的指令,并且可被包括作为用于诸如基于x86和基于Arm的架构之类的处理器架构的指令集架构(ISA)以及其他ISA的部分。在一个方面中,指令包括:varint尺寸编码指令,用于对varint的尺寸进行编码;varint编码指令,用于对varint进行编码;varint尺寸解码指令,用于对经编码的varint的尺寸进行解码;以及varint解码指令,用于对经编码的varint进行解码。varint编码尺寸指令和varint编码指令可被组合在单个指令中。类似地,varint解码尺寸指令和varint解码指令可被组合在单个指令中。在一个方面中,指令使用可变长度量(VLQ)编码方案,在该方案下,varint被编码为一个或多个八位位组。
Description
背景信息
诸如谷歌、脸书、微软和亚马逊之类的公司大规模地处理数据。用于云计算和大型互联网服务的计算平台通常被托管在大型数据中心中,该大型数据中心被称为仓库规模计算机(WSC)。此类仓库规模计算机的设计挑战相当不同于传统服务器或托管服务的那些设计挑战,并且并强调跨数千个计算节点的互联网规模服务的系统设计,以用于大规模的性能和成本效率。它们的数据处理中的很大一部分涉及处理大型整数。
最近,谷歌的研究人员发表了论文(Kanev,Svilen等,“Profiling a warehouse-scale computer(对仓库规模计算机进行概况分析)”.2015年ACM/IEEE第42届国际计算机架构研讨会(ISCA).IEEE,2015),他们在该论文中报告了关于大约三年时间中一系列谷歌生产集群的工作负荷的概况分析信息。尽管研究人员在应用内发现了某种热点行为,但他们标识出构成总数据中心周期中的很大部分的跨应用的公共程序。这些热点中的大部分在功能上对于执行超越单个机器的计算是唯一的——称为“数据中心负担(tax)”的组件,诸如,远程程序调用、协议缓冲器串行化和压缩。研究人员推测,此类“负担”呈现用于微架构优化(例如,核内和核外加速器)的有趣的机会,其可被应用到未来的数据中心优化的服务器芯片上系统(SoC)。
如图1中所示,WSC周期中的22-27%在数据中心负担的不同组件中被花费。这之中为协议缓冲器处理和管理。根据前述论文,协议缓冲器(Protocol buffer)是用于谷歌内部数据存储和传输的公共语言。针对WSC的代码中最常见的习惯之一是将数据串行化到协议缓冲器,在将经串行化的协议缓冲器传递给远程被调用方时执行远程程序调用,并得回需要解串行化的类似经串行化的响应。术语“串行化”是指将结构化的数据转换为字节流,通常用于存储或用于通信。逆操作被称为“解串行化”,但谷歌将其称为“解析”。串行化/解串行化代码由protobuf编译器自动地生成,使得编程者能够以他们选择的语言与原生的类进行交互。所生成的代码是图1中所示出的protobuf部分的主要部分。
附图说明
随着通过在结合所附附图时参考以下具体实施方式使本发明的前述多个方面和许多伴随的优点变得更好地被理解,本发明的前述多个方面和许多伴随的优点将更容易领会,其中,遍及各个视图,除非另外指定,否则相同的附图标记指相同的组件:
图1是图示出根据由谷歌进行的关于其服务器的测量的数据中心“负担”的级别的图示;
图2是图示出被用于对可变长度量(VLQ)字节进行编码的编码格式的示图;
图3a和图3b是图示出VLQ编码的示图,其中,图3a对应于使用高位优先字节次序对整数进行编码,并且图3b对应于使用低位优先字节次序对整数进行编码;
图4是图示出varint编码尺寸指令应用到varint 106903的结果的示图;
图5a-图5c是图示出与应用到varint 106903的varint编码指令的执行有关的各种操作的示图;
图6是图示出在使用VLQ编码的varint编码指令的一个实施例之下如何使用10字节来对8字节的整数进行编码的示图;
图7是图示出对使用图5a-图5c中所示出的操作编码的varint 106903的尺寸进行解码的过程的示图;
图8a-图8c是图示出对使用图5a-图5c中所示出的操作编码的varint106903进行解码的过程的示图;
图9是图示出基于Arm的微架构的示例的示意性框图;
图10a-图10d是图示出使用基于Arm的varint编码指令来生成字节紧缩经编码的varint字节流的示例的示图,其中,图10a图示出在对第一varint10592663进行编码时所执行的操作,图10b图示出在对第二varint105926632979112352进行编码时所执行的操作,图10c图示出在对第三varint9776547进行编码时所执行的操作,并且图10d图示出在对第四varint7039567833107374484进行编码时所执行的操作;以及
图11a-图11d是图示出使用基于Arm的varint解码指令来对图10a-图10d中所生成字节紧缩经编码的varint字节流进行解码的示例的示图,其中,图11a图示出在对第一经编码的varint 10592663进行解码时所执行的操作,图11b图示出在对第二经编码的varint105926632979112352进行解码时所执行的操作,图11c图示出在对第三经编码的varint9776547进行解码时所执行的操作,并且图11d图示出在对第四经编码的varint7039567833107374484进行编码时所执行的操作。
具体实施方式
本文中描述了用于可变长度整数编码的指令集以及相关联的方法和装置的实施例。在下列描述中,阐述众多特定细节以提供对本发明的实施例的透彻理解。然而,相关领域技术人员将理解可以在没有这些特定细节中的一个或多个特定细节的情况下实施本发明,或者利用其他方法、组件、材料等来实施本发明。在其他实例中,未详细示出或描述公知的结构、材料或操作,以避免使本发明的各方面模糊。
贯穿本说明书对“一个实施例”或“实施例”的引用意指结合该实施例描述的特定的特征、结构或特性被包括在本发明的至少一个实施例中。因此,贯穿本说明书的各种位置出现短语“在一个实施例中”或“在实施例中”不一定都是指同一个实施例。此外,在一个或多个实施例中,能以任何合适的方式来组合特定的特征、结构或特性。
为清楚起见,本文附图中的单独的组件也可通过附图中它们的标签而不是通过特定的附图标记来引用。另外,指代特定类型的组件(如与特定组件对照)的标记可利用后跟“(typ)”(意指“典型的”)的附图标记来示出。将理解,这些组件的配置将是典型的,可能存在但为了简化和清楚起见未在附图中示出的类似组件或者未利用独立的附图标记来标记的以其他方式的类似组件。相反,“(typ)”不应被解释为意指组件、元件等典型地被用于其公开的功能、实现方式、目的等。
Protobuf被设计成是快速且小型的,并且在谷歌被广泛地使用。在某种意义上,实际性能是加倍依赖于数据的。即,实际性能取决于正在被串行化的实际数据,但其还取决于正在被使用的数据格式。相应地,一些数据格式比其他数据格式更快,并且对于给定格式,一些数据将比其他数据更快。
协议缓冲器的基本范例是用户定义了数个“消息”,其中每个“消息”描述某种数据结构的格式。这些消息描述类似于XML模式。编译器随后将这些消息编译为代码,对于C++,代码针对每个消息类型产生一个C++类。类似地,对于Java,将存在针对每个消息类型的Java类。
为了使数据串行化,应用将其数据复制到类实例中,并最后告诉该类实例使其自己(通过该类的串行化方法)串行化。为了将经串行化的数据返回到其原始格式(解串行化),应用可以将数据流解析为类实例,并且随后关于其获取了什么数据来对其进行查询。
粗略地讲,在高级别,存在写入到流/从流解析的两种类型的数据:整数和字符串。整数通常被写入为“varint”即可变长度整数。取决于正在被写入的值,varint被写入为1个与10个字节之间。
字符串被写入为长度的varint,其后所跟字符串的字节。所以,在某种意义上,串行化过程可以被认为具有三个组成部分:
确定存在并应当写入什么数据(例如,混杂的控制逻辑)。
写入varint。
存储器复制字符串。
除还存在用于分配可能被调用的存储器的组成部分之外,解析数据流是类似的。
存在两组相关的方法,一组方法写入经串行化的数据,并且一组方法仅仅计算前者的长度。当串行化到存储器缓冲区时,第一次遍历计算经串行化的数据的尺寸,并且随后在检查缓冲区的尺寸之后,第二遍实际写入该缓冲区。
在本公开中,我们集中于读取/写入varint的问题,并且提供了全面的指令集架构(ISA)定义,以加速处理。
可变整数编码概览
可变长度数量(VLQ)是使用任意数量的字节来表示任意大的整数的代码。它本质上是添加有八个位来标记字节的接续的无符号整数的基本128的表示。如图2中所示,编码假定这样的八位位组/字节:其中保留最高有效位以用于指示是否跟随有另一VLQ字节。如果A为0,则这是整数的最后的VLQ字节。如果A为1,则跟随有另一VLQ字节。B是7位的数[0x00,0x7F],并且n是B0在其中是最低有效的VLQ字节的位置。
维基百科(https://en.wikipedia.org/wiki/Variable-length_quantity)示出了与整数106903的转换相对应的uintvar(高位优先版本)的示例,该整数106903在图3a中被复制。在该高位优先版本中,最高有效字节(134)首先被传输,并且最低有效字节(23)最后被传输。注意,谷歌protobuf varint使用低位优先版本,其中,7个位的最低有效组被编码在第一字节中,并且最高有效组位被编码在最后的字节中。针对106903的低位优先uintvar的示例在图3b中示出。
对于Varint的ISA定义摘要
在一个实施例中,varint指令可以被定义为两个两指令的集合:用于编码的两个指令以及用于解码的两个指令。在每对指令内,一个指令进行编码,并且一个指令计算该编码的尺寸。在每个指令内,下列示出了对指令定义的伪代码描述,其可使用处理器领域中的公知技术利用微代码流实现为电路或者特殊电路与现有微操作(uop)的组合。实际的实现方式将取决于目标微架构与性能/面积的权衡。
列表1示出了根据一个实施例的针对64位的varint尺寸编码指令的伪代码。
列表1
varint64_encode_size(varint64_编码_尺寸)r64,r64
1.//dst(目的地),src(源)返回的数<=10
2.value=src|1;//与0x0000 0000 0000 0001的逻辑或(包含性的)
3.x=BSR(value);//位扫描逆指令/微操作
4.x=(9*x+73);//如果被实现为微码,则这可利用LEA微操作来完成
5.dst=x/64;//固定的右移位6;任选地目的地>>6。
指令采用了包括64位的寄存器的两个操作数;源(src)寄存器和目的地(dst)寄存器,其中src寄存器存储将要被编码的varint,并且dst寄存器被用于存储指令的结果,该结果对应于以字节为单位的经编码的varint的尺寸。如行1中所示,指令返回小于或等于10(字节)的数(长度)。
在行2中,src位被复制到寄存器中,并且并在逐位的基础上与0x0000 000000000001进行逻辑或,从而产生“值”,如果varint的最低有效位(LSB)是‘1’,则该值与varint相同,否则该值=varint+1。行2中的操作确保值中的至少一个位被置位(即,‘1’)。
接下来,在行3中,对值执行位扫描逆(BSR)指令。BSR查找源操作数(值操作数)是否有最高有效置位位(‘1’位)。如果找到了最高有效置位位,则其位索引‘x’被存储在目的地操作数(用于存储值‘x’的寄存器)中。在行4中,x的值被设置为9倍的x加73。如由行4中的注释所指示,如果被实现为微码,则这可利用加载有效地址(LEA)微操作(uop)来完成。在行5中,x的结果除以64随后被写入到目的地寄存器中。这导致固定右移6位,这可任选地利用对目的地寄存器中的值进行操作的位移位指令来实现(例如,dst>>6)。
图4示出了应用于varint 106903的varint64_encode_size指令的结果。107903的值以二进制形式被存储在src寄存器中。为了简单和清楚起见,未示出位于图4中的二进制值左侧的额外的位。将107903的值复制到寄存器A中,并且执行BSR指令,得到值16,该值对应于最高有效位的位索引‘x’(x=16)。该值随后以二进制被写入到dst寄存器。随后将dst寄存器中的值(‘x’)乘以9加73,这得到以二进制被写入到dst寄存器的针对‘x’的值217。随后将dst寄存器中的位向右移位6个位置(‘x’除以64的结果)。最终结果为二进制值{1 1}或十进制的3。返回图3b,使用uintvar VLQ编码,107903的值具有3字节的长度。
列表2示出了根据一个实施例的用于64位的varint指令的伪代码。
列表2
varint64_encode(varint64_编码)m128,r64,RCX
1.//指向128位的dstptr指针,
2.//r64(或r128,例如XMM)src1,
3.//(如果编码允许,则)r64隐式寄存器RCX或显式的src2
4.//64位的常数标志=0x8080808080…,掩码=0x7f7f7f7f7f7f…,
5.size=RCX;//尺寸=RCX
6.*dstptr=flags|PDEP(src1,mask);//PDEP指令/微操作(BMI2)
7.*(dstptr+8)=flags|PDEP(src1>>56,mask);
8.dstptr[size-1]&=0x7F;
该指令使用标记为m128、r64和RCX的三个操作数。m128是指向128位的目的地地址(系统存储器中)的指针(dstptr)。将varint值(src1)存储在64位的源(scr1)寄存器中。任选地,可将该varint值存储在128位的源寄存器中。将(以上所确定的)varint的尺寸存储在RCX寄存器中。
如行4中所示,存在两个64位的常数——具有十六进制值0x8080808080…的一组标志、以及具有十六进制值0x7f7f7f7f7f7f…的掩码。在行5中,将尺寸操作数设置为RCX寄存器中的尺寸值。
本文中的各实施例采用并行的位转储指令和位提取指令,分别被称为PDEP和PEXT。PDEP和PEXT指令是由公司在其“Haswell”处理器系列中引入的位操纵指令集2(BMI2)的部分。它们取得两个输入:一个输入是源,并且另一个输入是选择器。选择器是被用于选择将被紧缩或将不被紧缩的位的位映射,诸如掩码。PEXT将所选择的位从源复制到目的地的连续的低阶位;清除高阶目的地位。对于所选择的位,PDEP进行相反的操作:将连续的低阶位复制到目的地中所选择的位;清除其他目的地位。这可以被用于提取输入的任何位字段,并且甚至进行许多先前本来昂贵的位级别的混洗。尽管这些指令所做的类似于位级别聚集-分散SIMD指令,但PDEP和PEXT指令(如BMI指令集的剩余部分)对通用寄存器进行操作。
在行6中,使用varint(src1)和掩码作为操作数,逐位地将标志位与PDEP指令的结果进行逻辑或(包含性的或)操作,并将结果写入到由dstptr指向的寄存器。PDEP使用掩码将源操作数中的连续低阶位传送/分散到目的地中。PDEP指令从源操作数取得这些低位,并将它们转储在目的地操作数中的在掩码中设置的对应的位位置处。目的地中的所有其他位(未在掩码中设置的位)被设置为零(即,被清除)。
在行7中,使用向右移位56位的varint值(src1)位作为一个操作数并且使用掩码作为另一操作数将标志与PDEP指令进行逻辑或的结果被写入到dstprt+8字节的位置。在行8中,由dstptr在索引[尺寸-1](单位为字节)处所指向的寄存器中的字节中的位与值0x7F进行逻辑与。
在图5a-图5c中图示出使用图4的示例中的相同的varint=106903的64位的varint编码过程。如图5a中所图示,PDEP(scr1,mask)指令通过在掩码中具有位值‘0’的每个位置处插入‘1’来“分散”varint位。处理进行各种操作得到由*dstptr指向的位编码,该位编码与图3b的低位优先编码相同。
图5b图示出行7中所执行的操作。首先,将scr1值向右位移位56位。随后使用掩码0x7f7f7f7f7f...作为第二操作数,将PDEP指令应用到scr1中经位移位的值,得到PDEP(Src1>>56,掩码)。该值与标志常数进行逻辑或,并被写入到由dstptr+8字节指向的位置。
图5中示出了得到的128位的编码。对于小于8字节长度的任何varint,如由字节8、9和10所图示,针对较高的8个字节的值将为0x00000000。
理解该编码操作的另一方式为使用十六进制(hex)表示法而不是在单个的位级别来考虑每个字节中的值。在以下表1中图示出过程的各阶段处的较低的(字节7:0)的十六进制表示法。如在第一行中作为输入值所示出的,在十六进制表示法中,十进制的106903=0x1A197。
表1
经编码的值的高半部分(即,字节15:8)将仅为8080808080808080。因此,以十六进制的128位的编码值将为:
8080808080808080808080808006C397
图6示出了具有8字节尺寸的未经编码的varint 800与具有10字节尺寸的其经编码的格式802之间的映射。如所示,字节0:6中的每个字节的位被映射到经编码的格式802的字节0:7中对应的位,而varint 800的字节7的位被映射到经编码的格式802的字节8:9中对应的位,其中,字节9的较高的六个位将被清除(‘0’)。在编码和解码期间(下文中所描述),经编码的字节0:9将被复制到128位的存储位置中(或以其他方式从128位的存储位置读取),在该128位的存储位置之下,经编码的字节0:7将位于dstprt指向的地址处,并且字节8:9将位于dstprt+8字节处。在其中使用一对顺序的寄存器来存储经编码的varint的实施例之下,与经编码的varint的较低部分804对应的字节0:7将被存储在具有地址dstprt的第一寄存器中,并且与经编码的varint的较高部分对应的字节8:9将被写入到具有由dstprt+8字节指向的地址的第二寄存器。如下文参考图10所解释,针对较高部分806中的字节10:15的位(未示出)将取决于经编码的字节流中跟随在varint 800之后的varint中的位值。
在列表3和列表4中分别示出了与64位的varint尺寸解码和varint解码指令的实施例相对应的伪代码。
列表3
varint64_Decode_size(varint64_解码_尺寸)r64,m128//抛出错误
1.//dst,指向128位的经编码的varint的srcptr指针返回数<=10
2.for(size=1;size<=16;size++){
3.if((srcptr[size-1]&0x80)==0)break;
4.}
5.if(size>10)return error//#GP
6.dst=size;
解码将经编码的varint返回成它们的原始值。varint解码尺寸指令采用两个操作数——第一个操作数是尺寸,其将被写入到64位的目的地(dst)寄存器;并且第二个操作数是指针(srcptr),该指针指向系统存储器中经编码的varint被存储所在的128位的位置(地址)。如行2-4中所示,执行循环直到经编码的字节流所指向的字节中是srcptr的一个字节的位在与0x80(10000000b)进行逻辑与时等于0(0000 0000b)。这将在字节的最高有效位(位7)被清除的任何时间发生。相应地,循环有序地对每个字节求值(开始于由srcptr指向的字节),直到找到具有被清除的位7的字节,对于每个循环迭代递增尺寸。当循环中断时得到的尺寸的值随后被写入到dst寄存器,除非该尺寸大于10才不写入,这导致一般保护错误(#GP)错误。
图7中图示出与对以上经编码的varint的尺寸进行解码的示例对应的操作。循环执行逐字节的求值,以找到其中最高有效位(MSb)是‘0’的第一字节,例如,该第一字节具有0XXX XXXX位模式,该位模式以字节0开始,其中,X表示‘1’或‘0’(即,不关心的位)。如图7中所图示,具有0XXX XXXX位模式的第一字节为字节2。因此,经编码的varint的经解码的尺寸为3,该尺寸3被写入到dst寄存器。
列表4
varint64_Decode(varint64_解码)r64,m128,RCX
1.//r64(或r128,例如XMM)dst,
2.//指向128位的srcptr指针,
3.//(如果编码允许,则)r64隐式寄存器RCX或显式的src2
4.//64位的常数掩码=0x7f7f7f7f7f7f…,
5.size=RCX;
6.m2||m1=2(8*size)-1//m1、m2是64位的
7.value1=m1&PEXT(*srcptr,mask)//PEXT指令/微操作(BMI2)
8.value2=m2&PEXT(*srcptr+8,mask)
9.dst=(value2<<56)|value1
图8a-图8c中图示出与对varint进行解码有关的操作。这些操作包括经解码的varint值,该经解码的varint值被写入到64位的(或128位的)dst寄存器、指向包含经编码的varint的存储器的128位块的开始的指针(scrptr)、以及varint的长度被存储在其中的RCX寄存器。
在行6中,64位的m1和m2值中的每个值被设置为2(8*size)-1。在当前示例中,尺寸为3,并且因此m1和m2=16,777,215(十进制的)或111111111111111111111111b或0xffffff。在行7中,(部分地)使用PEXT(并行位提取)来确定value1(值1)的位。如图8a和图8b中所图示,PEXT指令是通常与PDEP指令成对的指令,并且执行PDEP的逆操作。PEXT指令使用掩码将源操作数中的连续的或非连续的位传送到目的地中连续的低阶位位置(结果被存储在其中)。对于在掩码中设置的每个位,PEXT从源操作数提取对应的位,并将它们写入到目的地操作数的连续的较低位中。目的地的剩余的较高位被归零。
如图8a中所示,每次在掩码中遇到位值‘0’,源操作数中由scrptr指向的对应的位(即,具有同一位位置)被跳过。如图8a的底部处的位模式所描绘,PEXT(*srcptr,mask)的结果随后与m1进行逻辑与,以获得value1。
图8b图示出与行8有关的操作和对应的数据。此次对由scrptr+8指向的较高的8个字节(15:8)执行操作。在图8b的底部处示出了结果value2(值2)位模式。
图8c示出了行9的操作,其中,对应于经解码的varint 106903的结果被写入到dst寄存器。为了简单起见,未示出较高的字节位,但它们将是全0。
除了上述两个编码和两个解码varint指令,还可在ISA中实现附加的指令。在列表5中,varint64_encode2指令利用经编码的值写入m128,并且将尺寸写入到RCX中。
列表5
varint64_encode2(varint64_编码2)m128,RCX,r64
1.//指向128位的dstptr指针,
2.//r64(或r128,例如XMM)src1,
3.//(如果编码允许,则)r64隐式寄存器RCX或显式的src2
4.//64位的常数标志=0x8080808080…,掩码=0x7f7f7f7f7f7f…,
5.value=src1|1;
6.x=BSR(value);//位扫描逆指令/微操作
7.x=(9*x+73);//如果被实现为微码,则这可以利用LEA微操作来完成
8.size=x/64;//固定的右移6
9.*dstptr=标志|PDEP(src1,掩码);//PDEP指令/uop(BMI2)
10.*(dstptr+8)=flags|PDEP(src1>>56,mask);
11.dstptr[size-1]&=0x7F;
12.RCX=size;
列表6示出了全部基于寄存器的变体。
列表6
//利用经编码的指令写入寄存器对<RAX:RDX>并将尺寸写入到RCX的指令
varint64_encode2_reg(varint64_编码2_寄存器)RAX,RDX,RCX,r64
1.//利用经编码的值来写入RAX:RDX
2.//r64(或r128,例如XMM)src1,
3.//(如果编码允许,则)r64隐式寄存器RCX或显式的src2
4.//64位的常数标志=0x8080808080…,掩码=0x7f7f7f7f7f7f…,
5.value=src1|1;
6.x=BSR(value);//位扫描逆指令/微操作
7.x=(9*x+73);//如果被实现为微码,则这可以利用LEA微操作来完成
8.size=x/64;//固定的右移6
9.m2||m1=2(8*size)-1-1//m1、m2是64位的
10.RDX=m1&(flags|PDEP(src1,mask));//PDEP微操作(BMI2)
11.RAX=m2&(flags|PDEP(src1>>56,mask));
12.RCX=size;
前述varint编码和解码指令可在采用x86ISA的处理器中实现。然而,这仅仅是示例性的而非限制性的,因为可在各种处理器架构上实现前述指令的变体。例如,考虑RISC类型的Arm处理器。这些指令一般可容许3个操作数。它们具有在通用寄存器(GPR)(例如,16个或32个寄存器)上工作的整数标量指令、以及在128位SIMD(被称作Neon)寄存器上工作的向量/浮点指令。
图9中示出了定制核Arm处理器架构——900的示例。微架构900包括分支预测单元(BPU)902、取出单元904、指令转换后备缓冲器(ITLB)906、64KB(千字节)指令存储908、取出队列910、多个解码器(DEC)912、寄存器重命名块914、重排序缓冲器(ROB)916、保留站单元(RSU)918、920和922、分支算术逻辑单元(BR/ALU)924、ALU/MUL(乘法器)/BR 926、移位/ALU928和930、以及加载/存储块932和934。微架构900进一步包括向量/浮点(VFP)Neon块936和938以及VFP Neon密码块940、L2控制块942、整数寄存器944、128位的VFP和Neon寄存器946、ITLB 948、以及64KB指令存储950。
列表7示出了与使用Arm微架构的64位的varint编码尺寸指令的一个实施例对应的伪代码。
列表7
A64_varint64_encode_size_GPR(A64_varint64_编码_尺寸_GPR)Xd,Xm//64位的GPR寄存器
1.//dst,src返回数<=10
2.value=Xm|1;
3.x=BSR(value);//位扫描逆指令/微操作
4.x=(9*x+73);
5.Xd=x/64;//固定的右移6
注意,我们可可以将SIMD向量128位寄存器变体定义为:
A64_varint64_encode_size_VFP(A64_varint64_编码_尺寸_VFP)Vd.2D,Vm.2D//计算以上64位通道对中的高和低通道
列表8示出了与使用Arm微架构的64位的varint编码指令的一个实施例对应的伪代码。
列表8
A64_varint64_encode_VFP(A64_varint64_编码_VFP)Vd.1Q,Vn.1D,Vm.1D
1.//目的地Vd是128位的,
2.//2个源操作数的低64位Vn、Vm
3.//64位的常数标志=0x8080808080…,掩码=0x7f7f7f7f7f7f…,
4.size=Vm;
5.m2||m1=2(8*size)-1-1//m1、m2是64位的
6.Vd[63:0]=m1&(flags|PDEP(Vn,mask));//PDEP op来自HSW BMI
7.Vd[127:64]=m2&(flags|PDEP(Vn>>56,mask));
列表9示出了与使用Arm微架构的64位的varint尺寸解码指令的一个实施例对应的伪代码。
列表9
A64_varint64_Decode_size_VFP(A64_varint64_解码_尺寸_VFP)Vd.1D,Vm.16B//抛出错误
1.//dst是向量寄存器的低64位,源是128位的返回数<=10
2.for(size=1;size<=16;size++){
3.if((Vm[size-1]&0x80)==0)break;//Vm被视为16个字节的数组
4.}
5.if(size>10)return error//或设置条件代码,诸如VCNZ
6.Vd[63:0]=size;
也可将Xd用作目的地(例如,64位的GPR)来实现前述指令。
列表10示出了与使用Arm微架构的64位的varint解码指令的一个实施例对应的伪代码。
列表10
A64_varint64_Decode_VFP(A64_varint64_解码_VFP)Vd.1D,Vn.1Q,Vm.1D
1.//dst是向量寄存器的低64位,
2.//Vn是128位的,包含经编码的整数
3.//向量寄存器的低64位Vm具有尺寸
4.//64位的常数掩码=0x7f7f7f7f7f7f…,
5.size=Vm;
6.m2||m1=2(8*size)-1//m1、m2是64位的
7.value1=m1&PEXT(Vn[63:0],mask)//PEXT op来自BMI2
8.value2=m2&PEXT(Vn[127:64],mask)
9.Vd[63:0]=(value2<<56)|value1
图10a-图10d中图示出使用本文中所公开的新颖的编码基于Arm的ISA指令来生成字节紧缩的经编码的varint字节流的示例。在该示例中,使用A64_varint64_encode_size_VFP和A64_varint64_encode_VFP指令来编码四个varint 10592663、2979112352、9776547和7039567833107374484的序列。本文中所描述的这些指令的其他变体能以类似的方式来实现。
过程在图10a中示出的状态下开始,在该状态下,具有十进制值10592663的第一varint 1000被接收、编码并添加到经编码的字节流。一般地,在64位的处理器上,每个varint将作为64位的二进制值被接收,诸如,由64位未经编码的二进制格式1002所描绘。A64_varint64_encode_size_VFP和A64_varint64_encode_VFP指令的执行将产生经编码的varint 1004,该经编码的varint 1004被添加到经编码的字节流1006由dstptr指向的地址处。
为了简单和清楚起见,经编码的字节流1006被描绘成已经被清除的三个顺序的8字节的(64位的)高速缓存行(即,每个64位的高速缓存行都是全0)。如所示,经编码的varint 1004的字节0:7被写入到经编码的字节流1006,该经编码的字节流1006包括:字节0:3,其包含作为四字节序列1008的经编码的varint位;以及剩余的字节4:7,其被写入为全0。随后将dstprt提前四个字节,该dstprt是10592663的编码尺寸。在一个实施例中,取决于经编码的varint的尺寸是8个字节还是更少,8个字节(字节0:7)或者16个字节(0:7)和(8:15)被写入到流。
图10b中示出了对具有十进制值2979112352和未经编码的二进制格式1012的第二varint 1010的处理。A64_varint64_encode_size_VFP和A64_varint64_encode_VFP指令的执行将产生经编码的varint 1014,该经编码的varint 1014被添加到经编码的字节流1006由dstptr指向的地址处。如前,经编码的varint 1014的字节0:7被顺序地写入到字节流1006,该字节流1006被描绘为包括:具有四个字节0:3的第一部分1016a以及具有单个字节:4的第二部分1016b。(注意,字节0:4将简单地被写入到经编码的字节流,作为接下来的五个字节;图10b中将其拆分的原因是由于绘图尺寸限制。)随后将dstprt提前5个字节,该dstprt是2979112352的编码尺寸。
图10c中示出了对具有十进制值9776547和未经编码的二进制格式1020的第三varint 1018的处理。A64_varint64_encode_size_VFP和A64_varint64_encode_VFP指令的执行将产生经编码的varint 1022,该经编码的varint 1022被添加到经编码的字节流1006由dstptr指向的地址处。如前,经编码的varint 1022的字节0:7被顺序地写入到字节流1006,该字节流1006包括被描绘为四字节序列1024的字节0:3,而剩余的字节4:7为全0。随后将dstprt提前4个字节,该dstprt是9776547的编码尺寸。
图10d中示出了对具有十进制值7039567833107374484和未经编码的二进制格式1028的第四varint 1026的处理。A64_varint64_encode_size_VFP和A64_varint64_encode_VFP指令的执行将产生经编码的varint 1030,该经编码的varint 1030被添加到经编码的字节流1006由dstptr指向的地址处。在该实例中,经编码的varint具有大于8个字节的尺寸,因此字节0:15被添加到经编码的字节流1006。这包括经编码varint 1030的字节0:9被顺序地写入到字节流1006,该字节流1006被描绘为字节0:2部分1032a和字节3:9部分1032b。随后将dstprt提前10个字节,该dstprt是7039567833107374484的编码尺寸。
一旦接收到包含经编码的字节流的部分(或全部)的消息的端点,则执行解码操作以将经解码的varint返回回到它们的原始的未经编码的整数形式。继续当前示例,图11a-图11d分别描绘了用于使用A64_varint64_Decode_size_VFP和A64_varint64_Decode_VFP指令来对varint 10592663、2979112352、9776547和7039567833107374484的经编码的格式进行解码的对应的解码操作。
在一个级别上,对经编码的字节流进行解码执行与编码字节流的操作相逆的操作。然而,明显的差异是编码varint尺寸指令和编码varint指令一次仅对一个64位的(8字节的)varint进行操作,而varint解码尺寸指令和varint解码指令可对经编码的字节流中接下来的128个位进行操作,因为经编码的varint可具有大于8个字节的尺寸是可能的。
如图11a中所示,如由字节0:7和8:15所描绘,A64_varint64_Decode_size_VFP指令的执行将经编码的字节流1006中开始于srcptr的当前位置的接下来的16个字节复制到本地寄存器1100和1102中。以与以上所讨论的varint64_Decode_size指令类似的方式,A64_varint64_Decode_size_VFP指令在字节0处开始顺序地对每个字节求值,直到其在字节的最高有效位中找到‘0’,每次循环迭代递增尺寸变量。如图11a所示,A64_varint64_Decode_size_VFP指令确定经编码的尺寸是4个字节,该尺寸被用作对接下来执行的A64_varint64_Decode_VFP指令的尺寸输入。A64_varint64_Decode_VFP指令对这四个字节进行操作,跳过每个字节的最高有效位,以生成经解码的位模式,该经解码的位模式被写入到目的地(dst)寄存器1104。第一个被解码的varint是10592663,其与在图10a中被编码的第一个varint相同。随后将scrptr提前第一经编码的varint的尺寸,该尺寸为4个字节。(注意,可在处理经编码的字节流中的每个字节时一次将scrptr提前一个字节——为简单起见,scrptr的提前在图11a-图11d中被图示为单个操作。)
图11b中示出了第二经编码的varint的解码。如前,A64_varint64_Decode_size_VFP指令的执行将经编码的字节流1006中开始于srcptr的当前位置的接下来的16个字节复制到本地寄存器1100和1102。A64_varint64_Decode_size_VFP指令确定经编码的尺寸是5个字节,该尺寸被用作对接下来执行的A64_varint64_Decode_VFP指令的尺寸输入。A64_varint64_Decode_VFP指令对这5个字节进行操作,跳过每个字节的最高有效位,以生成经解码的位模式,该经解码的位模式被写入到目的地(dst)寄存器1104。第二个被解码的varint是2979112352,其与在图10b中被编码的第二个varint相同。随后将scrptr提前第二经编码的varint的尺寸,该尺寸为5个字节。
图11c中示出了第三经编码的varint的解码。如前,A64_varint64_Decode_size_VFP指令的执行将经编码的字节流1006中开始于srcptr的当前位置的接下来的16个字节复制到本地寄存器1100和1102。A64_varint64_Decode_size_VFP指令确定经编码的尺寸为4个字节,该经编码的尺寸被用作对这4个字节进行操作的A64_varint64_Decode_VFP指令的尺寸输入,跳过每个字节的最高有效位,以生成经解码的位模式,该经解码的位模式被写入到目的地(dst)寄存器1104。第三个被解码的varint是9776547,其与在图10c中被编码的第三个varint相同。随后将scrptr提前4个字节,即第三经编码的varint的尺寸。
图11d中示出了第四经编码的varint的解码。A64_varint64_Decode_size_VFP指令的执行将经编码的字节流1006中开始于srcptr的当前位置的接下来的16个字节复制到本地寄存器1100和1102。A64_varint64_Decode_size_VFP指令确定经编码的尺寸是10个字节,该尺寸被用作对A64_varint64_Decode_VFP指令的尺寸输入。如所图示,A64_varint64_Decode_VFP指令对字节0:9进行操作,要求对来自寄存器1100和1102两者的数据的访问,跳过每个字节的每个字节的最高有效位,以生成经解码的位模式,该经解码的位模式被写入到目的地(dst)寄存器1104。第四个被解码的varint是7039567833107374484,其与在图10c中被编码的第四个varint相同。随后将scrptr提前10个字节,即第四经编码的varint的尺寸。解码过程随后将以类似的方式继续,以处理经编码的字节流的剩余部分(未示出)。
本文中所公开的新颖的varint编码和解码指令将提供处理可变长度整数中的显著改进,诸如,由谷歌的Protobuf消息所使用。在常规方式下,用于对varint字节流进行编码和解码的软件指令将被写为采用诸如C++、Java、Python等之类的语言的源代码,并且由编译器编译以用于目标处理器架构,目标处理器架构将生成可以由具有目标处理器架构的处理器执行的众多机器级(例如,ISA)指令。相反,对于在其ISA中采用一组varint编码和解码指令的处理器,编译器将生成实质上较少的机器级指令,因为可以使用单个指令代替编译用于对在源代码级别写入的varint进行编码或解码的整个方法或函数所产生的许多指令。而且,在一些实施例中,如以上所描述,对varint的尺寸以及varint本身两者进行编码或解码可采用单个指令完成。进而,在源代码级别,语言可以包括用于对varint进行编码或解码的单个指令——当那些单个指令被编译时,对应的机器级代码将使用ISA varint指令来生成。
如以上所描述,一些实施例可采用PDEP和PEXT ISA微操作。例如,具有对PDEP和PEXT的现有支持的ISA可被扩展为支持新的指令。一般地,可使用微代码来实现PDEP和PEXT指令,或者整个伪代码可被实现为电路。例如,在一些实施例中,通过PDEP和PEXT指令执行的相同的操作可利用电路以数据路径来实现。
如以上所讨论,当考虑使用微代码还是电路来实现指令时,通常存在面积/复杂度相对性能的权衡。例如,假设你有具有4行代码的伪代码序列,假定每一行在操作(例如,算术、移位……)方面相当简单。在一个实施例之下,再次使用ISA中的现有ALU。在该方式下,当用于实现4行伪代码的指令解码时,它将触发微定序器(micro-sequencer),该微定序器将使其看起来像与4行伪代码对应地执行的4个更简单的指令(微操作)。在此情况下,性能将被降低,因为ALU对于该指令将使用高达4个周期。此类型的另一指令可以仅在4个周期之后发布。任选地,可向流水线添加新的电路。用于可视化该方式的最简单的方式是伪代码中的每一行变成一个流水线级。由于对于每个周期,此类型的新的指令可以被发布到流水线中,所以性能将被提高。作为又一选项,可使用微代码和电路的组合来实现本文中所公开的新的指令。
在下列众多条款中阐述本文中所描述主题的进一步的方面:
1.一种处理器,包括:
电路和逻辑中的至少一者,被配置成用于实现指令的集合,所述指令的集合是用于所述处理器的指令集架构(ISA)的部分,所述指令的集合与对可变长度整数(varint)进行编码和解码有关,所述指令的集合包括,
varint尺寸编码指令,用于对varint的尺寸进行编码;
varint编码指令,用于对varint进行编码;
varint尺寸解码指令,用于对经编码的varint的尺寸进行解码;以及
varint解码指令,用于对经编码的varint进行解码。
2.如条款1所述的处理器,其中,所述varint尺寸编码指令包括:
将指令标识为varint尺寸编码指令的操作码;
标识在其中存储varint的源寄存器的源操作数;以及
标识将在其中写入所述varint尺寸编码指令的结果的目的地寄存器的目的地操作数。
3.如条款1或2所述的处理器,其中,所述varint尺寸编码指令在被执行时执行包括以下各项的操作:
标识所述varint中的最高有效置位位的整数索引;
将所述整数索引乘以9,加73,并且将结果位移位6。
4.如前述条款中任一项所述的处理器,其中,所述varint编码指令包括:
将指令标识为varint编码指令的操作码;
包括目的地指针(dstptr)的第一操作数;
包括在其中存储源varint的64个位或128个位中的一者的源寄存器的第二操作数;以及
包括在其中存储所述varint的尺寸的寄存器的第三操作数。
5.如前述条款中任一项所述的处理器,其中,所述varint编码指令在被执行时执行包括以下各项的操作:
将varint转换为包括一个或多个可变长度量(VLQ)八位位组的VLQ编码。
6.如前述条款中任一项所述的处理器,其中,所述ISA包括并行位转储(PDEP)指令,并且所述varint编码指令在被执行时采用至少一个PDEP指令,每个PDEP指令包括与所述varint的原始或经位移位的部分对应的源操作数、以及包括具有0x7f7f7f7f...模式的掩码的第二操作数。
7.如条款6所述的处理器,其中,所述varint编码指令在被执行时执行包括以下各项的操作:
对包括所述varint和所述掩码的源执行第一PDEP操作;
将所述第一PDEP操作的结果与具有0x80808080…模式的标志常数进行逻辑或,并且将结果存储在目的地中;
对位移位56个位的源和所述掩码执行第二PDEP操作;
将所述第二PDEP操作的结果与具有0x80808080…模式的标志常数进行逻辑或,并将结果存储在从所述目的地的起始偏移8个字节的地址处;以及
对从所述目的地的所述起始偏移n个字节的字节的最高有效位(MSB)进行置位,其中,n等于所述varint的以字节为单位的尺寸。
8.如前述条款中任一项所述的处理器,其中,所述varint尺寸解码指令包括:
将指令标识为varint尺寸解码指令的操作码;
目的地操作数,标识将在其中写入所述varint尺寸解码指令的结果的目的地寄存器;以及
源指针,指向将由所述varint尺寸解码指令进行解码的经编码的varint的位置。
9.如条款8所述的处理器,其中,所述varint尺寸解码指令在被执行时执行包括以下各项的操作:
开始于经编码的varint的第一个字节,对一个或多个顺序字节中的每个顺序字节求值,直到确定正在被求值的字节的最高有效位是‘0’;以及
将所述varint的以字节为单位的尺寸存储在目的地寄存器中,所述尺寸等于被求值的字节的数量。
10.如前述条款中任一项所述的处理器,其中,所述varint解码指令包括:
将指令标识为varint解码指令的操作码;
包括在其处写入所述varint解码指令的结果的目的地的第一操作数;
指向将由所述varint解码指令进行解码的经编码的varint的位置的源指针;以及
标识在其中存储所述varint的尺寸的寄存器的第三操作数。
11.如前述条款中任一项所述的处理器,其中,所述varint解码指令在被执行时执行包括以下各项的操作:
将使用包括一个或多个VLQ八位位组的可变长度量(VLQ)编码进行编码的源varint转换为整数。
12.如前述条款中任一项所述的处理器,其中,所述ISA包括并行位提取(PEXT)指令,并且所述varint解码指令在被执行时采用至少一个PEXT指令,每个PEXT指令包括:包括经编码的varint的相应部分的源操作数、以及包括具有0x7f7f7f7f...模式的掩码的第二操作数。
13.如条款12所述的处理器,其中,所述varint解码指令在被执行时执行包括以下各项的操作:
对所述经编码的varint的较低部分和所述掩码执行第一PEXT操作;
将所述第一PEXT操作的结果与值m1逐位地进行逻辑与,以生成第一value1,其中
m1=2(8*size)-1;
对所述经编码的varint的较高部分和所述掩码执行第二PEXT操作;
将所述第二PEXT操作的结果与值m2逐位地进行逻辑与,以生成第二value2,其中
m2=2(8*size)-1;
将value2中的位向左位移位56位,以创建经位移位的value2;以及
将value1与经位移位的value2进行逻辑或。
14.如前述条款中任一项所述的处理器,其中,所述处理器采用基于Arm的微架构。
15.如前述条款中任一项所述的处理器,其中,所述处理器采用基于x86的微架构。
16.如前述条款中任一项所述的处理器,其中,所述电路和逻辑中的至少一者被配置成用于实现不包括微代码的指令的集合。
17.如前述条款中任一项所述的处理器,其中,所述电路和逻辑中的至少一者被配置成用于实现包括微代码的指令的集合。
18.一种非瞬态机器可读介质,具有存储于其上的半导体设计数据,所述半导体设计数据定义用于处理器中的指令集架构(ISA)的电路和逻辑,所述ISA包括与编码和解码可变长度整数(varint)有关的指令的集合,所述指令的集合包括,
varint尺寸编码指令,用于对varint的尺寸进行编码;
varint编码指令,用于对varint进行编码;
varint尺寸解码指令,用于对经编码的varint的尺寸进行解码;以及
varint解码指令,用于对经编码的varint进行解码。
19.如条款18所述的非瞬态机器可读介质,其中,所述varint尺寸编码指令包括:
将指令标识为varint尺寸编码指令的操作码;
标识在其中存储varint的源寄存器的源操作数;以及
标识将在其中写入所述varint尺寸编码指令的结果的目的地寄存器的目的地操作数。
20.如条款18或19所述的非瞬态机器可读介质,其中,所述varint尺寸编码指令在被执行时执行包括以下各项的操作:
标识所述varint中的最高有效置位位的整数索引;
将所述整数索引乘以9,加73,并且将结果位移位6。
21.如条款18-20中任一项所述的非瞬态机器可读介质,其中,所述varint编码指令包括:
将指令标识为varint编码指令的操作码;
包括目的地指针(dstptr)的第一操作数;
包括在其中存储源varint的64个位或128个位中的一者的源寄存器的第二操作数;以及
包括在其中存储所述varint的尺寸的寄存器的第三操作数。
22.如条款18-21中任一项所述的非瞬态机器可读介质,其中,所述varint编码指令在被执行时执行包括以下各项的操作:
将varint转换为包括一个或多个可变长度量(VLQ)八位位组的VLQ编码。
23.如条款18所述的非瞬态机器可读介质,其中,所述ISA包括并行位转储(PDEP)指令,并且所述varint编码指令在被执行时采用至少一个PDEP指令,每个PDEP指令包括与所述varint的原始或经位移位的部分对应的源操作数、以及包括具有0x7f7f7f7f...模式的掩码的第二操作数。
24.如条款23所述的非瞬态机器可读介质,其中,所述varint编码指令在被执行时执行包括以下各项的操作:
对包括所述varint和所述掩码的源执行第一PDEP操作;
将所述第一PDEP操作的结果与具有0x80808080…模式的标志常数进行逻辑或,并且将结果存储在目的地中;
对位移位56个位的源和所述掩码执行第二PDEP操作;
将所述第二PDEP操作的结果与具有0x80808080…模式的标志常数进行逻辑或,并将结果存储在从所述目的地的起始偏移8个字节的地址处;以及
对从所述目的地的所述起始偏移n个字节的字节的最高有效位(MSB)进行置位,其中,n等于所述varint的以字节为单位的尺寸。
25.如条款18-24中的任一项所述的非瞬态机器可读介质,其中,所述varint尺寸解码指令包括:
将指令标识为varint尺寸解码指令的操作码;
标识将在其中写入所述varint尺寸解码指令的结果的目的地寄存器的目的地操作数;以及
指向将由所述varint尺寸解码指令进行解码的经编码的varint的位置的源指针。
26.如条款25所述的非瞬态机器可读介质,其中,所述varint尺寸解码指令在被执行时执行包括以下各项的操作:
开始于经编码的varint的第一个字节,对一个或多个顺序字节中的每个顺序字节求值,直到确定正在被求值的字节的最高有效位是‘0’;以及
将所述varint的以字节为单位的尺寸存储在目的地寄存器中,所述尺寸等于被求值的字节的数量。
27.如条款18-26中任一项所述的非瞬态机器可读介质,其中,所述varint解码指令包括:
将指令标识为varint解码指令的操作码;
包括在其处写入所述varint解码指令的结果的目的地的第一操作数;
指向将由所述varint解码指令进行解码的经编码的varint的位置的源指针;以及
标识在其中存储所述varint的尺寸的寄存器的第三操作数。
28.如条款18-27中任一项所述的非瞬态机器可读介质,其中,所述varint解码指令在被执行时执行包括以下各项的操作:
将使用包括一个或多个VLQ八位位组的可变长度量(VLQ)编码进行编码的源varint转换为整数。
29.如条款18-28中任一项所述的非瞬态机器可读介质,其中,所述ISA包括并行位提取(PEXT)指令,并且所述varint解码指令在被执行时采用至少一个PEXT指令,每个PEXT指令包括:包括经编码的varint的相应部分的源操作数、以及包括具有0x7f7f7f7f...模式的掩码的第二操作数。
30.如条款29所述的非瞬态机器可读介质,其中,所述varint解码指令在被执行时执行包括以下各项的操作:
对所述经编码的varint的较低部分和所述掩码执行第一PEXT操作;
将所述第一PEXT操作的结果与值m1逐位地进行逻辑与,以生成第一value1,其中
m1=2(8*size)-1;
对所述经编码的varint的较高部分和所述掩码执行第二PEXT操作;
将所述第二PEXT操作的结果与值m2逐位地进行逻辑与,以生成第二value2,其中
m2=2(8*size)-1;
将value2中的位向左位移位56位,以创建经位移位的value2;以及
将value1与经位移位的value2进行逻辑或。
31.如条款18-30中任一项所述的非瞬态机器可读介质,其中,所述处理器采用基于Arm的微架构。
32.如条款18-31中任一项所述的非瞬态机器可读介质,其中,所述处理器采用基于x86的微架构。
33.一种方法,包括:
通过包括指令集架构(ISA)的处理器将第一多个具有可变长度的整数(varint)编码为第一经编码的varint字节流,在第一经编码的varint字节流中,对于每个varint,所述varint的整数值被编码;以及
通过处理器对包括第二多个经编码的varint的第二经编码的varint字节流进行解码,以将每个经编码的varint转换为整数值,
其中,使用varint编码指令对每个varint进行编码,所述varint编码指令被实现为所述处理器的所述ISA的部分,并且其中,使用varint解码指令对所述第二经编码的varint字节流进行解码,所述varint解码指令是所述处理器的所述ISA的部分。
34.如条款33所述的方法,进一步包括:
使用varint编码尺寸指令对所述第一经编码的varint字节流中的所述第一多个varint中的每个varint的以字节为单位的尺寸进行编码,所述varint编码尺寸指令是所述处理器的所述ISA的部分。
35.如条款34所述的方法,其中,所述varint尺寸编码指令包括:
将指令标识为varint尺寸编码指令的操作码;
标识在其中存储varint的源寄存器的源操作数;以及
标识将在其中写入所述varint尺寸编码指令的结果的目的地寄存器的目的地操作数。
36.如条款33或34所述的方法,其中,所述varint尺寸编码指令在被执行时执行包括以下各项的操作:
对于所述第一多个varint中的每个varint,
标识所述varint中的最高有效置位位的整数索引;
将所述整数索引乘以9,加73,并且将结果位移位6。
37.如条款33所述的方法,其中,使用所述varint编码指令对所述第一经编码的varint字节流中的所述经编码的varint中的每个经编码的varint的以字节为单位的尺寸进行编码。
38.如条款33-37中任一项所述的方法,其中,所述varint编码指令包括:
将指令标识为varint编码指令的操作码;
包括目的地指针(dstptr)的第一操作数;
包括在其中存储源varint的64个位或128个位中的一者的源寄存器的第二操作数;以及
包括在其中存储所述varint的尺寸的寄存器的第三操作数。
39.如条款33-38中任一项所述的方法,其中,所述varint编码指令在被执行时将varint转换为包括一个或多个可变长度量(VLQ)八位位组的VLQ编码。
40.如条款33-39中任一项所述的方法,其中,所述ISA包括并行位转储(PDEP)指令,并且所述varint编码指令在被执行时采用至少一个PDEP指令,每个PDEP指令包括与所述varint的原始或经位移位的部分对应的源操作数、以及包括具有0x7f7f7f7f...模式的掩码的第二操作数。
41.如条款40所述的方法,其中,所述varint编码指令在被执行时执行包括以下各项的操作:
对包括所述varint和所述掩码的源执行第一PDEP操作;
将所述第一PDEP操作的结果与具有0x80808080…模式的标志常数进行逻辑或,并且将结果存储在目的地中;
对位移位56个位的源和所述掩码执行第二PDEP操作;
将所述第二PDEP操作的结果与具有0x80808080…模式的标志常数进行逻辑或,并将结果存储在从所述目的地的起始偏移8个字节的地址处;以及
对从所述目的地的所述起始偏移n个字节的字节的最高有效位(MSB)进行置位,其中,n等于所述varint的以字节为单位的尺寸。
42.如条款33-41中任一项所述的方法,其中,所述第二经解码的varint字节流中的经解码的varint中的每个经解码的varint包括经编码的尺寸,并且其中,所述方法进一步包括:
对于每个经编码的varint,
使用varint解码尺寸指令对经编码的varint的尺寸进行解码,所述varint解码尺寸指令是所述处理器的所述ISA的部分;以及
使用varint解码指令对经编码的varint进行解码,所述varint解码指令是所述处理器的所述ISA的部分。
43.如条款42所述的方法,其中,所述varint尺寸解码指令包括:
将指令标识为varint尺寸解码指令的操作码;
标识将在其中写入所述varint尺寸解码指令的结果的目的地寄存器的目的地操作数;以及
指向将由所述varint尺寸解码指令进行解码的经编码的varint的位置的源指针。
44.如条款43所述的方法,其中,所述varint尺寸解码指令在被执行时执行包括以下各项的操作:
开始于经编码的varint的第一个字节,对一个或多个顺序字节中的每个顺序字节求值,直到确定正在被求值的字节的最高有效位是‘0’;以及
将所述varint的以字节为单位的尺寸存储在目的地寄存器中,所述尺寸等于被求值的字节的数量。
45.如条款33-44中任一项所述的方法,其中,所述varint解码指令包括:
将指令标识为varint解码指令的操作码;
包括在其处写入所述varint解码指令的结果的目的地的第一操作数;
指向将由所述varint解码指令进行解码的经编码的varint的位置的源指针;以及
标识在其中存储所述varint的尺寸的寄存器的第三操作数。
46.如条款33-45中任一项所述的方法,其中,所述varint解码指令在被执行时将使用包括一个或多个VLQ八位位组的可变长度量(VLQ)编码进行编码的源varint转换为整数。
47.如条款33-46中任一项所述的方法,其中,所述ISA包括并行位提取(PEXT)指令,并且所述varint解码指令在被执行时采用至少一个PEXT指令,每个PEXT指令包括:包括经编码的varint的相应部分的源操作数、以及包括具有0x7f7f7f7f...模式的掩码的第二操作数。
48.如条款47所述的方法,其中,所述varint解码指令在被执行时执行包括以下各项的操作:
对所述经编码的varint的较低部分和所述掩码执行第一PEXT操作;
将所述第一PEXT操作的结果与值m1逐位地进行逻辑与,以生成第一value1,其中
m1=2(8*size)-1;
对所述经编码的varint的较高部分和所述掩码执行第二PEXT操作;
将所述第二PEXT操作的结果与值m2逐位地进行逻辑与,以生成第二value2,其中
m2=2(8*size)-1;
将value2中的位向左位移位56位,以创建经位移位的value2;以及
将value1与经位移位的value2进行逻辑或。
49.如条款33-48中任一项所述的方法,其中,所述处理器采用基于Arm的微架构。
50.如条款33-48中任一项所述的方法,其中,所述处理器采用基于x86的微架构。
51.如条款33-50中任一项所述的方法,其中,所述varint中的每个varint具有从1个字节到8个字节范围中的以字节为单位的未经编码的尺寸。
52.如条款33-51中任一项所述的方法,其中,所述第一经编码的varint字节流和第二经编码的varint字节流中的每一者采用低位优先字节次序。
53.如条款33-51中任一项所述的方法,其中,所述第一经编码的varint字节流和第二经编码的varint字节流中的每一者采用高位优先字节次序。
另外,本说明书的实施例不仅可在半导体芯片(诸如,SoC的处理器)内实现,而且还可在机器可读介质内实现。例如,以上所描述的设计可被存储在与用于设计半导体器件的设计工具相关联的机器可读介质上和/或嵌入在该机器可读介质内。示例包括以VHSIC硬件描述语言(VHDL)语言、Verilog语言或SPICE语言来格式化的netlist(网表)。一些网表示例包括:行为级网表、寄存器传送级(RTL)网表、门级网表以及晶体管级网表。机器可读介质还包括具有诸如GDS-II文件之类的布局信息的介质。此外,用于半导体芯片设计的网表文件或其他机器可读介质可被用在模拟环境中以执行以上所描述的教导的方法。
虽然参考特定实现方式描述了一些实施例,但是根据一些实施例,其他实现方式也是可能的。另外,附图中所图示的和/或本文中所描述的元件或其他特征的布置和/或次序不必以所图示和所描述的特定方式来布置。根据一些实施例,许多其他布置也是可能的。
在附图中示出的每个系统中,在一些情况下的元件可各自具有相同的附图标记或不同的附图标记,以表明所表示的元件可能是不同和/或类似的。然而,元件可以足够灵活以具有不同的实现方式,并与本文所示出或所描述的一些或所有系统一起工作。附图中所示出的各种元件可以相同或不同。将哪个称为第一元件以及将哪个称为第二元件是任意的。
在说明书和权利要求书中,可使用术语“耦合的”和“连接的”及其衍生词。应当理解,这些术语并不旨在作为彼此的同义词。相反,在特定实施例中,可以使用“连接的”来指示两个或更多个元件彼此出于直接的物理和/或电接触。“耦合的”可意指两个或更多个元件处于直接的物理或电接触。然而,“耦合的”也可意指两个或更多个元件彼此并不直接接触,但是仍然彼此协作或相互作用。
实施例是本发明的实现方式或示例。说明书中对“实施例”、“一个实施例”、“一些实施例”或“其他实施例”的引用表示结合这些实施例描述的特定的特征、结构或特性被包括在本发明的至少一些实施例中,而不一定被包括在所有的实施例中。各处出现的“实施例”、“一个实施例”或“一些实施例”不一定都指相同的实施例。
并非本文中所描述和所图示的所有组件、特征、结构、特性等等都需要被包括在特定实施例或多个实施例中。例如,如果说明书陈述“可”、“可能”、“能”或“能够”包括组件、特征、结构或特性,则不一定包括该特定的组件、特征、结构或特性。如果说明书或权利要求书引用“一”或“一个”元件,则这并不意指仅有一个该元件。如果说明书或权利要求书引用“附加”要素,则不排除存在多于一个的该附加要素。
如上所讨论,可通过对应软件和/或固件组件及应用(诸如由嵌入式处理器等执行的软件和/或固件)来促成本文中实施例的各方面。因此,本发明的实施例可用作或用于支持在某种形式的处理器、处理核或嵌入式逻辑上执行的软件程序、软件模块、固件和/或分布式软件,在处理器或核上运行或以其他方式在计算机可读或机器可读非瞬态存储介质上或者计算机可读或机器可读非瞬态存储介质内实现或达成的虚拟机。计算机可读或机器可读非瞬态存储介质包括用于存储或传送机器(例如,计算机)可读形式的信息的任何机制。例如,计算机可读或机器可读非瞬态存储介质包括提供(即,存储和/或传送)可由计算机或计算机器(例如,计算设备、电子系统等)访问的形式的信息的任何机制,诸如可记录/不可记录介质(例如,只读存储器(ROM)、随机存取存储器(RAM)、磁盘存储介质、光学存储介质、闪存设备等)。内容可以是可直接执行的(“对象”或“可执行”形式)、源代码、或差异代码(“Δ”或“补丁”代码)。计算机可读或机器可读非瞬态存储介质还可包括可以从其下载内容的存储或数据库。计算机可读或机器可读非瞬态存储介质还可包括在销售或传输时具有存储于其上的内容的设备或产品。因此,传输具有所存储的内容的设备或提供内容用于通过通信介质下载可被理解成提供包括具有本文中所描述的此类内容的计算机可读或机器可读非瞬态存储介质的制品。
本文中所描述的以上被称为过程、服务器或工具的各种组件可以是执行所描述功能的装置。可通过处理元件上运行的软件、经由嵌入式硬件等或硬件和软件的任何组合来实现由本文中所描述的各种组件执行的操作和功能。此类组件可被实现为软件模块、硬件模块、特定功能硬件(例如,专用硬件、ASIC、DSP等)、嵌入式控制器、硬连线电路、硬件逻辑等。可经由包括提供表示可以被执行的指令的内容的计算机可读或机器可读非瞬态存储介质的制品来提供软件内容(例如,数据、配置信息等)。该内容可使得计算机执行本文中所描述的各种功能/操作。
如本文中所使用,由术语“至少一个”连接的项目列表可以意指所列出的项的任何组合。例如,短语“A、B或C中的至少一个”可以意指A;B;C;A和B;A和C;B和C;或A、B和C。
以上对所图示的本发明的实施例的描述(包括在摘要中描述的内容)不旨在是详尽的,也不旨在将本发明限于所公开的精确形式。尽管出于说明的目的在本文中描述了本发明的特定实施例以及示例,但是,如相关领域技术人员将理解,在本发明的范围内,各种等效的修改是可能的。
可以根据以上具体实施方式对本发明作出这些修改。所附权利要求书中所使用的术语不应当被理解为将本发明限制于说明书和附图中所公开的特定实施例。相反,本发明的范围完全由所附权利要求书来确定,权利要求书根据权利要求解释的既定原则来解释。
Claims (30)
1.一种处理器,包括:
电路和逻辑中的至少一者,被配置成用于实现指令的集合,所述指令的集合是用于所述处理器的指令集架构(ISA)的部分,所述指令的集合与对可变长度整数(varint)进行编码和解码有关,所述指令的集合包括,
varint尺寸编码指令,用于对varint的尺寸进行编码;
varint编码指令,用于对varint进行编码;
varint尺寸解码指令,用于对经编码的varint的尺寸进行解码;以及
varint解码指令,用于对经编码的varint进行解码。
2.如权利要求1所述的处理器,其中,所述varint尺寸编码指令包括:
将指令标识为varint尺寸编码指令的操作码;
标识在其中存储varint的源寄存器的源操作数;以及
标识将在其中写入所述varint尺寸编码指令的结果的目的地寄存器的目的地操作数。
3.如权利要求1或2所述的处理器,其中,所述varint编码指令包括:
将指令标识为varint编码指令的操作码;
包括目的地指针(dstptr)的第一操作数;
包括在其中存储源varint的64个位或128个位中的一者的源寄存器的第二操作数;以及
包括在其中存储所述varint的尺寸的寄存器的第三操作数。
4.如前述权利要求中任一项所述的处理器,其中,所述varint编码指令在被执行时执行包括以下各项的操作:
将varint转换为包括一个或多个可变长度量(VLQ)八位位组的VLQ编码。
5.如前述权利要求中任一项所述的处理器,其中,所述ISA包括并行位转储(PDEP)指令,并且所述varint编码指令在被执行时采用至少一个PDEP指令,每个PDEP指令包括与所述varint的原始或经位移位的部分对应的源操作数、以及包括具有0x7f7f7f7f...模式的掩码的第二操作数。
6.如前述权利要求中任一项所述的处理器,其中,所述varint尺寸解码指令包括:
将指令标识为varint尺寸解码指令的操作码;
标识将在其中写入所述varint尺寸解码指令的结果的目的地寄存器的目的地操作数;以及
指向将由所述varint尺寸解码指令进行解码的经编码的varint的位置的源指针。
7.如权利要求6所述的处理器,其中,所述varint编码指令在被执行时执行包括以下各项的操作:
开始于经编码的varint的第一个字节,对一个或多个顺序字节中的每个顺序字节求值,直到确定正在被求值的字节的最高有效位是‘0’;以及
将所述varint的以字节为单位的尺寸存储在目的地寄存器中,所述尺寸等于被求值的字节的数量。
8.如前述权利要求中任一项所述的处理器,其中,所述varint解码指令包括:
将指令标识为varint解码指令的操作码;
包括在其处写入所述varint解码指令的结果的目的地的第一操作数;
指向将由所述varint解码指令进行解码的经编码的varint的位置的源指针;以及
标识在其中存储所述varint的尺寸的寄存器的第三操作数。
9.如前述权利要求中任一项所述的处理器,其中,所述处理器采用基于Arm的微架构。
10.如前述权利要求中任一项所述的处理器,其中,所述处理器采用基于x86的微架构。
11.一种非瞬态机器可读介质,具有存储于其上的半导体设计数据,所述半导体设计数据定义用于处理器中的指令集架构(ISA)的电路和逻辑,所述ISA包括与对可变长度整数(varint)进行编码和解码有关的指令的集合,所述指令的集合包括,
varint尺寸编码指令,用于对varint的尺寸进行编码;
varint编码指令,用于对varint进行编码;
varint尺寸解码指令,用于对经编码的varint的尺寸进行解码;以及
varint解码指令,用于对经编码的varint进行解码。
12.如权利要求11所述的非瞬态机器可读介质,其中,所述varint尺寸编码指令包括:
将指令标识为varint尺寸编码指令的操作码;
标识在其中存储varint的源寄存器的源操作数;以及
标识将在其中写入所述varint尺寸编码指令的结果的目的地寄存器的目的地操作数。
13.如权利要求11或12所述的非瞬态机器可读介质,其中,所述varint编码指令包括:
将指令标识为varint编码指令的操作码;
包括目的地指针(dstptr)的第一操作数;
包括在其中存储源varint的64个位或128个位中的一者的源寄存器的第二操作数;以及
包括在其中存储所述varint的尺寸的寄存器的第三操作数。
14.如权利要求11-13中任一项所述的非瞬态机器可读介质,其中,所述varint编码指令在被执行时执行包括以下各项的操作:
将varint转换为包括一个或多个可变长度量(VLQ)八位位组的VLQ编码。
15.如权利要求11-14中任一项所述的非瞬态机器可读介质,其中,所述ISA包括并行位转储(PDEP)指令,并且所述varint编码指令在被执行时采用至少一个PDEP指令,每个PDEP指令包括与所述varint的原始或经位移位的部分对应的源操作数、以及包括具有0x7f7f7f7f...模式的掩码的第二操作数。
16.如权利要求11-15中任一项所述的非瞬态机器可读介质,其中,所述varint尺寸解码指令包括:
将指令标识为varint尺寸解码指令的操作码;
标识将在其中写入所述varint尺寸解码指令的结果的目的地寄存器的目的地操作数;以及
指向将由所述varint尺寸解码指令进行解码的经编码的varint的位置的源指针。
17.如权利要求16所述的非瞬态机器可读介质,其中,所述varint编码指令在被执行时执行包括以下各项的操作:
开始于经编码的varint的第一个字节,对一个或多个顺序字节中的每个顺序字节求值,直到确定正在被求值的字节的最高有效位是‘0’;以及
将所述varint的以字节为单位的尺寸存储在目的地寄存器中,所述尺寸等于被求值的字节的数量。
18.如权利要求11-17中任一项所述的非瞬态机器可读介质,其中,所述varint解码指令包括:
将指令标识为varint解码指令的操作码;
包括在其处写入所述varint解码指令的结果的目的地的第一操作数;
指向将由所述varint解码指令进行解码的经编码的varint的位置的源指针;以及
标识在其中存储所述varint的尺寸的寄存器的第三操作数。
19.如权利要求11-18中任一项所述的非瞬态机器可读介质,其中,所述varint解码指令在被执行时执行包括以下各项的操作:
将使用包括一个或多个VLQ八位位组的可变长度量(VLQ)编码进行编码的源varint转换为整数。
20.如权利要求11-19中任一项所述的非瞬态机器可读介质,其中,所述ISA包括并行位提取(PEXT)指令,并且所述varint解码指令在被执行时采用至少一个PEXT指令,每个PEXT指令包括:包括经编码的varint的相应部分的源操作数、以及包括具有0x7f7f7f7f...模式的掩码的第二操作数。
21.如权利要求11-20中任一项所述的非瞬态机器可读介质,其中,所述处理器采用基于Arm的微架构。
22.如权利要求11-21中的任一项所述的非瞬态机器可读介质,其中,所述处理器采用基于x86的微架构。
23.一种方法,包括:
通过包括指令集架构(ISA)的处理器将第一多个具有可变长度的整数(varint)编码为第一经编码的varint字节流,在所述第一经编码的varint字节流中,对于每个varint,所述varint的整数值被编码;以及
通过处理器对包括第二多个经编码的varint的第二经编码的varint字节流进行解码,以将每个经编码的varint转换为整数值,
其中,使用varint编码指令对每个varint进行编码,所述varint编码指令被实现为所述处理器的所述ISA的部分,并且其中,使用varint解码指令对所述第二经编码的varint字节流进行解码,所述varint解码指令是所述处理器的所述ISA的部分。
24.如权利要求23所述的方法,其中,使用varint编码尺寸指令对所述第一经编码的varint字节流中的所述经编码的varint中的每个经编码的varint的以字节为单位的尺寸进行编码,所述varint编码尺寸指令是所述处理器的所述ISA的部分。
25.如权利要求23或24所述的方法,其中,使用所述varint编码指令对所述第一经编码的varint字节流中的所述经编码的varint中的每个经编码的varint的以字节为单位的尺寸进行编码。
26.如权利要求23-25中任一项所述的方法,其中,所述处理器采用基于Arm的微架构。
27.如权利要求23-26中任一项所述的方法,其中,所述处理器采用基于x86的微架构。
28.如权利要求23-27中任一项所述的方法,其中,所述varint中的每个varint具有从1个字节到8个字节范围中的以字节为单位的未经编码的尺寸。
29.如权利要求23-28中任一项所述的方法,其中,所述第一经编码的varint字节流和所述第二经编码的varint字节流中的每一者采用高位优先字节次序。
30.如权利要求23-28中任一项所述的方法,其中,所述第一经编码的varint字节流和所述第二经编码的varint字节流中的每一者采用低位优先字节次序。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US15/281,380 | 2016-09-30 | ||
US15/281,380 US20180095760A1 (en) | 2016-09-30 | 2016-09-30 | Instruction set for variable length integer coding |
PCT/US2017/046851 WO2018063541A1 (en) | 2016-09-30 | 2017-08-15 | Instruction set for variable length integer coding |
Publications (1)
Publication Number | Publication Date |
---|---|
CN109716291A true CN109716291A (zh) | 2019-05-03 |
Family
ID=61758825
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201780057071.7A Pending CN109716291A (zh) | 2016-09-30 | 2017-08-15 | 用于可变长度整数译码的指令集 |
Country Status (5)
Country | Link |
---|---|
US (1) | US20180095760A1 (zh) |
EP (1) | EP3519944A1 (zh) |
CN (1) | CN109716291A (zh) |
TW (1) | TW201820122A (zh) |
WO (1) | WO2018063541A1 (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112631597A (zh) * | 2019-10-09 | 2021-04-09 | 中科寒武纪科技股份有限公司 | 混洗方法及计算装置 |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10511515B1 (en) * | 2017-08-29 | 2019-12-17 | Rockwell Collins, Inc. | Protocol buffer avionics system |
GB201817783D0 (en) * | 2018-10-31 | 2018-12-19 | V Nova Int Ltd | Methods,apparatuses, computer programs and computer-readable media for processing configuration data |
WO2021037341A1 (en) * | 2019-08-27 | 2021-03-04 | Ecole Polytechnique Federale De Lausanne (Epfl) | Data transformer apparatus |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7609000B1 (en) * | 2007-10-22 | 2009-10-27 | Google Inc. | Variable-length compression technique for encoding or decoding a sequence of integers |
US20100141487A1 (en) * | 2008-12-05 | 2010-06-10 | Michael Frank | Method and apparatus for decoding variable length data |
US7941640B1 (en) * | 2006-08-25 | 2011-05-10 | Marvell International Ltd. | Secure processors having encoded instructions |
US20120185670A1 (en) * | 2011-01-14 | 2012-07-19 | Toll Bret L | Scalar integer instructions capable of execution with three registers |
US20120221539A1 (en) * | 2011-02-24 | 2012-08-30 | A9.Com, Inc. | Decoding of variable-length data with group formats |
US20140208069A1 (en) * | 2013-01-22 | 2014-07-24 | Samplify Systems, Inc. | Simd instructions for data compression and decompression |
CN104025042A (zh) * | 2011-12-30 | 2014-09-03 | 英特尔公司 | 编码以增加指令集密度 |
Family Cites Families (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5774600A (en) * | 1995-04-18 | 1998-06-30 | Advanced Micro Devices, Inc. | Method of pixel averaging in a video processing apparatus |
US6338135B1 (en) * | 1998-11-20 | 2002-01-08 | Arm Limited | Data processing system and method for performing an arithmetic operation on a plurality of signed data values |
GB2410097B (en) * | 2004-01-13 | 2006-11-01 | Advanced Risc Mach Ltd | A data processing apparatus and method for performing data processing operations on floating point data elements |
EP2104236B1 (en) * | 2007-01-19 | 2018-08-15 | Mitsubishi Electric Corporation | Table device, variable-length encoding device, variable-length decoding device, and variable-length encoding/decoding device |
US20080252652A1 (en) * | 2007-04-13 | 2008-10-16 | Guofang Jiao | Programmable graphics processing element |
US7965207B2 (en) * | 2008-10-03 | 2011-06-21 | Seomoz, Inc. | Variable length integer encoding system and method |
US9170772B2 (en) * | 2011-12-23 | 2015-10-27 | Intel Corporation | Method and apparatus for decimal floating-point data logical extraction |
US9355113B2 (en) * | 2013-01-17 | 2016-05-31 | Google Inc. | Encoding and decoding delta values |
-
2016
- 2016-09-30 US US15/281,380 patent/US20180095760A1/en not_active Abandoned
-
2017
- 2017-08-08 TW TW106126776A patent/TW201820122A/zh unknown
- 2017-08-15 WO PCT/US2017/046851 patent/WO2018063541A1/en unknown
- 2017-08-15 EP EP17856996.8A patent/EP3519944A1/en not_active Withdrawn
- 2017-08-15 CN CN201780057071.7A patent/CN109716291A/zh active Pending
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7941640B1 (en) * | 2006-08-25 | 2011-05-10 | Marvell International Ltd. | Secure processors having encoded instructions |
US7609000B1 (en) * | 2007-10-22 | 2009-10-27 | Google Inc. | Variable-length compression technique for encoding or decoding a sequence of integers |
US20100141487A1 (en) * | 2008-12-05 | 2010-06-10 | Michael Frank | Method and apparatus for decoding variable length data |
US20120185670A1 (en) * | 2011-01-14 | 2012-07-19 | Toll Bret L | Scalar integer instructions capable of execution with three registers |
US20120221539A1 (en) * | 2011-02-24 | 2012-08-30 | A9.Com, Inc. | Decoding of variable-length data with group formats |
CN103582883A (zh) * | 2011-02-24 | 2014-02-12 | A9.Com公司 | 具有组格式的可变长度数据的改进型编码和解码 |
CN104025042A (zh) * | 2011-12-30 | 2014-09-03 | 英特尔公司 | 编码以增加指令集密度 |
US20140208069A1 (en) * | 2013-01-22 | 2014-07-24 | Samplify Systems, Inc. | Simd instructions for data compression and decompression |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112631597A (zh) * | 2019-10-09 | 2021-04-09 | 中科寒武纪科技股份有限公司 | 混洗方法及计算装置 |
Also Published As
Publication number | Publication date |
---|---|
WO2018063541A1 (en) | 2018-04-05 |
US20180095760A1 (en) | 2018-04-05 |
EP3519944A1 (en) | 2019-08-07 |
TW201820122A (zh) | 2018-06-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
KR101722645B1 (ko) | 축소된 다중 네스트된 루프들의 벡터화 | |
CN117407644A (zh) | 用于片矩阵乘法和累加的系统、方法和装置 | |
Lomont | Introduction to intel advanced vector extensions | |
CN109716291A (zh) | 用于可变长度整数译码的指令集 | |
TWI751164B (zh) | 用於向量的元素排序的設備、方法及系統 | |
CN104115113B (zh) | 用于循环剩余掩码指令的系统、装置和方法 | |
TWI517042B (zh) | 用以將萬國碼字元之可變長度編碼點轉碼之處理器、方法、系統及製品 | |
BR102020019657A2 (pt) | aparelhos, métodos e sistemas para instruções de um acelerador de operações de matriz | |
TWI506539B (zh) | 十進位浮點資料邏輯提取的方法與設備 | |
TWI715618B (zh) | 資料元件比較處理器、方法、系統及指令 | |
TWI489382B (zh) | 改良的萃取指令背景之設備及方法 | |
TWI455024B (zh) | 唯一封裝資料元件識別處理器,方法,系統,及指令 | |
TWI706322B (zh) | 資料元件重新安排、處理器、方法、系統以及指令 | |
CN109471659A (zh) | 使用写掩码将两个源操作数混合进单个目的地的系统、装置和方法 | |
TW201732570A (zh) | 用於聚合集中及跨步的系統、裝置及方法 | |
GB2480338A (en) | Conditional compare instruction using a status register | |
CN104049954A (zh) | 多数据元素与多数据元素比较处理器、方法、系统和指令 | |
US11947962B2 (en) | Replicate partition instruction | |
TW201732572A (zh) | 用於跨步的載入(strided load)的系統、設備及方法 | |
CN107111484A (zh) | 四维莫顿坐标转换处理器、方法、系统和指令 | |
CN108292228B (zh) | 用于基于通道的步进收集的系统、设备和方法 | |
CN109992305A (zh) | 用于将片寄存器对归零的系统和方法 | |
CN108268244A (zh) | 用于算术递归的系统、装置和方法 | |
TW201810029A (zh) | 用於跨步載入的系統、設備及方法 | |
CN109992243A (zh) | 用于矩阵操作的系统、方法和装置 |
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 | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20190503 |
|
RJ01 | Rejection of invention patent application after publication |