CN101243441B - 用于处理字符流的方法与设备 - Google Patents
用于处理字符流的方法与设备 Download PDFInfo
- Publication number
- CN101243441B CN101243441B CN2006800302950A CN200680030295A CN101243441B CN 101243441 B CN101243441 B CN 101243441B CN 2006800302950 A CN2006800302950 A CN 2006800302950A CN 200680030295 A CN200680030295 A CN 200680030295A CN 101243441 B CN101243441 B CN 101243441B
- Authority
- CN
- China
- Prior art keywords
- stream
- utf
- character
- bit stream
- attribute bit
- 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.)
- Expired - Fee Related
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/10—Text processing
- G06F40/12—Use of codes for handling textual entities
- G06F40/126—Character encoding
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Audiology, Speech & Language Pathology (AREA)
- Health & Medical Sciences (AREA)
- Computational Linguistics (AREA)
- General Health & Medical Sciences (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Artificial Intelligence (AREA)
- Executing Machine-Instructions (AREA)
- Devices For Executing Special Programs (AREA)
- Compression, Expansion, Code Conversion, And Decoders (AREA)
Abstract
用于处理字符流的方法和装置。本发明的一个实施例是一种用于处理字符流的方法,包括:(a)响应于该字符流形成多个并行属性位流,其中并行属性位流中的每一个包括与该字符流的数据值相关联的特定属性的位值;以及(b)处理这一个或多个并行属性位流,其中所述并行属性位流中的每一个对应于字符流代码单元内的单个位的位置或其逻辑组合。
Description
本专利申请涉及根据35USC§119(e)要求其优先权的2005年6月21日提交的美国临时申请No.60/692,683,该临时申请的全部内容都被包括于此。
技术领域
本发明的一个或多个实现涉及用于处理字符流的方法与设备
背景技术
文本处理应用用于处理按照特定的字符编码方案的规约被编码成字符串或字符流的文本数据。长期以来,很多已开发的文本处理应用都是基于固定长度,单字节的字符编码方案,例如,ASCII和EBCDIC。此外,涉及各种欧洲语言或非罗马字母的文本数据的文本处理应用可使用ISO 8859的8位扩展的ASCII的方案之一。另外,一些可供选择的变长编码方案被用于中文,日文和韩文的应用。
Unicode正逐渐地被用作可能需要调整和/或组合不同来源的文本的文本处理应用的基础。Unicode字符集被设计为包括世界各地语言的字符,同时也包括来自用于数学,音乐和其他应用领域的正规符号系统的一些附加的字符。众所周知,UTF-8,UTF-16和UTF-32分别是基于8位,16位,32位代码单元的三种基础的Unicode编码方案。特别地,UTF-8是每个字符需要一至四个8位代码单元的一种变长编码方案;UTF-16是每个字符通常需要单个16位代码单元的编码方案(有些不常用的字符需要两个代码单元);以及UTF-32是每个字符需要单个32位代码单元的定长编码方案。UTF-16和UTF-32具有一些被称为UTF-16LE,UTF-16BE,UTF-32LE和UTF-32BE,这取决于代码单元内的字节排序规约。
尽管Unicode允许应用和来自许多不同资源的字符流间的相互操作,与已往基于8位字符编码方案的应用相比在处理效率上要付出一定成本。该成本在以为了实现期望的吞吐量所需的额外硬件、执行对特定字符流的应用的额外能耗,和/或一应用完成处理的所用的额外执行时间的形式表现出来时会变得很明显。
应用还可能要求将数据流的内容根据基于文本的符号系统的词法和/或者句法的规约结构化。存在很多这样的规约,范围从用于各种操作系统的简单的面向行的结构规约,到用于将计算机程序表示为源语言文本的正规程序语言文法。特别重要的是,XML作为用于编码文档和各种数据的一种标准的基于文本的标记语言的使用不断增加。在每种情况下,强加结构化信息可能会相当程度上增加对相关文本处理应用的资源需求。
一般而言,现有技术的高速文本处理用了顺序的一次一个字符(或一次一个字节)的处理,通常用C程序语言来编写。例如,XML和Unicode串处理的许多现有技术教授了顺序字符处理方法的使用。标准计算科学教科书也是这样处理解析、词法分析和文本处理应用的。
在现有技术中,有三种用于实现文本处理应用的基本技术。第一种基本技术是使用了迭代循环(例如,while循环)和分支指令(例如,if语句)来执行基于特定的字符或字符类的条件动作的手编实现。第二种基本技术是第一种变形,其中对不同字符或字符类的不同逻辑的分解是通过转移表来处理的(例如,case语句)。第三种基本技术是将有限状态机形式的表的使用系统化。有限状态机实现来源于串处理的标准理论技术;也就是用正则表达式文法来表示字符和词法语法,以及用有限自动机来识别与这些文法匹配字符串。当状态的数量和每个状态潜在字符转换的数量适度小时有限状态机技术可以给出有效实现;例如涉及7位位的ASCII处理应用每个状态需要至多128个条目。然而,基于UTF-16的16位表示的有限状态机的一次简单实现都需要每个状态64,000个条目以上。因此,对于任何复杂的状态空间,这很快被禁止。
工业标准处理器已演化为8位,16位和32位的体系结构。另外,字符编码方案已从扩展的ASCII的8位表示演化为16和32位的UTF16和UTF32表示。经过了处理器体系结构和字符编码方案的这种演化,处理器的性能和一次一字符处理的要求之间有了大致匹配。
尽管现在字符编码的演化通过Unicode标准可能已经达到了长期的稳定点,但处理器的体系结构却在继续演化当中。特别是最近几年已看到处理器的性能与一次一字符处理的需求之间日益增大的失配。更具体的说,现在工业标准处理器体系结构通常包括了基于128位寄存器的单指令多数据处理的能力,同时越来越多地使用具有64位通用寄存器的处理器。这些寄存器具有一次处理多个字符或代码单元的潜在能力,例如,利用128位寄存器一次可处理高达16个UTF-8代码单元。另外,处理器为不断增加的吞吐量发展了复杂的指令和数据高速缓存设施。在指令高速缓存方面,特别地,流水线操作提供的吞吐量优势被载满了用于条件字符逻辑的分支指令的顺序字符处理软件大体抵消了。数据高速缓存的行为也可能是个问题,特别是对于可能使用大量转换和转换表的有限状态机和其它基于表的实现。
综上所述,需要提供能够解决一个或多个以上所提出问题的方法和设备。
发明内容
本发明的一个或多个实施例满足了一个或多个以上所确定的需求。特别地,本发明的一个实施例是一种用于处理字符流的方法,包括:(a)响应于字符流形成多个并行属性位流,其中并行属性位流中的每一个包括与该字符流的数据值相关的特定属性的位值;(b)处理这一个或多个并行属性位流。
附图说明
图2示出了根据本发明的一个实施例的循环片断,其示出了针对Power PC上的Altivec编程用C语言界面跨区和缓存器边界地移位;
图3示出了根据本发明的一个实施例使用理想指令集体系结构实现的串行字节到并行位流的置换;
图4示出了根据本发明的一个实施例的从串行到并行的置换过程的一段Altivec代码片断;
图5示出了根据本发明的一个实施例的用于位检测的一段Altivec代码片断;
图6示出了根据本发明的一个实施例的适合32位奔腾体系结构及兼容的处理器的用于形成位位置数组的一段内联汇编实现(GCC规约);
图7示出了基于本发明的一个实施例的用理想指令集体系结构实现的并行位流到串行字节的置换;
图8示出了UTF-8代码单元序列和码点值之间的对应;
图9示出了UTF-8到UTF-16位空间转码器的输入-输出结构的框图,该转码器是按照本发明的一个实施例构造的;
图10是图9中所示的UTF-8到UTF-16位空间转码器的根据本发明的一个实施例所构建的内部结构的框图;
图11示出了UTF-8代码单元序列和UTF-16高低字节数据之间的对应;
图12示出了按照发明的一个实施例的使用Power PC处理器的理想指令simd_add_16的实现;
图13示出了按照发明的一个实施例的使用Power PC处理器的理想指令sim_srl_4的执行;
图14示出了按照发明的一个实施例的使用Power PC处理器的理想指令simd_sub_2的执行;
图15示出了按照本说明书的一个或多个实施例构造的模块的框图。
具体实施例
定义:以下定义应用于本文。
数据流:一特定数据类型的数据值序列。数据流可以是有限长度或无尽长的。
数据串:可以作为单个实体处理的有限长的数据流。
位流:由位值即或者为0或者为1的值组成的数据流。
位串:可以作为单个实体处理的有限长的位流。
字节:由8个位组成的数据单元。
字符流:由根据特定字符编码方案的编码规约的字符值组成的数据流。
字符编码方案:用于将字符编码为各自包括一个或多个定宽的代码单元的数据值的方案。
字符串:可以作为单个实体处理的有限长的字符流。
代码点:一字符编码方案中与一特定字符相关联的数字值。
代码单元:一字符编码方案中单独的数据单元。
双字节:由16个位组成的数据单元。
词法项目流:并行于基础字符流的位流,其中基字符流被构造用于根据文本符号系统的规则标识词法上重要的字符或字符组合的位置。
半字节:由4个位组成的数据单元。
属性流:由与另外一个数据流的数据值相关联的特定属性的数据值组成的数据流,其中这另外一个数据流被称为该属性流的基流。
并行数据流:其数据值一一对应的两个或多个数据流。例如,并行属性流是并行数据流,其中该并行数据流是诸如字符流等基流的属性流。
文本:人为可读形式并且被表示为根据特定字符编码方案的字符串或字符流数据的信息。
文本符号系统:用于按照文法或其它规则集合将信息结构化和描述为文本的系统。编程语言、标记语言和基于字符的数据格式都是文本符号系统的示例。
1.并行数据流和属性流
本发明的一个或多个实施例涉及操控并行数据流,其中包括但不仅限于应用同步指令多数据(“SIMD”)技术来操控并行数据流。特别是按照一个或多个这样的实施例,并行数据流可以是在例如但并非限制的UTF-8表示、UTF-16表示、或UTF-32表示中字符流(基流)的属性流。通过从以UTF-8编码的Unicode文本产生的并行属性流示出对该点的理解。
1.1从以UTF-8编码的Unicode文本生成的并行属件流
考虑顺序包括以下八个字符的Unicode文本“$,¥,”:美元符、逗号、空格、人民币符、逗号、空格、欧元符、问号。图1示出了表示该文本的UTF-8数据流,以及从其派生出的许多并行属性流。使用十六进制符号,用u8data(i)标记的行示出了UTF-8数据流作为8位代码单元(字节)序列的组成。注意到人民币符和欧元符分别需要两个和三个代码单元,所以在这种情况下UTF-8数据流的总长度是十一个代码单元。一般而言,如果给出一总共N个代码单元的UTF-8数据流,u8data(i)标示从位置0到N-1中位置i上的代码单元。
UTF-8数据流可以可供选择地被表示成多个并行属性流,例如,8个并行位流,u8bit0,u8bit1,u8bit2,u8bit3,u8bit4,u8bit5,u8bit6和u8bit7,其中每个位流对应u8data的连续代码单元内的单个位位置。因此,u8bit3(i)表示u8data(i)的位3。在图1的例子中,被标记为从u8bit0(i)到u8bit7(i)的行示出了对应于u8data(i)的位流。图1中其它几行示出了其它的并行属性流,后面将依次描述。
通常,感兴趣的UTF-8数据流将长得多。流经常会以块来进行处理。例如,按照本发明的一个实施例,一大小为128字节的块可以用来一次处理128个代码单元。在这种情况下,每个相应的并行位流将以128位(16字节)的块来进行处理。
u8data数据流和从u8bit0到u8bit7的并行位流是都被称为是u8索引的属性数据流。如果一属性数据流由数据值序列组成并且该数据值与原始UTF-8数据流的代码单元一一对应,则该属性数据流是u8索引的。
按照本发明的一个或多个实施例,其它u8索引的属性数据流可以被定义为现有u8索引的属性数据流的逻辑组合。例如,令u8prefix为一u8索引的位流,用来标识其值在十六进制C0到十六进制FF的范围——即为UTF-8前缀字节预留的值的范围——之间的UTF-8代码单元。这个属性数据流是按照以下等式定义(或者构造或创建)的位流。
u8prefix(i)=u8bit0(i)∧u8bit1(i) (1.1)
在图1中,标记为u8prefix(i)的行示出了该示例文本的流。
类似地,令u8prefix2为标识更窄的十六进制C0到十六进制FF范围的u8索引的位流,即u8prefix2是标识指示两字节UTF-8序列的初始字节的前缀字节的位流。该属性数据流是按照以下等式定义(或者构造或创建)的位流。
同样,图1示出了对该示例文本的计算。
这些最初的例子也可以用来示出根据本发明的一个或多个实施例通过使用一般性的并行数据流和特别是并行位流可以获得的效率优势。根据一个或多个这样的实施例,利用了允许对多个数据元素进行并行逻辑运算的寄存器。这样的实施例可以被称为同步指令多数据(“SIMD”)实施例。例如,奔腾兼容处理器体系结构的XMM寄存器和Power PC处理器体系结构的Altivec寄存器都提供了对128位的并行逻辑运算。因此,举例来说而非限制,按照本发明的一个或多个实施例,单个寄存器可以加载来自u8bit0位流的128个连续位,与此同时,第二寄存器可以加载来自u8bit1位流的相应的128个连续位。应用于这两个寄存器的逻辑“与”运算在单次操作中确定表示前缀字节的大小为128的块内的所有代码单元(参看等式1.1)。另外,在另一步骤中,该值就可以通过使用“与补”运算与从u8bit2位流加载的适当的128个位相组合(参见式1.2)。相比之下,按照现有技术,用来确定前缀字节并且将其分类的一次一字节循环需要几百个操作来处理128个代码单元。
尽管现代处理器体系结构的SIMD设施可提供并行数据流操作的最大优势,本发明的其它可供选择的实施例也可以利用标准处理器指令实现有效的并行性。例如,按照一个或多个这种可供选择的实施例,通过使用32位处理器的标准逻辑指令也可以达到一次32个代码单元的并行性。
按照本发明的一个或多个实施例,我们可以超越对齐数据流值严格的逻辑组合,来根据相邻代码单元的属性定义衍生的数据流。例如,令u8scope22(i)(属性数据流)表示一属性:代码单元i预期为两字节UTF-8序列的第二个字节。只要前一字节是十六进制C0到DF范围内的前缀字节,该属性就为真。运行的例子参见图1。以下的等式对可以用来定义这一属性。
u8scope22(i)=u8prefix2(i-1),i≥1 (1.3)
u8scope22(0)=0 (1.4)
计算这样的属性涉及数据移位操作。正确的实现需要注意诸如块和缓存器边界等问题,其细节将在后续章节中描述。
另一规约简化了在多种情况下的数据移位属性的定义。这个规约为:对于任何负索引i,u8data(i)被定义为空字节(0)。通过扩展,这个规约也适用于位流u8bit0到u8bit7:u8bitn(i)=0,所有的i<0。在u8scope22的例子中,该规约允许通过放弃特殊情况处理进行简化,以避免i=0情况下的u8prefix2(-1)。也就是,该定义简化为单个无条件等式。
u8scope22(i)=u8prefix2(i-1) (1.5)
1.2通用属性流
如上面例子所述,按照本发明的一个或多个实施例的很多感兴趣的衍生属性是每个代码单元可以用单个位来表示的逻辑或布尔属性。由于其在处理固定寄存器内的代码单元时提供了最大的并行性,所以这是极为有利的。然而在某些情况下,按照本发明的一个或多个实施例,存在非布尔属性,尽管它们是u8索引的。例如,在图1中标记为u8hi4(i)和u8lo4(i)的行以十六进制符号示出了分别表示每个代码单元的高4位和低4位的派生自u8data(i)的两个并行属性流。类似地,标记为cpbyte(i)的行显示了由8位代码点值组成的另一u8索引的属性;这一属性将会在后面的章节进行描述。
以上u8索引的属性数据流的示例示出了按照本发明的一个或多个实施例以与UTF-8字节流的代码单元一一对应的形式跟踪数据的属性流的一般性概念。
另外,本发明的一个或多个实施例用于处理用UTF-16和UTF-32表示的数据流。如果一个属性数据流以与包括Unicode文本的UTF-16表示的代码单元一一对应的形式索引,那么就称这个属性数据流是u16索引的。类似地,如果一个属性数据流以与包括Unicode文本的UTF-32表示的代码单元一一对应的形式索引,那么就称这个属性数据流是u32索引的。然而,UTF-32代码单元还与Unicode代码点一一对应,所以u32索引又可以称为代码点索引或字符索引。
2.理想SIMD体系结构
这一节介绍一个理想化的SIMD指令集体系结构,这有利于简化按照本发明的一个或多个实施例构造的并行数据流操作的描述与实现。这个体系结构对现有SIMD处理器的基础性能建模,其中这些基础性能包括整数算术、诸位逻辑运算和位移、以及字段打包和合并的SIMD操作。这个体系结构也通过对归纳倍化提供支持来扩展这些性能。按照本发明的一个或多个实现,归纳倍化(inductive doubling)对并行位流处理中的算法的某些实现是很有用的。如这里所用的,归纳倍化是指涉及数据元素宽度或其它数据属性的反复加倍的算法过程。归纳倍化扩展极大地简化了并行数据流的许多算法的初始描述,使得在现有SIMD体系结构上处理实现细节的技术可以作为次要的问题被解决。
理想化的体系结构是基于对总大小为N=2K位的寄存器的SIMD操作,其中K为某一整数。例如,对于K=6,寄存器大小是64位,就如奔腾MMX和Sun的VIS设备,而对于K=7,寄存器大小是128位,就如奔腾SSE(术语“SSE”将在此一般性地用来表示包括但不仅限于奔腾SSE,SSE2,SSE3和AMD 3D技术族)和Power PC Altivec设备。各个位从左到右被编号为0至N-1(big-endian(大尾序)规约)。如这里所描述的,理想体系结构通常提供三地址形式的指令,其中N位的目标寄存器接收将SIMD二进制操作应用于两个N位的源寄存器的值。使用两地址指令的可供选择的方案是十分直接的;用一个寄存器同时作为源和目标。
按照本发明的一个或多个实施例,归纳倍化规定将SIMD寄存器分成N/n个宽度为n=2k位(0≤k≤K)的字段。例如,对于K=6,64位的SIMD寄存器可以被看作是64个1位字段、32个2位字段、16个4位字段、8个8位字段、4个16位字段、2个32位字段或1个64位字段。当一寄存器r被分成n位的字段时。这些字段按rn[0]到rn[N/n-1]索引。字段rn[i]由寄存器r的i×n到(i+1)×n-1的位组成。
对于这个分割方案下的每个字段宽度,该理想体系结构提供了作为SIMD操作的无符号整数加法、减法和乘法。字段宽度被指定为适用于结果寄存器和源寄存器两者的操作修改器。模运算如下式所指定地将结果限于字段宽度。
r=simd_add/n(a,b)意味着rn[i]=(an[i]+bn[i])mod2n (2.1)
r=simd_sub/n(a,b)意味着rn[i]=(an[i]-rn[i]+2n)mod2n (2.2)
r=simd_mult/n(a,b)意味着rn[i]=(an[i]×bn[i])mod2n (2.3)
尽管现有的SIMD体系结构趋向于提供更多精细的运算模型,诸如包括带符号运算、饱和运算、和加倍大小的结果字段等选择;上述的简单形式对于将要描述的并行数据流操作已经足够了。
理想体系结构同时还通过可以被应用于SIMD寄存器操作数的半操作数修改器来支持归纳倍化。这些修改器指定在操作中仅使用每个n位字段的高(/h)或低(/l)n/2位。也就是,r/hn[i]=rn[i]>>n/2,其中>>是右移操作符并且r/ln[i]=rn[i]mod 2n/2。例如,如果寄存器s的8位字段包含经打包的成对的4位的值,则这些值可以通过操作simd_add/8(s/h,s/l)产生一具有8位的和的寄存器t。
同时提供全部字段宽度上的整数操作和半操作数修改器便利地简化了并行数据流的算法。现有的SIMD体系结构通常只对一些而不是所有字段宽度提供算术操作,而对于半操作数选择只是在特殊情况下提供算术操作。使算法适应这些体系结构通常在实现中需要额外的移位和/或屏蔽操作。
在理想指令集体系结构下逐位的逻辑操作是直接的并且精密地模拟了现有的SIMD体系结构的能力。这些操作可能被认为隐式地与1位字段宽度相关联,尽管未使用字段宽度区分符。以下等式适用。
r=simd_and(a,b)意味着r1[i]=a1[i]∧b1[i] (2.4)
r=simd_andc(a,b)意味着r1[i]=a1[i]∧b1[i] (2.5)
r=simd_or(a,b)意味着r1[i]=a1[i]∨b1[i] (2.6)
同时也要注意字段宽度为1的整数运算也可被指定,但降为相应的逐位逻辑运算。即,simd_add/l和simd_sub/l降为simd_xor而simd_mult/l将为simd_and。
在理想指令集体系结构下的SIMD移位操作包括在每个字段宽度为n=2k上的左移位逻辑(simd_shl)、右移位逻辑(simd_shrl)、右移位算术(simd_shra),和旋转左移(simd_rotl)。第一个操作数寄存器中每个n位的数据字段独立地移位了由第二个操作数寄存器中相应的n位的移位指定的数量。然而只有移位字段的k个低位用来指定移位量。例如,r=simd_shll/n(a,b)通过rn[i]=an[i]《(bn[i]mod 2k)来计算每个字段。这些操作与Power PC上8、16和32位字段的相应的Altivec操作等价,但是在理想化体系结构下也可用于2、4、64、和128位字段。
SIMD体系结构中常见的打包和合并操作在该理想体系结构下被推广至所有字段宽度。这些可以被视为分别将数据值的宽度减半或加倍的操作,因此也是支持归纳倍化的核心特征。
simd_pack/n操作将两个N位输入寄存器的n位字段打包成单个N位结果寄存器中n/2位字段。结果的前N/2位是通过将第一个输入操作数的每个n位字段转化为n/2位形成的,而结果的后N/2位是通过相应地转化第二个输入操作数的n位字段形成的。通过有符号或无符号饱和或通过截断的转换是可行的而且满足这个发明的目的。以下等式为r=simd_pack/n(a,b)定义了字段值。
rn/2[i]=convert(an[i],n/2),i<N/n (2.9)
rn/2[i]=convea(bn[i-N/n],n/2),i≥N/n (2.10)
simd_mergeh/n和simd_mergel/n操作从两个输入操作数选择交替的n位字段形成2n位字段的结果。simd_mergeh/n操作从每个输入操作数的高N/2位提取n位字段,而simd_mergel/n操作从每个操作数的低N/2位提取交替的n位字段。r=mergeh/n(a,b)操作由以下等式定义。
r2n[i]=an[i]×2n+bn[i] (2.11)
类似地,r=mergel/n(a,b)操作由以下等式定义。
r2n[i]=an[i+N/2n]×2n+bn[i+N/2n] (2.12)
3.并行数据流处理的一个或多个实施例
第三节描述了按照本发明的一个或多个实施例构建的数据流处理方法。特别地,3.1节描述了数据流是如何利用固定大小的块和缓存器来进行处理的。3.2节描述了将字节流(例如,UTF-8代码单元流)转化为相应的八个并行位流的集合的置换操作。3.3至3.6节描述了从位流中提取信息的效用操作,分别包括位计数、差错位检测、位位置确定和运行位置确定。3.7节描述了使用位流作为删除屏蔽来提供对特别包括位流的并行数据流的编辑。最后,3.8节回到置换这一主题,描述了并行位流到串行字节置换的逆操作。
3.1数据流处理中的块、缓存器和边界
如第二节中示出的,并行数据流由任意长的序列组成。同样的,本发明的一个或多个实施例包括在对一次可以存储和操作的序列元素的数量特定限制下使用物理资源处理这样的序列。
使用奔腾或兼容处理器的XMM寄存器或Power PC处理器的Altivec寄存器的某些本发明的实施例一次操控以大小为128的块计的代码单元并且将这些块分组到2048个代码单元的缓存器中(每个缓存器16个块)。对于这样的实施例,位流将使用每块128位(16字节)以及每个缓存器2048位(256个字节),而字节流每块需要128字节,每个缓存器需要2048字节。
在用这种方法组织数据流的处理时,我们必须确保在处理文件、缓存器和块边界时数据流处理的正确性。一个普遍的问题就是数据流的值经常由其它数据流中不同但是接近的位置的值指定。例如,考虑由u8prefix2(i-1)指定u8scope22(i)。实质上,u8scope22是u8prefix2移位后的版本。然而,由于末端效应,单个移位指令不足以正确地执行数据流中所有位置的移位。通常来说,存在四种需要考虑的边界条件。
(1)i mod 128=0;块边界横跨条件。
(2)i mod 2048=0;缓存器边界横跨条件。
(3)i=0;文件开端条件。
(4)i=N;文件末端条件。
块边界横跨和缓存器边界横跨条件可以通过保留并组合连续循环迭代之间的信息来处理。继续u8scope22的例子,分别令oldprefix2和thisprefix2为前一个块(也就是上一个通过循环的块)和当前块的u8prefix2位流的值。然后,u8scope22的值就可以通过将oldprefix2的值左移127位,thisprefix2的值右移1位,再形成结果之间的逻辑或(逻辑‘or’)来计算。在处理缓存器中每个块的一个迭代中,每次迭代末端的thisprefix2的值可以用来建立下一迭代的oldprefix2的值。为了开始处理缓存器,oldprefix2的值必须被初始化为在处理前一缓存器的最后一个块期间所确定的值。假设这个已经准备好了,图2示出了使用Power PC处理器上的Altivec编程的C语言接口来实现该计算的循环片断。
有很多方法可以确保处理一个缓存器的最后一个块所计算出的值可以用来初始化下一缓存器的第一个块的处理。按照本发明的一个或多个实施例,一个缓存器环被维护作为同时支持后向(lookbehind)和前向(lookahead)操作的通用结构。三个缓存器的环允许任何时候对前一个、当前和下一个缓存器进行定义。在该示例中,要为处理当前缓存器而初始化oldprefix2的值,一个直接的方法就是检索并重新计算前一个缓存器最后一个块的u8prefix2值。缓存器环的概念在现有技术中是众所周知的。
如1.1节描述的那样,数据流概念的一个便利的扩展就是对任何负数位置i,认为u8data(i)和从u8bit0(i)到u8bit7(i)的值为空(0),这样就可以很容易地处理文件开端条件。这个扩展可以通过在打开文件时指定一个空缓存器(缓存器所有值为0)作为“前一个”缓存器的初始值来容易地实现。这样,实现u8scope22(i)=u8prefix2(i-1)的移位操作就可以通过从u8prefix2(-1)移进一个0而正确地处理文件开端的情况。
最后一个需要考虑的边界条件是文件末端的情形。如前面所定义的,文件包括从位置0到N-1的字符。然而,定义u8scope22的等式根据u8prefix2(N-1)指定了文件末端后一位(即,在位置N上)的值。因此,在文件的最后一个代码单元是两字节序列的前缀的情况下,u8scope22(N)=1是可能的。取决于这个应用,按照本发明构建的一个系统的实施例可能需要允许位流以这种方式扩展至文件末端之外。例如,在UTF-8验证的任务中,u8scope22(N)的值=1指出了文件末端的错误形成的UTF-8代码序列:一2字节序列被初始化,但是文件末端在预期的后缀字节之前出现。
在某些应用中,简化块或/和缓存器边界的处理来避免维护迭代之间的信息是可能的。如果这个应用涉及信息无需跨其流动的自然而频繁的断点,那么,它可能值得使用一动态块缩短策略以将每个块的长度减小到达这样的断点的最小值。例如,在UTF-8验证、解码和/或转码中,每个完整的代码单元序列的开端和末端表示了一个自然的断点。块缩短涉及一权衡:避免维护跨块的信息流动的成本的代价就是每个块所处理的元素数量略微减少以及可能的处理数据对齐问题的成本。
3.1.1通用移位
3.1节示出了在形成位流过程中单个位移位的情况。单个位移位是最普遍的操作,它反映了与相邻字符位置有关的约束或属性。然而,同样的技术也适用于多位移位。例如,考虑标示3字节序列的第三个字节位置的位流u8scope33(属性数据流)。E0到EF之间的UTF-8前缀字节是为3字节序列预留的;只要u8prefix3的前两位的值为1,u8scope33流的值就为1。
u8scope33(i)=u8prefix3(i-2) (3.2)
因此计算u8scope33需要双位移位。使用与单个位移位相同的策略,u8scope33的值可以通过将oldprefix3的值左移126位、将thisprefix3的值右移2位、并形成结果之间的逻辑或(逻辑‘or’)来计算。按照上面描述的规约即对于任何负数位置输入数据为空,u8scope33(0)和u8scope33(1)的情形是通过从u8prefix3(-2)和u8prefix3(-1)分别移进0值来处理的。这是通过在文件开端将“前一个”缓存器初始化为全零来自动处理的。
这些技术阐明的一般性模式也适用于更长的移位乃至块大小的位移(在所示实施例中为128位的移位)。应用普遍受限于低于这个限制的小范围的移位。然而如果必要的话,超过块大小的移位也可通过这个方案的变形来提供,即维持对多于一个在前块(不仅仅是最后一块)的访问。
3.1.2流末端填充
一个UTF-8数据流可能也可能不会在自然的缓存器或块边界上结束。然而为了简化流中最后一个块的处理,本发明的一个或多个实施例超过文件的逻辑末端用空字节填充最后一个块直至一满块(128字节)边界。实质上,这需要维持一满块不变量,即数据流可以总是被处理成它们由整数个块组成。
一个满块不变量简化了为处理一个或多个数据块而设计的方法的实现。这些方法包括了下面章节描述的按照本发明的一个或多个实施例构建的核心方法。实质上,这种简化消除了块内和流末端测试的需要,否则处理每个块以及处理部分块的任何特殊代码时都需要测试。有利地,为满块不变量而写的方法的实施例更容易读写,因此,减少了潜在的编码错误。此外,这些简化避免了可能由块内边界检测引起的任何性能惩处。
3.1.3块处理电路
本发明的一个或多个实施例将一个或多个字符流处理功能实现为对并行位流数据的块进行操作的逻辑电路。给定一大小为N的块,涉及逻辑与后向移位操作的位流等式可以如下使用逻辑电路来实现。对于等式所用的基流,一次提供一个N位寄存器来保持来自该流的一个数据块。对于在该等式集合内按后向移位的形式存取的每一个不同位流,提供一个s位的寄存器来保持来自前一个块该项的值,其中s是任何等式内涉及该项的移位的最大值。对于涉及该等式集合内不同操作数集的每个逻辑操作(∧、∨、、),提供了一个N个逻辑门(与,或,非,异或)的阵列用来计算与给定逻辑操作相对应的派生位流的一个块片断的值。门阵列的输入连线自保存基流的寄存器的输出、保存为前一个块所存储的值的s位寄存器的输出、或表示中间计算结果的其它门阵列的输出。用于处理下一个输入数据块所需的移位形式的输入被连线至相应的s位寄存器的输入,用于与下一块的信一同加载到该寄存器中。
在某些应用中,简化块或边界的处理以避免在s位寄存器中维护来自先前块的位流值是可能的。如果该应用涉及信息无需跨其流动的自然而频繁的断点,那么,它或许值得使用一个动态块缩短策略以将块长度减少到达这种断点的最小值。例如,在UTF-8验证、解码和/或转码中,每个完整的代码单元序列的开端和结尾代表了一个自然的断点。
3.2串行字节到并行位流的置换
按照本发明的一个或多个实施例,从输入字节流到相应的八个并行位流的表示的置换是按照并行字节到并行位流置换的方法执行的,例如而非限制,该方法可在变换单元中实施。特别地,按照本发明的一个或多个实施例,利用三个二进制的分割变换完成整个置换,其中每个变换将输入流分割成两个半长的输出流。三个阶段这样的二进制的分割变换生成八个位流,其中每个为原输入流长度的八分之一。
利用理想指令集体系结构,这三次变换的每一次都可以用simd pack操作来实现。按照本发明的一个或多个实施例,一个方法要求使用:(a)在第一阶段变换中将输入的字节流分成2个半字节流的simd_pack/8操作;(b)在第二阶段变换中将输入的半字节流分成4个位偶的流的simd_pack/4操作;(c)在第三阶段变换中从位偶流生成8个位流的simd_pack/2操作。图3详细描述了这一过程,示出了八个连续寄存器的串行字节数据(u8data0,u8data1到u8data7)到八个并行寄存器的位流数据(u8bit0,u8bit1到u8bit7)的置换。注意结合每个simd pack/n操作使用选择高n/2位或低n/2位的半操作数修改器。
另一个可供选择的实施例可在每个阶段使用不同的策略对位进行分割,同时仍然保留使用二进制分割变换的三阶段过程的结构。例如,simd_pack/2操作在三个阶段中均可使用:(a)在第一阶段变换中将偶数位(输入字节的位0、2、4和6)与奇数位(位1、3、5、7)分离;(b)在第二阶段变换中进一步将位0和4与位2和6分离以及将位1和5与位3和7分离;(c)然后在第三阶段变换中将其分割成单独的位流。
当该置换过程的三阶段结构延伸到使用其它SIMD体系结构的实施例时,取决于该指令集性能在每个变换阶段可能需要一些替换性的二进制分割策略和额外的实现细节。例如,利用一些现有的体系结构可得到的最精细粒度的打包操作与simd_pack/16等价,即将双字节打包成单字节。利用这一级别的打包操作,二进制分割变换一般需要额外的屏蔽和移位操作。所需的额外操作的数量取决于二进制分割策略的选择。
使用双字节到单字节打包,将连续字节中的元素配对的策略可以将屏蔽和移位操作的开销限制到每个阶段每个寄存器一次屏蔽和移位操作。在第一阶段变换中,来自两个连续字节的相应位被配对,从而将偶数位与奇数位分开。即,给定输入的连续字节a和b,这些位被分割成具有a0b0a2b2a4b4a6b6和a1b1a3b3a5b5a7b7字节样式的不同输出流。在第二阶段变换中,来自连续字节的相应对被合在一起形成4位的顺串。例如,给定a0b0a2b2a4b4a6b6和c0d0c2d2c4d4c6d6样式的连续偶字节,形成a0b0c0d0a4b4c4d4和a2b2c2d2a6b6c6d6样式的输出字节。然后,第三阶段变换将4位的顺串合在一起得到连续位流。图4例如用按照本发明的一个实施例实现第一阶段变换的Altivec代码片断示出了这一过程的实现。
串行到并行字节变换的其它替换实施例可使用其它技术,这取决于指令集体系结构。例如,SSE系列处理器上的pmovmskb操作允许直接一次提取对应于16个输入字节的位流片断。
按照本发明的一个或多个实施例,串行字节到并行位流的置换作为例程被执行,它将数据流作为一个或多个UTF-8字节数据块的连续数组并且将位流数据写入八个预先分配的输出数组。例如,一个2048字节的满缓存器可以用16个循环执行迭代地进行处理,每个循环一次处理输入数组的128个字节。每个循环迭代生成每位流128位(16字节)。使用例如72个逻辑、移位和打包指令的Altivec处理器指令集足够用没有分支的直线代码来变换一个128字节的块。以这种方法组织,置换代码可以有效地利用处理器流水线操作能力。
考虑128位(16字节)的块,当输入字节流满足满块不变量时,生成的位流也会满足这个不变量。
3.3位检测方法和/或单元
按照本发明的一个或多个实施例,例如而非限制地可在位检测单元中执行的位检测方法确定一个满的或部分的位缓存器是否包含为1的位。按照本发明的一个或多个实施例,该单元被最优化以使得位的不存在可以在最短时间内得到证实。连续的128位的块通过逻辑或操作组合起来直到所有的块都被处理了。计算出该结果上的和并将其与0作相等测试。非零值意味着缓存器里存在为1的位。图5显示了按照本发明的实施例的Altivec处理器实现。
按照本发明的一个或多个实施例,位检测的应用包括,例如而非限制,检错应用和最优化应用。在检错应用中,可计算出位向量来发信号通知发生特定类型差错的代码单元位置。位检测可以被用来快速地证实不存在差错或者调用差错处理代码。在最优化应用中,位检测可以用来避免极少发生状况的特殊情形处理。例如,4字节序列很少出现在UTF-8中。当处理充满UTF-8数据的缓存器时,如果在缓存器中没有4字节序列出现,那么用来处理这种序列的特殊情形的代码可以被跳过。
3.4位计数方法和/或单元
按照本发明的一个或多个实施例,例如而非限制可在位检测单元中执行的位计数方法计算位流中值为1的位的个数。位计数有很多应用。其中一个例子就是确定文件的行数。通过形成标识行尾代码单元的位流,这就变成了一个位计数的问题。另一个例子是决定由UTF-8代码单元序列表示的字符的数量。通过形成标识所有非后缀字节的位流,这也变成了一个位计数的问题。
计算N=2K位寄存器中的位可以利用归纳倍化策略通过理想指令集体系结构中的K个simd_add操作来实施。要计算寄存器x中的位,先用r=simd_add/2(x/l,x/h)操作来生成N/2个字段,其中每个字段保存一个2位和。然后使用操作r=simd_add/4(r/l,r/h)生成N/4个4位和。该过程继续以r=simd_add/8(r/l,r/h)以生成8位和,依此类推直到剩下单个N位和。
按照本发明的一个或多个实施例构建的方法对位缓存器执行位计数,该缓存器满足满块不变量,即由一个或多个128位的满块的数组组成。实际上,位计数普遍应用于一次16块的满缓存器,从而提供指令流水线的有效利用。
本发明的一个或多个实施例按照在现有技术中众所周知的技术,使用加法器或半加法器将位计数模块实现为专用逻辑电路。
3.5位位置数组
给定一位流,生成在其处找到值为1的位的位置的数组经常是十分有用的,特别是在相对稀疏的位流的情况下。这种位置数组允许在匹配由该位流定义的条件的所有字符位置上的迭代。不匹配这个条件的位置被简单地跳过;这与一次一字节相比可以相当程度上的改进性能。按这种方法形成的条件迭代也具有了流水线体系结构的优势,即实现条件测试的分支逻辑被从循环主体中消除了。这避免了与循环内分支错误预测相关联的性能损耗。
位位置数组可以利用位扫描指令来构造,如奔腾处理器体系结构的bsf和Power PC处理器体系结构的cntlz。图6示出了按照本发明的一个或多个实施例的适于32位奔腾体系结构的处理器和兼容处理器的内联汇编实现(GCC规约)。
给定一个满足满块不变量即由一个或多个128位的满块的数组组成的输入缓存器,按照本发明的一个或多个实施例构造的方法确定位的位置。实际上,一次16块的满缓存器通常作为输入来提供。用来接收位位置的输出数组必须预先分配预期的最大大小;满缓存器的2048个位置。返回的整数结果指示在输入缓存器中值为1的位的个数。
3.6行程位置数组
使用位位置数组来控制条件迭代的一种替换方案是使用游程位置数组,即标记连续的值为1的游程的开端和末端的位置。这可能会极大程度地减少所需迭代的数量。游程数组还通过标识均可以用同样方法处理的数据元素的连续游程创造并行性的机会。相较于位位置数组,由游程位置数组控制的迭代避免了与循环内分支错误预测相关联的性能损耗。
以上针对位位置确定而描述的方法可以很容易被本领域的普通技术人员常规地且无需过多实验地扩展为对游程确定。需要的最主要的改变是一旦确定了游程的开始位置就翻转正被扫描的位流。这将允许游程的末端在下一步骤被标识,即标识为翻转后的输入中位值为1的第一个位置。一旦找到了行程的末端,剩下的位流会被翻转为其原始值以允许确定下一个行程的开端。
给定一满足满块不变量即由一个或多个128位的满块的数组组成的输入缓存器,按照本发明的一个或多个实施例构建的一个方法确定游程位置。实际上,一次16块的满缓存器通常作为输入被提供。用来接收位位置的输出数组必须预先分配预期的最大大小;满缓存器的至多2048个位置(1024个开始位置和1024个结束位置)。返回的整数结果指示在输入缓存器中找到的游程的数量。
3.7并行删除方法和/或单元
按照本发明的一个或多个实施例,例如而非限制可在并行删除单元中执行的一种并行删除方法根据删除屏蔽执行对一个或多个并行数据流中一个或多个代码单元的删除。删除屏蔽被定义为由标识将要被删除的代码单元的位置上的1和标识将要被保留的代码单元的位置上的0组成的位流。数据流可以为并行位流,如UTF-8代码单元的8个并行位流的集合,或者是字节流,如UTF-16代码单元的2个并行字节流的集合,或者其它形式的字符索引的数据流。
例如,考虑一个8位的删除屏蔽10100010和两个相应的8个元素的并行数据流abcdefgh和ABCDEFGH。按照屏蔽对来自两个数据流的元素的并行删除产生两个5元素流,也就是bdefh和BDEFH。
固定大小的字段或寄存器内的删除可能会产生或者左对齐或者右对齐的结果。例如,一个5元素流bdefh在8元素的寄存器中可能被表示为bdefhxxx或者xxxbdefh,其中标记为‘x’的位置可以为任意值。将相邻的右对齐与左对齐的结果连接起来产生被称作中央删除结果的一个重要的中间形式。例如,xxbd和efhx分别是来自4位删除屏蔽1010和0010被应用于两个连续的4元素流的片断abcd和efgh后向右和向左对齐的结果。xxbd和efhx的连接产生中央结果xxbdefhx,它通过适当的移位或旋转操作很容易就可以转换成或者左对齐或者右对齐的8元素结果。
按照本发明的一个或多个实施例,位删除通过中央结果归纳的方法来实现。这个过程通过将各对相邻位考虑作为2位的中央删除结果来开始。随后,归纳步骤将相邻对的2位的中央结果组合成为4位的中央结果,将各对4位的中央结果组合成为8位的中央结果。一般而言,给定两个相邻的n位的中央删除结果,归纳步骤将通过向右调整左边的n位结果、向左调整右边的n位结果并将它们连接起来产生一个2n位的中央删除结果。
利用理想指令集体系结构,中央结果归纳可使用simd_rotl指令在每一归纳层中执行。举例来说,若使用128位寄存器,这个过程开始应考虑将位流数据分割成64个相邻的2位中央删除结果。simd_rotl/2指令应用必要的旋转来产生32个4为的中央结果。simd_rotl/4指令随后组合这些相邻的4位结果以产生16个8位中央结果。这一过程继续使用simd_rotl/8,simd_rotl/16,simd_rotl/32和simd_rotl/64指令用六步来产生一个128位的中央删除结果。
3.1节的技术被用来组合来自连续的128位的块的结果,使得删除可以在更长的流上执行,例如按照本发明的一个或多个实施例用到的2048位的缓存器。
必须建立每个simd_rotl指令用到的旋转系数以使得对于将要合成为2n位结果的每对n位结果,左边的n位结果被向右对齐而右边的结果被向左对齐。右边的结果的向左对齐需要该结果位移在其左边被删除元素的数量,也就是该n位结果左边n/2位的删除计数。例如,考虑对4位片断abcd应用删除屏蔽1011而生成的相应4位中央删除结果xbxx。向左对齐产生bxxx需要左移一位,也就是屏蔽前两位的删除计数。这个左移系数被直接用于左旋转操作simd_rotl,因为观察到旋转到右端的任何位位于所需结果的随意部分。
左边的结果的向右对齐类似地需要右移左边n位结果的右n/2位的删除计数。要用左旋转操作simd_rotl来执行右移,需计算n减去删除计数作为左旋转系数。例如,考虑对4位片断abcd应用删除屏蔽1101而生成的相应4位中央删除结果xxcx。向右对齐需要右移一位。这可以通过左旋转4-1=3来执行,从而按照要求产生xxxc。
每个simd_rotl操作需要的旋转系数在以下归纳过程中被计算出。因为在删除屏蔽中值为1的位表示这个位置会被删除,所以删除屏蔽中的每个0或1可以被看成是相应的1位字段的删除计数。给定寄存器d1中的删除屏蔽,2位字段的64个删除计数可以使用d2=simd_add/2(d1/h,dl/l)来计算。也就是,每个2位字段接收高1位的计数和低1位的计数的和。4位字段的32个删除计数类似地可以使用d4=simd_add/4(d2/h,d2/l)来产生,依此类推。高n/2位的字段的删除计数直接被用作右边n位的字段的旋转系数。左边n位的字段的旋转系数使用simd_sub/n操作来计算。用于每个simd_rotl操作的旋转系数集随后通过从那些为左边n位的字段和右边n位的字段所计算出的选择交替的值的来确定。
计算旋转系数的过程对将被处理的每个并行位流集来说只需要一次。因此,并行删除单元提供了一例程compute_deletion_info来基于删除屏蔽计算该信息。并行删除单元提供一例程delete_using_info以将该信息重复应用于所需的多个并行位流。
按照本发明的一个或多个实施例,例程基于删除屏蔽执行字节或双字节流内的删除。基于例如一次考虑128个元素的位屏蔽计算出删除信息。计算得来的信息然后就可通过在128位寄存器中16个字节一次的字节旋转或者在128位寄存器中8个字节一次的双字节旋转来执行删除。
其它替换实施例可在通过左边结果归纳来执行删除时使用加性移位过程。与中央结果归纳类似,目标是通过组合左边结果相邻的n位左结果对来计算2n位的左删除结果。一般而言,这可以通过计算一个2n位的加性移位项,然后将该项应用于由相邻n位输入形成的2n位的值来实现。该移位项是通过将右边n位输入乘以2k-1来计算出的,其中k是左边n位输入的删除计数。实质上,这实现了2n位的条件k位移位,也就是,最右边的n位被移位而左边n位输入中没有被删除的位被原地保留。左边结果归纳需要所有删除的位在过程开始前用0屏蔽。
根据观察,乘法因数2k-1在预处理阶段很容易被确定。作为一个无符号的n位整数,因数2k-1的位表示由n-k个0继之以k个1组成。然而,这个位模式正好是对应于左边n位输入的删除结果的经更新的删除屏蔽。因此,通过随着删除操作的进行更新删除屏蔽,就可以直接得到乘法因数。
左边结果归纳的一个特殊情况是在第一步,确定2位的左边结果。在这种情况下,通常需要一个1位的乘法。然而,1位的乘法等同于逻辑与操作。因此,无需使用这个乘法。
在接下来的步骤中,乘法仍然有效。尽管通常乘法通常有很大的延迟,流水线体系结构可以减少单独指令循环的有效成本。在这样的情况下并假设操作可以并行化,每个位流每个归纳的通常成本是4个操作:一个复制,一个屏蔽,一个乘法和一个移位。
因此,当指令集体系结构提供元素向量与乘数向量的同步乘法,但不提供相应的移位操作时,可以使用利用加性移位的左边结果归纳。例如奔腾体系结构的SSE扩展提供产生16位、32位或64位的结果的这种操作,但不具有独立对那样大小的元素移位独立的移位值的相应操作。
在指令集体系结构不提供同步的使向量元素可以旋转独立的旋转计数的向量的情况下,如果位删除操作将应用于并行的多个位流,则替换实施例可使用中央结果归纳。在这样的情况下,SIMD寄存器可能要重新打包以使得来自若干个位流的并行片断可以一次处理。当计算一个2n位的中央归纳结果时,理想情况是寄存器被重新打包以使用来自若干个流的相应的n位片断。在这种情况下,寄存器中所有的片断都将被位移同样的量,即寄存器内的元素无需独立的旋转。
指令集体系结构可能会提供用索引向量选择任意的位的能力。例如,Power PC通过vec_perm指令提供这样的设施,而Sun VIS体系结构是通过vis_bshuffle指令来提供。删除字节或双字节的替换实施例是开始先对索引向量使用其中一种删除算法,然后用这个索引向量来选择需要的不删除的元素。如果选择被设定为一次最多16个元素,那么可开始先计算使用4位索引值的打包的索引向量。该被打包的表示的删除步骤相对于字节的删除步骤有着双重优势,而相对于双字节的删除步骤有着四重的优势。
本发明的一个或多个实施例利用专用的逻辑电路实现并行删除。实现对N=2k位的位流片断中并行删除的逻辑电路可以被实现为K级逻辑电路。第一级的输入由删除屏蔽和将要被应用并行删除的并行位流(操作数流)组成。第一级首先为删除屏蔽中的每个连续的2位的字段计算2位的删除计数(删除计数流)。第一级所分割的移位寄存器的连接是为了按照中央结果归纳的方法将这些计数应用于操作数流内每个2位的字段的旋转。更新后的删除计数流和操作数流与第二级的输入相连。第二阶段类似地将相邻的2位的字段的删除计数对相加从而产生4位删除计数并且按照下一级的中央结果归纳将这些计数应用于其操作数流后续级也做类似的设置。最后一级的连接是为了执行N位中央结果的简单旋转以产生最后的N位左边删除结果。
3.8并行位流到连续字节的转换
并行位流到串行字节置换过程就是将上面3.2节描述的置换过程颠倒过来。三个二进制的合并变换被用来完成整个置换。每个二进制的合并变换将两个输入流组合起来产生一个双倍长的输出流。三阶段这样的二进制合并变换生成一个为原始输入流八倍长的一个输出流。按照本发明的一个或多个实施例构建的二进制的合并变换被认为是输入了8个并行位流的定长区段,每个区段等长并且满足满块不变量。图7显示了一个使用理想指令集体系结构的simd_mergeh和simd_mergel指令的实施例。通常情况下,每个2048位的满缓存器将作为输入被提供,以生成2048字节的满缓存器到预先分配的数据区。
按照本发明的一个或多个实施例,该互补置换允许应用在字节处理和并行位流处理之间随意切换。
4.Unicode处理方法
这一节描述了按照本发明的一个或多个实施例构建的方法,它解决了Unicode文本处理的具体需求。支持UTF-8、UTF-16和UTF-32,其中包括代码单元分类、验证和解码。还提供了诸表示之间的转码操作。
这节所描述的方法是按照本发明的一个或多个实施例构建的且使用了之前所描述的方法。在每种情况下,等式被用来定义涉及特定处理需求的位流。一般来说,涉及那些没有说明的等式的执行细节可以由本领域的普通技术人员常规地且无需过多实验地作为这里呈现的方法的简单应用来实现。
4.1UTF-8字节分类
UTF-8字节分类器形构成有效的位流定义来支持验证、解码和转换。
UTF-8是基于8位代码单元或字节的。在十六进制0-7F之间的字节直接代表了Unicode代码点。实质上,这些是单字节的代码单元序列。在十六进制80-FF之间的字节代表由C0-FF范围内的前缀字节和一个或多个均在十六进制80-BF范围内的后缀字节组成的多字节代码单元序列。两字节序列的前缀字节在十六进制C0-DF之间;三字节序列的前缀字节在十六进制E0-EF之间;四字节序列的前缀字节在十六进制F0-FF范围之间;在这些范围内,有些前缀值是非法的,如C0,Cl和F5到FF。
1.1节定义了u8prefix和u8prefix2位流(属性流)来分别代表所有前缀字节的集合和标识双字节序列的第一个字节的那些前缀字节的集合。代表其它字节分类的位流可以类似地由以下等式定义。
u8prefix(i)=u8bit0(i)∧u8bit1(i) (4.2)
u8suffix(i)=u8bit0(i)∧u8bit1(i) (4.3)
u8prefix3or4(i)=u8prefix(i)∧u8bit2(i) (4.5)
u8prefix4(i)=u8prefix3or4(i)∧u8bit3(i) (4.7)
u8badpfx2(i)=u8prefix2(i)∧ (4.8)
u8badpfx4(i)=u8prefix4(i)∧ (4.9)
(u8bit4(i)∨u8bit5(i)∧(u8bit6(i)∨u8bit7(i)))
对应于每个UTF-8前缀字节的出现,为多字节序列的第2、3或4位置上的后缀字节建立了特定的期望值。遵循前面给出的u8scope22模式,指定3字节和4字节序列的预期后缀字节的位置的范围等式如以下所定义。
u8scope22(i)=u8prefix2(i-1) (4.10)
u8scope32(i)=u8prefix3(i-1) (4.11)
u8scope33(i)=u8prefix3(i-2) (4.12)
u8scope42(i)=u8prefix4(i-1) (4.13)
u8scope43(i)=u8prefix4(i-2) (4.14)
u8scope44(i)=u8prefix4(i-3) (4.15)
一个附加的定义有用于标识需要对紧跟的后缀字节检查特殊限制的那些UTF-8前缀字节,即十六进制E0、ED、F0和F4的前缀字节。以下定义可以用来将这些情形与其它3字节和4字节前缀的合法情形区分开来。
按照本发明的一个或多个实施例,对应于这些等式中的每一个创建属性流可以由本领域的普通技术人员利用这里的公开——包括3.1节中提供的公开无需过多实验地来执行。本发明的一个或多个实施例可根据3.1.3节的描述将UTF-8字节分类模块实现为逻辑电路。
4.2UTF-8验证
UTF-8验证需求可以用UTF-8字节分类和范围期望来表示。总体来说,有8个违规条件需要检查。前两个违规条件分别标识为两字节和四字节序列预留的范围内的无效前缀;这些由如上定义的u8badpfx2和u8badpfx4的给出。
第三、第四个违规条件标识未配对的UTF-8前缀和后缀字节。第三个违规条件标识预期出现前缀字节但没有出现的位置。第四个违规条件标识预期出现后缀字节但没有出现的位置。第三和第四这两个违规条件可以通过使用逻辑异或操作一次被检查。
anyscope(i)=u8scope22(i)∨u8scope32(i)∨u8scope33(i)∨ (4.17)
u8scope42(i)∨u8scope43(i)∨u8scope44(i)
第五到第八个违规条件代表对第一个UTF-8后缀字节的约束,只要UTF-8前缀字节分别具有十六进制值E0,ED,F0和F4中的一个。在每种情形下,后缀字节受限于普遍用于UTF-8后缀字节的范围在80-BF的特定子集。在每种情况下所许可的后缀的范围是:E0:A0-BF、ED:80-9F、F0:90-BF、F4:80-8F。相应地,在每种情况下所不允许的后缀的范围是:E0:80-9F、ED:A0-BF、F0:80-8F、F4:90-BF。
在前缀为E0和ED的情况下,注意允许的后缀是互补的。也就是,只要前缀的位4没有被置位(E0),则后缀的位2必须被置位(A0-BF),而只要前缀的位4被置位(E0),则后缀的位2就不能被置位(80-9F)。
u8badsfx32(i)=u8scope32(i)∧u8special(i-1)∧ (4.19)
类似地,最后两个违规条件也涉及后缀的互补需求。当前缀的位4没有被置位时(F0),位2或者位3都不能被置位,而当前缀的位4被置位时(F4),位2或位3当中至少有一个必须被置位。
u8badsfx42(i)=u8scope42(i)∧u8special(i-1)∧(4.20)
总的来说,就以上每个所标识的条件,这些定义允许所有UTF-8违规的集合作为位流之间逻辑或的结果而来标识。
u8invalid(i)=u8badpfx2(i)∨u8badpfx4(i)∨u8mismatch(i)∨(4.21)
u8badsfx32(i)∨u8badsfx42(i)
本发明的一个或多个实施例是实现这些等式的一个或多个方法。这些方法可以由本领域的普通技术人员利用这里的公开——包括3.1节中提供的公开而无需过多实验地来实现。一旦缓存器中所有的块被处理了,就可以应用3.3节中的位删除设施。如果检测到一个差错,可中止输入的进一步处理,且出错信号可被返回给应用。另外,本发明的一个或多个方法涉及在UTF-8验证单元(利用软件指令,硬件指令或软件和硬件指令的组合)中执行一个或多个以上描述的验证方法。
本发明的一个或多个实施例可根据3.1.3节的描述将UTF-8验证模块实现为逻辑电路。
4.3UTF-8解码
例如而非限制可在UTF-8解码单元(利用软件指令、硬件指令或软件与硬件指令的组合)中实现的一种UTF-8解码方法允许应用确定对应于UTF-8数据流的Unicode代码点序列。相较于其它方法,作为转换成替换性编码形式或向应用返回单个的字符或串值的预处理步骤,这通常是很有用的。
图8显示UTF-8代码单元和代码点字节值之间的对应关系。不同类型的序列被对齐以使得序列的最后一个字节可以排在一列;这用于突出跨代码序列的公共模式。
注意图8显示了与每个UTF-8字节相对应的一个代码点字节值。因此,可以十分便利地将一个u8索引的属性流cpbyte(i)定义为如图所示地与u8data(i)相对应的代码点字节值。类似地,cpbit0(i)到cpbit7(i)分别被定义为cpbyte(i)的从bit0到bit7的并行位流。
如图8所示,字节类之间有一些公共模式。因此,定义捕捉这些共性的项是十分便利的。
u8lastsuffix(i)=u8scope22(i)∨u8scope33(i)∨u8scope44(i) (4.22)
u8lastbyte(i)=u8lastsuffix(i)∨u8unibyte(i) (4.23)
u8butlastsuffix(i)=u8scope32(i)∨u8scope43(i) (4.24)
u8butlastbyte(i)=u8butlastsuffix(i)∨u8prefix2(i) (4.25)
解码是通过cpbit0到cpbit7的各自的位等式完成的。每个等式可以用十个项的逻辑或来定义,其中每一项为十个字节分类之一定义位值。然而,公共模式极大地简化了等式。例如,cpbit0除了最后和butlast后缀字节均是0。在最后一个字节的三种情况中,cpbit0是如图8所示的位s;在每种情况中,这个位与前面的u8data字节的位6相对应。在butlas后缀字节的两种情况中,cpbit0是位.j,与前面的u8data字节的位4相对应。
cpbit0(i)=(u8lastsuffix(i)∧u8bit6(i-1))∨ (4.26)
(u8butlastsuffix(i)∧u8bit4(i-1))
其它位的定义遵循类似的模式
cpbit1(i)=(u8lastsuffix(i)∧u8bit7(i-1))∨ (4.27)
(u8butlastsuffix(i)∧u8bit5(i-1))∨
(u8unibyte(i)∧u8bit1(i))
cpbit2(i)=(u8lastbyte(i)∧u8bit2(i))∨(4.28)
(u8butlastsuffix(i)∧u8bit6(i-1))
cpbit3(i)=(u8lastbyte(i)∧u8bit3(i))∨ (4.29)
(u8butlastsuffix(i)∧u8bit7(i-1))∨
(u8scope42(i)∧u8bit5(i-1))
cpbit4(i)=(u8lastbyte(i)∧u8bit4(i))∨ (4.30)
(u8butlastsuffix(i)∧u8bit2(i))∨
(u8scope42(i)∧u8bit6(i-1))
cpbit5(i)=(u8lastbyte(i)∧u8bit5(i))∨ (4.31)
(u8butlastbyte(i)∧u8bit3(i))∨
(u8scope42(i)∧u8bit7(i-1))
cpbit6(i)=(u8lastbyte(i)∧u8bit6(i))∨ (4.32)
(u8butlastbyte(i)∧u8bit4(i))∨
(u8scope42(i)∧u8bit2(i))
cpbit7(i)=(u8lastbyte(i)∧u8bit7(i))∨(4.33)
(u8butlastbyte(i)∧u8bit5(i))∨
(u8scope42(i)∧u8bit3(i))
创建一个cpbyte字节流可以由本领域的普通技术人员应用3.8节描述的并行位流到串行字节的置换常规地而无需过多实验的来执行。
本发明的一个或多个实施例可根据3.1.3节的描述将UTF-8解码模块实现为逻辑电路。
4.4UTE-16数据流
按照本发明的一个或多个实施例构建的UTF-16处理方法允许Unicode文本数据根据UTF16、UTF16-LE或UTF-16BE编码方案中的任何一种来处理。这些方案的区别在于每个16位代码单元的字节是按照big-endian(大尾序)还是little-endian(小尾序)顺序出现以及字节顺序标记是否可用来信号指示endianness(尾序)。
按照本发明的一个或多个实施例,为了从UTF-16数据源读取输入,以UTF16、UTF16-LE或UTF16-BE中的一个模式打开这个源。endianness的值根据本领域的技术人员所公知的方法中的任何一个来确定并存储。当以UTF-16模式打开时,big-endian作为初始默认被存储。然而,输入的前两个字节的检测可以不靠考虑这个设置。如果输入的前两个字节分别是十六进制的FF和FE,那么这可以被认为是指示little-endianness(小尾序)的字节顺序标记。该模式被置为little-endian且字节顺序标记被丢弃。如果输入的前两个字节分别是十六进制FE和FF,则模式维持big-endian不变,且前两个字节被丢弃。否则,输入的前两个字节被保持并且维持big-endian的默认模式。
当一个数据流以UTF-16LE模式打开时,endianness被设置为little-endian。不用为字节顺序标记对前两个输入字节作任何检查。类似地,当一个数据流按UTF-16BE模式打开时,endianness被设置为big-endian,并且输入处理直接继续进行而无需对潜在字节顺序标记的检测。
按照本发明的一个或多个实施例,UTF-16输入数据到并行位流的转换需首先为每个逻辑UTF-16代码单元的最高有效和最低有效字节计算u16索引的并行字节流u16byte0和u16byte。在big-endian的模式下,u16byte0字节流由来自UTF-16数据源的每个16位值的第一个字节组成,而u16byte1字节流由每个这样的16位值的第二个字节组成。在little-endian的模式下,字节顺序是相反的。在典型的SIMD体系结构中,每两个载满连续UTF-16数据的连续寄存器需要单个SIMD打包操作。使用理想指令集体系结构,例如,操作simd_pack/16(x/h,y/h)和simd_pack/16(x/l,y/l)分别计算来自包含在寄存器x和y中原始big-endian的UTF-16片断的u16byte0和u16byte1的字节流片断。
3.2节中串行字节到并行位流的单元被用于生成位流。位流u16bit0到u16bit7是根据u16byte0字节流置换而生成的,而位流u16bit8到u16bit15是根据u16byte1字节流置换而生成的。
4.5UTF-16代理对和验证
在十六进制0-D7FF和E000到FFFF范围内的Unicode代码点被直接表示为UTF-16中16位的值。在十六进制10000到10FFFF范围的Unicode代码点被表示代为代理对;也就是分别在十六进制D800-DBFF和DC00-DFFF范围的两个连续的UTF-16代码单元。UTF-16验证需要在整个范围D800-DFFF间的代码单元只根据代理对规约出现。
按照本发明的一个或多个实施例,以下定义为验证和解码将UTF-16代码单元分类为低或高代理。
u16bit3(i)∧u16bit4(i)
u16surrogatehi(i)=u16surrogate(i)∧u16bit5(i) (4.36)
存在两个可能的无效UTF-16代码单元序列的类型。第一个是一个具有未立即继之以高代理的低代理代码单元的序列。第二个是并非正好在一低代理之前的高代理的出现。这两个条件都可以用单个标识任何一种失配的异或测试来确定。
本发明的一个或多个实施例可根据3.1.3节的描述将UTF-16验证模块实现为逻辑电路。
4.6UTF-32数据流
按照本发明的一个或多个实施例构建的UTF-32处理方法允许Unicode文本数据根据UTF32、UTF32-LE、或UTF32-BE编码方案中的任何一种来处理。这些方案的区别在于每个32位代码单元的字节是按照little-endian还是big-endian出现以及字节顺序标记是否可用于信号指示endianness。
按照本发明的一个或多个实施例,为了从UTF-32数据源读取输入,以UTF32、UTF-32LE或UTF-32BE中的一个模式打开这个源。endianness的值按照本领域的技术人员所已知的方法中的任何一中来确定并存储。当以UTF-32模式打开时,big-endian作为初始默认被存储。然而,输入的前两个字节的检测可以不靠考虑这个设置。如果输入的前四个字节分别是按顺序的十六进制FF、FE、00和00,那么这可以被认为是指示little-endian的字节顺序标记。模式被置为little-endian且字节顺序标记被丢弃。如果输入的前四个字节分别是按顺序的十六进制FF、FE、00和00,则模式维持big-endian不变,且前四个字节被丢弃。否则,输入的前四个字节被保持并且维持big-endian的默认模式。
当一个数据流以UTF-32LE模式打开时,endianness被设置为little-endian。不用为字节顺序标记对前两个输入字节作任何检查。类似地,当一个数据流以UTF-32BE模式打开时,endianness被设置为big-endian,并且输入处理直接继续进行而无需对潜在字节顺序标记进行检测。
UTF-32代码单元直接表示Unicode代码点。然而只需要21位来表示从十六进制的0000到10FFFF的所有Unicode代码点。按照本发明的一个或多个实施例,将UTF-32转换成并行位流的方法被设计成生成21个有效位流以作进一步的处理,同时也验证每个UTF-32代码单元的最高的11个有效位被置0。
转换过程的继续执行是通过首先为每个逻辑UTF-32代码单元的四个字节按最高有效到最低有效的顺序计算四个并行字节流u32byte0、u32byte1、u32byte2和u32byte3。在big-endian模式下,u32byte0、u32byte1、u32byte2and u32byte3分别由来自UTF-32数据源的每个32位代码单元的第一个、第二个、第三个和第四个字节组成。在little-endian模式下,字节顺序是相反的。按照本发明的一个或多个实施例,这些转换可以由本领域的普通技术人员使用SIMD处理器的直接打包操作来实现。
对应于每个代码单元的最高有效的8个位,u32byte0流只用于验证所有位为0。3.2节中的串行字节到并行位流单元被应用于每个u32byte1、u32byte2和u32byte3流来生成3个相应的8个并行位流集。这三个集中各自的位流被分别标记为u32bit8到u32bit15、u32bit16到u32bit23、和u32bit24到u32bit31。然而,流u32bit8到u32bit10只用于验证所有位为0。因此,标记为u32bit11到u32bit31的流包括Unicode的21个有效位流。
一旦UTF-32代码单元转换成并行位流,就执行最后的验证步骤以确保代码点被限定在十六进制的0000到D7FF和E000到10FFFF的范围内。
u32bit19(i)∧u32bit20(i)
本发明的一个或多个实施例可根据3.1.3节的描述将UTF-32验证模块实现为逻辑电路。
4.7转码
本发明的一个或多个实施例包括在Unicode的UTF-8、UTF-16和UTF-32表示之间进行转码的方法。
UTF-8到UTF-16转码的例子是说明性的。图9显示了按照本发明的一个或多个实施例构建的UTF-8到UTF-16的位空间转码器1000(U8U16BIT1000)的输入/输出图。U8U16BIT1000将验证过的UTF-8输入数据1001的一个128位的代码单元块转换成相应的UTF-16输出数据1002。然而,只有完整的UTF-8代码单元序列才被转码;任何在输入块末端的不完整的多字节序列的代码单元都被忽略。处理过的UTF-8代码单元的数量作为输出u8count1003被提供,而处理过的UTF-16代码单元的数量作为输出u16count1004被提供。输入1001由u8索引的位流u8bit0到u8bit7的8个并行的128位的片断组成。输出1002由u16索引的位流u16bit0到u16bit15的16个并行的128位的片断组成。输出流的第一个u16count1004位置表示对应于UTF-8输入的第一个u8count1003位置的UTF-16代码单元。
图10显示了U8U16BIT1000的内部结构。一个简略的概览介绍了U8U16BIT
1000的模块和它们的作用;以下是详细的描述。U8U16BIT1000包括:三个寄存器文件、UTF-8输入寄存器文件100(U8IRF 100)、控制寄存器文件120(CRF 120)、和UTF-16输出寄存器文件140(U16ORF 140)。每个寄存器文件包括了一个128位的寄存器集合,它们存储了并行位流数据128位的片断。特别地,按照这个实施例,在获得输入时对U8IRF 100初始化,用以存储输入数据流u8bit0到u8bit7的每个并行的128位的片断;CRF120被用来存储控制UTF-16位解码器模块130(U16BDM130)和UTF-16流压缩模块160(U16SCM160)的功能的属性流片断。存储在CRF120中的属性流片断由UTF-8字节分类模块110(U8BCM110)和UTF-16删除控制模块(U16DCM150)准备。具体来说,U16BDM130准备u8索引形式的UTF-16流片断的初始值并且将它们存储到U16ORF140。U16SCM160操作存储在U16ORF140中的UTF-16流片断以将它们转化成u16索引的形式。代码单元计数寄存器文件170(CUCRF170)包括两个8位寄存器,用来存储报告转码过程中涉及的UTF-8和UTF-16代码单元的数量的整数。
将u8bit0到u8bit7流片断输入U8IRF100之后,U8BCM110计算按照4.1节中的等式将每个位置上的代码单元分类的并行位流片断,也就是u8unibyte,u8suffix,u8prefix,u8prefix2到u8prefix4和u8scope22到u8scope44。U8BCM 100将计算出的属性流片断存储在CRF120中以供U16BDM130和U16DCM150使用。
一旦用U8BCM110完成代码单元分类,U16BDM130就按照图11所示的说明,计算最终UTF-16数据的u8索引的中间形式。这个中间形式由在图11中标记为u16hi和u16lo的两个位流片断的集合组成,其中每个包括了8个位流片断u16hi0到u16hi7以及u16lo0到u16lo7。对于UTF-8的每一类,图11显示了存在于该类的代码单元位置上的位模式。u16hi0到u16hi7和u16lo0到u16lo7位的模式是按照u8bit0到u8bit7的相应UTF-8模式来显示的。注意,在多字节序列中,u16hi和u16lo位中的有些值是按照代码单元中前面位置上的UTF-8位值来定义的。
解码过程的一个难点是UTF-8数据的5位efghi模式到UTF-16形式的4位abcd模式的变换,其中efghi=abcd-1。如图11的表中所示,efg位作为u8prefix4位置上的u8bit5到u8bit7出现,而hi位作为u8scope42位置上的u8bit2和u8bit3出现。所变换的ab和cd位模式被实现为u8scope42位置上的u16hi6/7和u16lo0/1位。按照有效UTF-8数据的约束,efghi的值在00001到10000的范围之间,所以abcd=efghi-1的值在0000到1111的范围内。
以下等式详述了U16BDM130操作。u8lastsuffix和u8lastbyte的值首先根据等式4.22和4.23确定。
u8surrogate(i)=u8scope42(i)∨u8scope44(i) (4.39)
u16hi0(i)=(u8scope33(i)∧u8bit4(i-2))∨u8surrogate(i) (4.40)
u16hi1(i)=(u8scope33(i)∧u8bit5(i-2))∨u8surrogate(i) (4.41)
u16hi2(i)=u8scope33(i)∧u8bit6(i-2) (4.42)
u16hi3(i)=(u8scope33(i)∧u8bit7(i-2))∨u8surrogate(i) (4.43)
u16hi4(i)=(u8scope33(i)∧u8bit2(i-1))∨u8surrogate(i) (4.44)
u16hi5(i)=(u8lastsuffix(i)∧u8bit3(i-1))∨u8scope44(i) (4.45)
在u8scope42位置上,u16hi6,u16hi7,u16lo1和u16lo2的定义包括了abcd=efghi-1的逻辑。最低有效位总是取反,而其它位是否取反取决于是否有借位。
u16lo1(i)=(u8unibyte(i)∧u8bit1(i))∨ (4.46)
(u8lastsuffix(i)∧u8bit7(i-1))∨
u16borrow0(i)=u16lo1(i) (4.47)
u16lo0(i)=(u8lastsuffix(i)∧u8bit6(i-1))∨ (4.48)
u16hi7(i)=(u8lastbyte(i)∧u8bit7(i))∨ (4.50)
u16hi6(i)=(u8lastsuffix(i)∧u8bit4(i-1))∨ (4.52)
(u8scope42(i)∧(u8bit6(i-1)u16borrow2(i)))
剩下的等式为:
u16lo2(i)=(u8lastbyte(i)∧u8bit2(i))∨ (4.53)
(u8scope42(i)∧u8bit4(i))
u16lo3(i)=(u8lastbyte(i)∧u8bit3(i))∨ (4.54)
(u8scope42(i)∧u8bit5(i))
u16lo4(i)=(u8lastbyte(i)∧u8bit4(i))∨ (4.55)
(u8scope42(i)∧u8bit6(i))
u16lo5(i)=(u8lastbyte(i)∧u8bit5(i))∨(4.56)
(u8scope42(i)∧u8bit7(i))
u16lo6(i)=(u8lastbyte(i)∧u8bit6(i))∨(4.57)
(u8scope42(i)∧u8bit2(i+1))
u16lo7(i)=(u8lastbyte(i)∧u8bit7(i))∨(4.58)
(u8scope42(i)∧u8bit3(i+1))
U16BDM 130计算u16hi0到u16hi7和u16lo0到u16lo7的位流片断并且将结果值存储于U16ORF140中。
一旦u16lo和u16hi的计算完成,剩下的主要任务就是通过并行位删除将存储的值从u8索引的中间形式转换为u16索引的最终形式。U16DCM 150计算u16delmask来标识删除哪些位置。删除发生在图11中标记为删除的所有代码单元位置,也就是,发生在u8prefix以及u8scope32和u8scope43位置。另外,如果在块的最终的一到三个代码单元位置上发现不完整的4字节UTF-8序列,则指定在这个代码单元序列的u8scope42位置上的删除。为了适应后一考虑,认为u8suffix(i)对i≥128具有0值是十分便利的。
u16delmask(i)=u8prefix(i)∨u8scope32(i)∨u8scope43(i)∨(4.59)
(u8scope42(i)∧u8suffix(i+2))
基于这个删除屏蔽,U16DCM150进一步计算3.7节中描述的删除信息并且将这个信息存储于CRF120。按照一个或多个实施例,这个删除信息的确定是基于中央结果归纳的方法来确定的。对应于中央结果归纳的六个步骤(将64个2位结果组合成32个4位结果,将32个4位结果组合成16个8位结果,依此类推直到计算出一个128位的中央结果),七个128位的回转计数集合被存储于CRF 120,继之以将128位的中央结果转换为128位的左边结果的最终旋转值。
U16DCM150进一步利用u16delmask来确定从转码过程得到的UTF-16代码单元的数量。对应于u16delmask中每个值为0的位,生成一个UTF16代码单元。u16delmask是反向的,3.4节中的位计数方法和/或单元应用于此处并且将结果存储于CUCRF170的u16count寄存器中。
U16DCM150还计算了被转码的UTF-8代码单元的数量并且将这个值存储在CUCRF170的u8count寄存器中。u8count值是由作用于定义如下的u8incomplete的翻转的位计数操作来确定的,
u8incomplete(i)=(u8prefix(i)∧u8suffix(i+1))∨ (4.60)
U16SCM 160负责将u8索引的u16hi和u16lo数据集合转换成十六个并行的u16索引的位流片断u16bit0到u16bit15的最终集合。3.8节中的并行删除方法和/或单元被应用于U16ORF140的十六个流片断寄存器中的每一个。这有效地原地执行了从u8索引形式到u16索引形式的转换。一个或多个实现通过使用前面由U16DCM 130计算出的并存储于CRF 120中的旋转计数应用了中央结果归纳的方法。
在U16SCM160完成了流压缩并且U16DCM130生成了u8count和u16count时,所需的U8U16BIT1000的输出被存储U16ORF140和CUCRF170中并可供使用。
一个或多个实施例利用一个128位的理想SIMD指令集处理器的操作来实现U8U16BIT1000。一个或多个替换实施例利用专用逻辑电路按照3.1.3、3.4和/或
3.7节中的描述的来实现U8U16BIT1000或其一个或多个组件。
按照本发明的一个或多个其它实施例,位空间和字节空间技术的被用于实现UTF-8字节流到相应的UTF-16双字节流的字节空间转码。字节空间转码器将UTF-8字节流用作输入并且首先利用3.2节中的方法和/或单元将它转换成位流形式。一个或多个实施例使用位空间转码器来生成16个并行位流形式的UTF-16数据。较高的八个和较低的八个位流均使用3.8节中的方法转换成串行字节的形式。使用simd_merge操作可将两个字节流交织以生成UTF-16双字节流。一个或多个替换实施例使用一个修改过的位空间转码器,它忽略位空间中到u16索引形式的转换。u8索引的位流到双字节空间的置换在删除对应于u8prefix、u8scope32和u8scope43位置的数据之前执行。然后在双字节空间中执行到u16形式的转换,使用索引向量如3.7节所描述的选择不被删除的字节。
按照本发明的一个或多个实施例,在转码中执行ASCII最优化。利用3.3节中的位删除方法,可检查块或缓存器以确定整个块或缓存器是否由UTF-8的ASCII子集内的字符组成。u8bit0中的任意一个值为1的位意味着一个非ASCII字符,如果没有检测到这样的位,那么块或缓存器就可以以一种简单的方式被处理。例如,位空间转码器可以通过将所有u16hi位流设为0、所有u16lo位流设为相应u8bit流的值以及跳过位删除步骤(因为ASCII块或缓存器中不存在u8prefix、u8scope32或u8scope43位置)来最优化ASCII块或缓存器的处理。字节空间转码的一个或多个实施例通过直接向ASCII字节流中插入空字节、绕过位空间变换而最优化ASCII块或缓存器的处理。
按照本发明的一个或多个实现,在转码中实现了四字节最优化。利用3.3节中的位删除方法,可检查块或缓存器以确定整个块是否没有UTF-8序列。如果块不是以后缀字节开始且u8prefix4完全由0位组成,则通过忽略处理四字节序列的逻辑的简化过程来实现转码。
4.8作为操作系统服务的验证、解码和/或转码
本发明的一个或多个实施例可以将验证、解码和/或转码提供作为操作系统的一部分或标准库服务的一部分。按照本发明的一个或多个这样的实施例,通用转码服务可以按照iconv规格的规约来执行。按照一个或多个这样的实施例,附加的转码服务可以实现对Unicode格式和很多其它非Unicode字符编码的转码服务。按照一个或多个这样的实施例,这样的附加的转码服务可以使用基于一个或多个前面描述的技术的并行位流的方法,或者它可以使用现有技术中已经完备建立的标准技术。不同的非Unicode字符编码之间的转码可以由一个两步的过程来实现,该过程涉及将源字符表示解码成Unicode代码点,然后根据目标字符编码的要求对这些代码点编码。
4.9验证、解码和/或转码虚拟机服务
本发明的一个或多个实施例可将验证、解码和/或转码提供为虚拟机或运行时环境的服务。按照一个或多个这样的实施例,虚拟机或运行时环境可以对字符的特定内部表示标准化,例如而非限制,UTF-16。按照一个或多个这样的实施例,由虚拟机或运行时环境提供的I/O服务可以自动地转换成标准内部表示或从其转换成输入或输出的所需表示。
4.10验证、解码和/或转码工具
本发明的一个或多个实施可以将验证、解码和/或转码提供为网络工具内的服务。按照一个或多个实施例,一个局域网可以被配置用来标准化一类或多类应用文件的特定Unicode变换格式或其它编码字符集表示。网络工具中的转码服务可以用来对该表示进行转换,只要逻辑数据包是接收自或发送到该局域网所连接的广域网。该局域网内执行的应用也可以使用网络工具的服务。不同的非Unicode字符编码之间的转码可以由一个两步的过程来执行,该过程涉及将源字符表示解码成Unicode代码点,然后根据目标字符编码的要求将这些代码点编码。
4.11XML处理器中的验证和/或转码
本发明的一个或多个实施例将验证和/或转码整合到XML处理器中。XML处理器接受UTF8或UTF16的输入数据并且可以接受众多的其它任何编码方式的数据。按照一个或多个这样的实施例,XML处理器根据应用程序接口(API)以UTF-16表示或其它字符编码将已解析的元素和文本数据提供给应用。只要输入字符编码不同于API字符编码,XML处理器就将数据从输入形式转码为API形式。在转码之前或期间,执行字符数据的验证以确保字符数据按照编码需求是有效的,否则会发出差错条件的信号。
4.12办公软件的验证、解码和/或转码
本发明的一个或多个实施例将验证、解码和/或转码整合到办公应用中,例如而非限制,字处理器、电子数据表、数据库、或演示软件。办公应用定义了作为在存储器中处理文档的优选表示的内部文档表示,同时也定义了用作存储工作文档的优选格式的本机文件格式。一个或多个这样的实施例可以使用OASIS的基于XML的开放文档格式作为本机格式,而其它实施例可使用Microsoft Office OpenXML。办公应用为各种其它工业应用的数据格式提供了文件导入和导出过滤器。只要输入文件的字符编码不同于内部文档表示所要求的编码,就执行输入形式到内部形式的转码。只要输出文件的字符编码不同于内部文档表示所要求的编码,转码就会被适当地整合到输出过程中。
4.13数据库中的验证,解码和/或转码
本发明的一个或多个实施例将验证和/或转码整合到数据库系统中。例如,在服务器、数据库、表和列级别上的SQL CHARACTER SET(SQL字符集)规格允许应用存储众多字符编码中任意一种的数据,并且混合应用内的编码。SQLCONVERT(SQL转换器)操作直接调用按照一个或多个这种实施例构建的转码单元来生成按服务器、数据库、表或列所要求编码的字符数据。
4.14便携式通讯设备中的验证、解码和/或转码
本发明的一个或多个实施例将验证、解码和/或转码整合到诸如手机、个人数字助理或无线电子邮件设备等便携式通讯设备中。一般而言,这些设备可以通过网络发送或接收字符流数据。该设备可以调用验证、解码和/或转码以确保从网络接收的字符流数据是可供该设备的通讯软件处理的正确形式。还可调用转码以将字符流数据从设备使用的本机格式的转换成网络传输所需的形式。
4.15文本获取系统中的验证、解码和/或转码
本发明的一个或多个实施例将验证和/或转码整合到文本获取系统中。一般而言,这些系统获取来自各种源的文本并将它们综合到统一的文本库中。一旦检索到来自特定源的文本数据,一个验证步骤就被用来确保该文本数据是按照该源所使用的字符编码方案正确表示的。如果该源使用的编码方案不是文本库内部使用的编码方案,则应用转码以将文本数据从数据源使用的外部形式的转换成文本库使用的内部形式。
5.理想SIMD体系结构的一个或多个实施例
5.1使用现有SIMD体系结构的实施例
按照本发明的一个或多个实施例,第二节描述的理想SIMD指令集体系结构通过使用现有SIMD体系结构的宏集来实现。例如,具有128位寄存器的理想指令集体系结构可以C语言接口被实现为使用Power PC的Altivec指令集的宏集。理想体系结构的每个指令都映射到一个三变元参数的宏集上,它以simd_OP_W_XY的形式命名,其中依次地,OP是操作名称,W是字段宽度(操作修改器)以及X和Y是两个操作数修改器的代码。代码“h”指定“/h”半操作数修改器,代码“l”指定“/l”半操作数修改器,而代码“x”指定无半操作数修改器。每个宏的变元由理想指令的目标寄存器和两个操作数寄存器组成。因此,使用这种命名方案,理想化指令r=simd_pack/4(a/h,b)将映射至宏调用simd_pack_4hx(r,a,b)。
这些宏是通过指令/字段宽度组合来方便地组织的。对每个这样的组合,对于不同的操作数代码对:hh、hl、hx、lh、ll、1x、xh、xl、xx,存在9个宏的集合。其中,宏xx代表应用指令逻辑前两个操作数都没有被修改的基本形式。依据“l”和“h”代码应用操作数修改后,其它每种形式可以按照该基本形式来实现。
代码“l”相关联的操作数修改是利用逻辑与操作来屏蔽掉每个n位字段的高n/2个位。对于128位宽的满Altivec寄存器,该屏蔽由n/2个零继之以n/2个1的交替模式组成。例如,对于4位的字段,代码“l”相当于使用一个由各自具有十六进制值0x33的16个字节组成的屏蔽。
与代码“h”相关联的操作数修改是利用右移逻辑操作并根据需要继之以屏蔽操作来实现的。位移常量是n/2个位即字段宽度的一半。在可能的场合(即Altivec上8、16、32和128位的字段宽度),Altive指令的字段宽度被选成匹配理想指令的字段宽度。在这些情况下,无需后续的屏蔽。在其它情况下,使用具有更大字段宽度的Altivec移位,继之以对所给的字段宽度应用与“l”代码相关联的屏蔽操作。
当指令/字段宽度组合可在Altivec指令集中直接得到的时候(即,通常在8、16和32位字段宽度的情况下),实现策略是简单的。“xx”的宏可以直接映射到Altivec指令,而其它形式则需首先应用上面描述的操作数修改。图12以simd_add/16的9个宏为例显示了一般性模式。
在某些情况下,当指令的语义意味着特定操作数的高n/2个位不具有任何意义的时,该一般性模式可以被简化。操作数修改器“/l”在这种情况下不起作用。例如,对于在各种移位和循环指令中的移位操作数(第二个操作数)来说这就成立。因此,以“1”结尾的宏可以被简化为等价的“x”模式,即不对第二个操作数执行任何操作数修改。一个类似的简化应用于simd pack指令的两个操作数(在转换的截断模型下)。4位字段的理想指令的实现通常通过组合对8位字段应用相应的Altivec指令的结果来进行。一个此类应用处理每个字节的高4位字段,而第二个处理相应的低4位字段。屏蔽和/或移位操作用来将4位字段的值恰当地定位以应用该8位指令。在可能的场合,结果被设计成它们可使用单个vec_sel或vec_or操作来组合。图13示出了simd_srl_4的示例。
在2位字段宽度的情况下,能够组合对8位的字段四次应用Altivec操作的结果。然而在大多数情况下,使用逻辑操作将2位字段的每个位确定为操作数的四个位的布尔函数更为简单。例如,将减法c0c1=a0a1-b0b1考虑为2位字段的操作。等式c1=a1 b1可以被用来计算最低有效位,而在计算最高有效位时,c0=a0 b0 (a1∧b1)包括了借位项。这些用SIMD逻辑操作实现的计算可以处理128位的寄存器内64个2位字段的每一位。图14显示包括针对simd_sub/2操作的这些计算的Altivec实现。此图还示出了当两个操作数都有修改器时可应用的最优化。
利用类似上面描述的那些技术可以很容易的实现64位和128位字段宽度的理想指令集。组合32位算术操作的结果以产生64位或128位的结果在现有技术中是已知的并且可以利用Altivec操作,如设计成产生进位的vec_addc和vec_subc。Altivec确实提供了能够处理128位的字段宽度的移位操作。两个64位字段的SIMD移位可以通过按照与利用对8位的字段宽度的操作实现4位的移位相类似的方式,组合2次128位的移位结果来执行。替换实施例可组合32位的移位结果来生成64位的结果。
6.本发明的一个或多个实施例的集中讨论
图15显示了按照规格说明的一个或多个实施例构建的模块3000的框图。按照本发明的一个或多个实施例,模块3000可以为:(a)操作系统或库服务包;(b)虚拟机或运行时环境;(c)网络工具;(d)XML处理器;(e)办公应用,例如而非限制地,字处理器、电子数据表、数据库或演示软件;(f)数据库系统;(g)便携式通信设备,例如而非限制地,手机、个人数字助理或无线电子邮件设备;和(h)文本获取系统。以下描述了模块3000当中与字符流处理相关的一部分,因为用于与这里描述部分接口的方法以及模块3000其余部分对于本领域的普通技术人员是公知的。此外,在这些实施例中利用该处理的具体方式已经在之前描述过了。
如图15所示,模块3000的字符流施加模块390将字符流400作为输入施加于并行属性位流模块410。(字符流施加模块390是例如而非限制地以下各项的一部分:操作系统;库服务包;虚拟机;运行时环境;网络工具;XML处理器;办公应用——例如而非限制——字处理器、电子数据表、数据库或演示软件;数据库系统;便携式通信设备——例如而非限制——手机、个人数字助理或无线电子邮件设备;或文本获取系统。)如本领域的普通技术人员容易认识到的,术语“作为输入施加”在最广泛地意义上用作同一位置处或分布式(如在系统和网络中)硬件或软件之间的传输。作为响应,按照前面描述的本发明的一个或多个实施例,并行属性位流模块410生成并行属性数据流(例如,并行属性位流)4201到420n。按照本发明的一个或多个实施例,并行属性位流模块410可能是,例如而非限制,用这里描述的方法或其它包含这些教义的任何方式来体现的软件或硬件模块。
如图15的进一步显示,并行属性数据流4201到420n被施加作为分析模块430的输入。分析模块430以在此所述的方式执行一个或多个在此所述的功能,例如而非限制,验证、解码和/或转码。作为响应,分析模块430生成并行属性数据流(例如,并行属性位流)4401到440m,也许还有检测属性的属性数据流450。如前面描述的,对于UTF-8到UTF-16转码的应用,n可能不等于m。此外,如本领域的技术人员可容易认识到的,属性数据流450可被用于例如而非限制地指示输入是否无效。按照本发明的一个或多个实施例,分析模块430可以是例如而非限制地,以在此所述的方式或其它包含了这些教义的任何方式来实现的软件或硬件模块。
如图15的进一步显示,并行属性数据流4401到440m被施加作为字符流生成器模块460的输入。作为响应,按照这里描述的本发明的一个或多个实施例,字符流生成器模块460生成字符流470。按照本发明的一个或多个实施例,字符流生成器模块460可以是例如而非限制地以在此所述的方式或其它包括这些教义的任何方式来实现的软件或硬件模块。如本领域的普通技术人员将容易认识到的,字符流470和/或属性数据流450被用于作为模块3000的字符流接收器模块480的输入,其中字符流接收器模块480是例如而非限制地以下各项的一部分:操作系统;库服务包;虚拟机;运行时环境;网络工具;xML处理器;办公应用——例如而非限制——字处理器、电子数据表、数据库或演示软件;数据库系统;便携式通信设备——例如而非限制——手机、个人数字助理或无线电子邮件设备;或文本获取系统。如本领域的普通技术人员可容易理解的,术语“作为输入施加”在最广泛的意义上用作同一位置处或分布式(如在系统和网络中)硬件或软件之间的传输。
尽管包括了本发明的教义的各种实施例被详细地在这里说明并描述,但本领域的技术人员可以简单地设计很多其它包括这些教义的变形后的实施例。例如,尽管提供的本发明各种实施例的描述使用了满块不变量,不难理解的是本发明并不仅限于这样的实现。事实上,包括利用部分块的各种实施例也在本发明的精神实质内。另外,本领域的普通技术人员可以按照前面提供的描述照常地而无需过多实验地使用部分块来简单地构建这样的实施例。
尽管各种使用并行位流的实施例在这里进行了描述,本领域的技术人员根据该教义也可构造采用由位对、半字节或其它数据单元组成的属性数据流的其它实施例。
此外,如本领域普通技术人员从以上详述可容易认识到的,本发明的一个或多个实施例被设计成改进文本处理系统的效率,使得吞吐量增加,硬件需求减少和/或节省能源消耗。例如,对于一固定硬件配置,本发明的一个或多个实施例可以用来增加该配置上文本处理应用的吞吐量。然而,如果吞吐量需求是固定并且已知的,则可以应用本发明的一个或多个实施例以通过减少处理器总的数量和/或每个处理器必需满足的性能规格来减少系统成本。作为选择,如果主要约束是能量消耗,则本发明的一个或多个实现可以通过减少在高功率操作模式下花费的时间、允许低功率处理器作为替代和/或减少所需处理器的总量来实现效率。
Claims (48)
1.一种用于处理字符流的方法,包括:
响应于所述字符流形成多个并行属性位流,其中所述并行属性位流中的每一个包括与该字符流的数据值相关联的一个特定属性的位值;以及
处理所述一个或多个并行属性位流,
其中,所述并行属性位流中的每一个对应于字符流代码单元内的单个位的位置或其逻辑组合。
2.如权利要求1所述的方法,其特征在于,所述处理包括:
通过对所述并行属性位流中的一个或多个进行操作形成一个或多个进一步的属性流。
3.如权利要求1所述的方法,其特征在于,所述处理包括同时对所述一个或多个并行属性位流中的多个位进行操作。
4.如权利要求3所述的方法,其特征在于,所述对多个位进行操作包括使用同时指令多数据(SIMD)计算机操作。
5.如权利要求2所述的方法,其特征在于,所述操作包括对所述并行属性位流中的一个或多个执行布尔操作和/或移位操作。
6.如权利要求1所述的方法,其特征在于:
所述字符流是由UTF-8格式(UTF-8)的8位代码单元的流构成的Unicode字符流;并且
所述形成包括形成8个并行属性位流u8bit0(i)到u8bit7(i),其中每个位流对应于所述字符流的相继代码单元内的单个位的位置,
其中“i”代表代码单元的位置。
7.如权利要求6所述的方法,其特征在于,所述形成包括:
执行三次二进制分割变换,其中每次变换将所述字符流分割成两个半长的输出流,从而三次这样的二进制分割变换生成各自为所述字符流长度的八分之一的八个位流。
8.如权利要求6所述的方法,其特征在于,所述处理包括:
通过对所述8个并行属性位流u8bit0(i)到u8bit7(i)执行布尔和/或移位操作形成标识UTF-8违规的UTF-8有效性属性位流u8invalid(i)。
9.如权利要求8所述的方法,其特征在于,还包括:
使用位检测设施分析u8invalid(i)以检测差错;以及
如果检测到差错则生成出错信号。
10.如权利要求8所述的方法,其特征在于,所述形成u8invalid(i)包括形成以下并行属性位流:
u8prefix(i)=u8bit0(i)∧u8bit1(i)
u8prefix3or4(i)=u8prefix(i)∧u8bit2(i)
u8prefix4(i)=u8prefix3or4(i)∧u8bit3(i)
u8badpfx4(i)=u8prefix4(i)∧
(u8bit4(i)∨u8bit5(i)∧(u8bit6(i)∨u8bit7(i)))
u8scope22(i)=u8prefix2(i-1)
u8scope32(i)=u8prefix3(i-1)
u8scope33(i)=u8prefix3(i-2)
u8scope42(i)=u8prefix4(i-1)
u8scope43(i)=u8prefix4(i-2)
u8scope44(i)=u8prefix4(i-3)
anyscope(i)=u8scope22(i)∨u8scope32(i)∨u8scope33(i)∨
u8scope42(i)∨u8scope43(i)∨u8scope44(i)
u8mismatch(i)=anyscope(i)⊕u8suffix(i)
u8invalid(i)=u8badpfx2(i)∨u8badpfx4(i)∨u8mismatch(i)∨
u8badsfx32(i)∨u8badsfx42(i)。
11.如权利要求10所述的方法,其特征在于,所述并行属性位流中的一个或多个是利用SIMD计算机指令来形成的。
12.如权利要求1所述的方法,其特征在于:
所述字符流是由UTF-16格式的16位代码单元的流构成的Unicode字符流;
所述形成包括形成16个并行属性位流u16bit0(i)到u16bit15(i),其中每个位流对应于所述字符流的相继两对代码单元内的单个位的位置;以及
所述处理包括通过对所述16个并行属性位流u16bit0(i)到u16bit15(i)执行逻辑操作形成标识UTF-16违规的UTF-16有效性属性位流u16invalid(i);其中u16invalid(i)被用来验证所述UTF-16字符流,
其中“i”代表代码单元的位置。
13.如权利要求12所述的方法,其特征在于,还包括:
利用位检测设施分析u16invalid(i)以检测差错;以及
如果检测到差错则生成出错信号。
15.如权利要求14所述的方法,其特征在于,所述并行属性位流中的一个或多个是利用SIMD计算机指令来形成的。
16.如权利要求1所述的方法,其特征在于:
所述字符流是由UTF-32格式的32位代码单元的流构成的Unicode字符流;
所述形成包括形成21个并行属性位流u32bit11(i)到u32bit31(i),其中每个位流对应于所述字符流的有效位;以及
所述处理包括通过对并行属性位流u32bit11(i)到u32bit31(i)中的若干个属性位流执行逻辑操作形成标识UTF-32违规的UTF-32有效性属性位流u32invalid(i);其中u32invalid(i)被用于验证所述UTF-32字符流,
其中“i”代表代码单元的位置。
17.如权利要求16所述的方法,其特征在于,还包括:
利用位检测设施分析u32invalid(i)以检测差错;以及
如果检测到差错则生成出错信号。
19.如权利要求18所述的方法,其特征在于,所述并行属性位流中的一个或多个是利用SIMD计算机指令来形成的。
20.一种用于将由UTF-8格式(UTF-8)的8位代码单元的流构成的Unicode字符流解码的方法:
形成8个并行属性位流u8bit0(i)到u8bit7(i),其中每个位流对应于所述字符流的相继代码单元内的单个位的位置,
其中“i”代表代码单元的位置。
通过对所述8个并行属性位流u8bit0(i)到u8bit7(i)执行布尔和/或移位操作形成8个并行属性位流cpbit0(i)到cpbit7(i),其中每个位流对应于取为表示所述UTF-8字符流的代码点值的字节的相继代码点内的单个位的位置。
21.如权利要求20所述的解码方法,其特征在于,形成cpbit0(i)到cpbit7(i)包括形成以下并行属性位流:
u8prefix(i)=u8bit0(i)∧u8bit1(i)
u8prefix3or4(i)=u8prefix(i)∧u8bit2(i)
u8prefix4(i)=u8prefix3or4(i)∧u8bit3(i)
u8scope22(i)=u8prefix2(i-1)
u8scope32(i)=u8prefix3(i-1)
u8scope33(i)=u8prefix3(i-2)
u8scope42(i)=u8prefix4(i-1)
u8scope43(i)=u8prefix4(i-2)
u8scope44(i)=u8prefix4(i-3)
u8lastsuffix(i)=u8scope22(i)∨u8scope33(i)∨u8scope44(i)
u8lastbyte(i)=u8lastsuffix(i)∨u8unibyte(i)
u8butlastsuffix(i)=u8scope32(i)∨u8scope43(i)
u8butlastbyte(i)=u8butlastsuffix(i)∨u8prefix2(i)
cpbit0(i)=(u8lastsuffix(i)∧u8bit6(i-1))∨
(u8butlastsuffix(i)∧u8bit4(i-1))
cpbit1(i)=(u8lastsuffix(i)∧u8bit7(i-1))∨
(u8butlastsuffix(i)∧u8bit5(i-1))∨
(u8unibyte(i)∧u8bit1(i))
cpbit2(i)=(u8lastbyte(i)∧u8bit2(i))∨
(u8butlastsuffix(i)∧u8bit6(i-1))
cpbit3(i)=(u8lastbyte(i)∧u8bit3(i))∨
(u8butlastsuffix(i)∧u8bit7(i-1))∨
(u8scope42(i)∧u8bit5(i-1))
cpbit4(i)=(u8lastbyte(i)∧u8bit4(i))∨
(u8butlastsuffix(i)∧u8bit2(i))∨
(u8scope42(i)∧u8bit6(i-1))
cpbit5(i)=(u8lastbyte(i)∧u8bit5(i))∨
(u8butlastbyte(i)∧u8bit3(i))∨
(u8scope42(i)∧u8bit7(i-1))
cpbit6(i)=(u8lastbyte(i)∧u8bit6(i))∨
(u8butlastbyte(i)∧u8bit4(i))∨
(u8scope42(i)∧u8bit2(i))
cpbit7(i)=(u8lastbyte(i)∧u8bit7(i))∨
(u8butlastbyte(i)∧u8bit5(i))∨
(u8scope42(i)∧u8bit3(i))。
22.如权利要求21所述的方法,其特征在于,还包括将所述cpbit0(i)至cpbit7(i)位流置换成字节流。
23.如权利要求22所述的方法,其特征在于,所述置换步骤包括执行三次二进制合并变换,其中每次变换组合两个输入流以生成一个两倍长的输出流,从而三次这样的二进制合并变换生成一个字节流。
24.如权利要求23所述的方法,其特征在于,所述并行属性位流中的一个或多个是利用SIMD计算机指令来形成的。
25.一种用于将由UTF-8格式(UTF-8)的8位代码单元的流构成的Unicode字符流转码为UTF-16表示的方法,包括:
响应于所述字符流形成多个并行属性位流,其中所述并行属性位流中的每一个包括与所述字符流的数据值相关联的一个特定属性的位值;
通过对所述并行属性位流中的一个或多个进行操作来形成一个或多个进一步的属性流来执行所述转码,
其中,所述并行属性位流中的每一个对应于字符流代码单元内的单个位的位置或其逻辑组合。
26.如权利要求25所述的方法,其特征在于,所述转码包括同时对所述一个或多个并行属性位流中的多个位进行操作。
27.如权利要求26所述的方法,其特征在于,所述对多个位进行操作包括使用同时指令多数据(SIMD)计算机操作。
28.如权利要求27所述的方法,其特征在于,所述操作包括对所述并行属性位流中的一个或多个执行布尔操作和/或移位操作。
29.一种用于处理字符流的模块装置,包括:
字符流施加模块;
并行属性位流模块;
分析模块;其中
所述字符流施加模块将接收自所述模块的字符流作为输入施加于所述并行属性位流模块;
所述并行属性位流模块形成多个并行属性位流,其中所述并行属性位流中的每一个包括与所述字符流的数据值相关联的一个特定属性的位值;以及
所述分析模块处理所述并行属性位流,
其中,所述并行属性位流中的每一个对应于字符流代码单元内的单个位的位置或其逻辑组合。
30.如权利要求29所述的模块装置,其特征在于,还包括字符流生成器,其中:
所述分析模块输出一个或多个并行属性位流;以及
所述字符流生成器生成字符流。
31.如权利要求30所述的模块装置,其特征在于,还包括字符流接收器,其中:
所述字符流作为输入被施加于所述字符流接收器。
32.如权利要求29所述的模块装置,其特征在于,所述分析模块验证所述字符流。
33.如权利要求29所述的模块装置,其特征在于,所述分析模块将所述字符流解码。
34.如权利要求29所述的模块装置,其特征在于,所述分析模块对所述字符流进行转码。
35.如权利要求31所述的模块装置,其特征在于,所述模块装置是操作系统或库服务包。
36.如权利要求31所述的模块装置,其特征在于,所述模块装置是网络工具。
37.如权利要求31所述的模块装置,其特征在于,所述模块装置是字处理器。
38.如权利要求31所述的模块装置,其特征在于,所述模块装置是XML处理器。
39.如权利要求31所述的模块装置,其特征在于,所述模块装置是包括字处理器、电子数据表软件、数据库软件、或演示软件中的一个或多个的办公应用。
40.如权利要求31所述的模块装置,其特征在于,所述模块装置是包括手机、个人数字助理、或无线电子邮件设备中的一个或多个的便携式通信设备。
41.如权利要求31所述的模块装置,其特征在于,所述模块装置是虚拟机或运行时环境。
42.如权利要求31所述的模块装置,其特征在于,所述模块装置是数据库系统。
43.如权利要求31所述的模块装置,其特征在于,所述模块装置是文本获取系统。
44.一种用于处理字符流的方法,包括:
响应于所述字符流形成多个并行属性位流,其中所述并行属性位流中的每一个包括与所述字符流的数据值相关联的一个特定属性的位值并且其中所述并行属性位流的数目使得所述字符流的代码单元中的每个位有一个位流;以及
处理所述一个或多个并行属性位流,
其中,所述并行属性位流中的每一个对应于字符流代码单元内的单个位的位置或其逻辑组合。
45.如权利要求44所述的方法,其特征在于,所述处理包括:
通过对所述并行属性位流中的一个或多个进行操作形成一个或多个进一步的属性流。
46.如权利要求44所述的方法,其特征在于,所述处理包括同时对所述一个或多个并行属性位流中的多个位进行操作。
47.如权利要求46所述的方法,其特征在于,所述对多个位操作包括使用同时指令多数据(SIMD)计算机操作。
48.如权利要求46所述的方法,其特征在于,所述操作包括对所述并行属性位流中的一个或多个执行布尔操作和/或移位操作。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US69268305P | 2005-06-21 | 2005-06-21 | |
US60/692,683 | 2005-06-21 | ||
PCT/CA2006/001003 WO2006136015A1 (en) | 2005-06-21 | 2006-06-16 | Method and apparatus for processing character streams |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101243441A CN101243441A (zh) | 2008-08-13 |
CN101243441B true CN101243441B (zh) | 2012-07-18 |
Family
ID=37570061
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2006800302950A Expired - Fee Related CN101243441B (zh) | 2005-06-21 | 2006-06-16 | 用于处理字符流的方法与设备 |
Country Status (4)
Country | Link |
---|---|
US (4) | US7400271B2 (zh) |
EP (1) | EP1899858A1 (zh) |
CN (1) | CN101243441B (zh) |
WO (1) | WO2006136015A1 (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110597644A (zh) * | 2019-09-10 | 2019-12-20 | 深圳市元征科技股份有限公司 | 数据流传输方法、传输装置、电子设备及存储介质 |
Families Citing this family (39)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8392174B2 (en) * | 2006-08-07 | 2013-03-05 | International Characters, Inc. | Method and apparatus for lexical analysis using parallel bit streams |
US8271263B2 (en) * | 2007-03-30 | 2012-09-18 | Symantec Corporation | Multi-language text fragment transcoding and featurization |
US20090070761A1 (en) * | 2007-09-06 | 2009-03-12 | O2Micro Inc. | System and method for data communication with data link backup |
US8156432B2 (en) * | 2007-11-14 | 2012-04-10 | Zih Corp. | Detection of UTF-16 encoding in streaming XML data without a byte-order mark and related printers, systems, methods, and computer program products |
US8341165B2 (en) * | 2007-12-03 | 2012-12-25 | Intel Corporation | Method and apparatus for searching extensible markup language (XML) data |
US8127223B2 (en) * | 2008-01-23 | 2012-02-28 | Mellmo Inc. | User interface method and apparatus for data from data cubes and pivot tables |
CN108197470A (zh) * | 2008-10-20 | 2018-06-22 | 王英 | 快速特征码扫描 |
CN103793522B (zh) * | 2008-10-20 | 2018-01-12 | 王英 | 快速特征码扫描 |
US20100257438A1 (en) * | 2009-04-07 | 2010-10-07 | Mellmo Inc. | User interface method and apparatus to display tabular source data in a small screen display area |
US7994949B2 (en) * | 2009-11-30 | 2011-08-09 | Red Hat, Inc. | Unicode-compatible entropy coding |
US8159374B2 (en) * | 2009-11-30 | 2012-04-17 | Red Hat, Inc. | Unicode-compatible dictionary compression |
EP2599316A4 (en) * | 2010-07-26 | 2017-07-12 | Associated Universities, Inc. | Statistical word boundary detection in serialized data streams |
CN102567293B (zh) * | 2010-12-13 | 2015-05-20 | 汉王科技股份有限公司 | 文本文件的编码格式探测方法和装置 |
TW201339861A (zh) | 2012-03-30 | 2013-10-01 | Ibm | 提供較小目標編碼空間之碼轉換的方法、電腦裝置與程式產品 |
US8903715B2 (en) * | 2012-05-04 | 2014-12-02 | International Business Machines Corporation | High bandwidth parsing of data encoding languages |
US20130325883A1 (en) * | 2012-06-01 | 2013-12-05 | Kelsey L. Bruso | Preserving data integrity across incompatible computer architectures |
CN103488617A (zh) * | 2012-06-11 | 2014-01-01 | 北京新媒传信科技有限公司 | 一种数据截取的方法和装置 |
US8943085B2 (en) * | 2012-10-05 | 2015-01-27 | Lsi Corporation | Start pointer tracking in NFAs |
CN103077159B (zh) * | 2012-12-31 | 2016-03-16 | 广州市动景计算机科技有限公司 | 网页文本压缩方法和装置 |
US9804840B2 (en) | 2013-01-23 | 2017-10-31 | International Business Machines Corporation | Vector Galois Field Multiply Sum and Accumulate instruction |
US9778932B2 (en) | 2013-01-23 | 2017-10-03 | International Business Machines Corporation | Vector generate mask instruction |
US9715385B2 (en) | 2013-01-23 | 2017-07-25 | International Business Machines Corporation | Vector exception code |
US9471308B2 (en) | 2013-01-23 | 2016-10-18 | International Business Machines Corporation | Vector floating point test data class immediate instruction |
US9513906B2 (en) | 2013-01-23 | 2016-12-06 | International Business Machines Corporation | Vector checksum instruction |
US9823924B2 (en) * | 2013-01-23 | 2017-11-21 | International Business Machines Corporation | Vector element rotate and insert under mask instruction |
US9626184B2 (en) * | 2013-06-28 | 2017-04-18 | Intel Corporation | Processors, methods, systems, and instructions to transcode variable length code points of unicode characters |
US10663609B2 (en) * | 2013-09-30 | 2020-05-26 | Saudi Arabian Oil Company | Combining multiple geophysical attributes using extended quantization |
US9124295B2 (en) | 2013-11-14 | 2015-09-01 | Nicolas Thomas Mathieu Dupont | System and method for data compression and transmission |
US10028277B2 (en) | 2013-11-20 | 2018-07-17 | Cyborg Inc. | Variable frequency data transmission |
US10120682B2 (en) * | 2014-02-28 | 2018-11-06 | International Business Machines Corporation | Virtualization in a bi-endian-mode processor architecture |
US9378654B2 (en) | 2014-06-23 | 2016-06-28 | D2L Corporation | System and method for rendering music |
US10733199B2 (en) | 2014-11-05 | 2020-08-04 | International Business Machines Corporation | Optimizing data conversion using pattern frequency |
US10489155B2 (en) * | 2015-07-21 | 2019-11-26 | Qualcomm Incorporated | Mixed-width SIMD operations using even/odd register pairs for wide data elements |
CN107103253B (zh) * | 2017-04-28 | 2020-03-31 | 哈尔滨理工大学 | 基于mpi的ac串匹配并行算法的磁盘敏感信息扫描系统 |
CN107679023A (zh) * | 2017-09-27 | 2018-02-09 | 武汉颂大教育科技股份有限公司 | 一种联合采用多种转换技术的高兼容性电子文档转换方法 |
US10651871B1 (en) | 2019-07-10 | 2020-05-12 | Citrix Systems, Inc. | Real-time history-based byte stream compression |
CN110716709B (zh) * | 2019-09-12 | 2021-10-29 | 无锡江南计算技术研究所 | 支持进位借位正常传递的多精度大整数算术运算加速单元 |
CN111209723A (zh) * | 2020-01-13 | 2020-05-29 | 中孚安全技术有限公司 | 一种解析Office二进制格式并提取文档属性文字的方法及系统 |
CN112217827B (zh) * | 2020-10-15 | 2022-10-28 | 国网安徽省电力有限公司合肥供电公司 | 一种无限制类型文件穿越隔离发送数据的方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6737994B2 (en) * | 2002-05-13 | 2004-05-18 | International Business Machines Corporation | Binary-ordered compression for unicode |
CN1520040A (zh) * | 2003-01-24 | 2004-08-11 | ������������ʽ���� | 字符串处理装置、字符串处理方法和成像装置 |
CN1575464A (zh) * | 1999-06-18 | 2005-02-02 | 奔流系统公司 | 利用事务语义法分段和处理连续数据流 |
CN1620819A (zh) * | 2001-10-17 | 2005-05-25 | 皇家飞利浦电子股份有限公司 | 改进的可变长度解码器 |
Family Cites Families (22)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US184480A (en) * | 1876-11-21 | Improvement in potato-diggers | ||
US6205492B1 (en) * | 1997-04-04 | 2001-03-20 | Microsoft Corporation | Method and computer program product for interconnecting software drivers in kernel mode |
US6049869A (en) | 1997-10-03 | 2000-04-11 | Microsoft Corporation | Method and system for detecting and identifying a text or data encoding system |
US6208345B1 (en) * | 1998-04-15 | 2001-03-27 | Adc Telecommunications, Inc. | Visual data integration system and method |
US6438516B1 (en) | 1998-12-07 | 2002-08-20 | International Business Machines Corporation | Method and apparatus for optimizing unicode composition and decomposition |
US6801938B1 (en) * | 1999-06-18 | 2004-10-05 | Torrent Systems, Inc. | Segmentation and processing of continuous data streams using transactional semantics |
US6622239B1 (en) | 1999-06-25 | 2003-09-16 | International Business Machines Corporation | Method, system and computer program product for optimization of single byte character processing employed within a multibyte character encoding scheme |
US9053500B2 (en) * | 1999-06-30 | 2015-06-09 | Blackboard Inc. | Internet-based education support system and method with multi-language capability |
US6763499B1 (en) | 1999-07-26 | 2004-07-13 | Microsoft Corporation | Methods and apparatus for parsing extensible markup language (XML) data streams |
US6446198B1 (en) | 1999-09-30 | 2002-09-03 | Apple Computer, Inc. | Vectorized table lookup |
KR100856149B1 (ko) * | 1999-11-26 | 2008-09-03 | 네테카 인코포레이티드 | 전자 메일 서버 및 전자 메일 통신을 용이하게 하기 위한 방법 |
US6772413B2 (en) | 1999-12-21 | 2004-08-03 | Datapower Technology, Inc. | Method and apparatus of data exchange using runtime code generator and translator |
US6782380B1 (en) | 2000-04-14 | 2004-08-24 | David Victor Thede | Method and system for indexing and searching contents of extensible mark-up language (XML) documents |
US6892377B1 (en) * | 2000-12-21 | 2005-05-10 | Vignette Corporation | Method and system for platform-independent file system interaction |
US20040044791A1 (en) * | 2001-05-22 | 2004-03-04 | Pouzzner Daniel G. | Internationalized domain name system with iterative conversion |
US6707400B2 (en) | 2001-08-02 | 2004-03-16 | Telefonaktiebolaget Lm Ericsson (Publ) | Method and apparatus for fast longest match search |
US6883007B2 (en) * | 2001-08-16 | 2005-04-19 | International Business Machines | Meta normalization for text |
US20050147079A1 (en) * | 2001-12-06 | 2005-07-07 | Ismail Lakkis | Systems and methods for implementing an open loop architecture in a wireless communication network |
US20040117499A1 (en) * | 2002-12-13 | 2004-06-17 | Bo Liu | System and method for detection of delineation of data units for a communication element |
US7236980B2 (en) * | 2003-02-28 | 2007-06-26 | Microsoft Corporation | Unicode normalization |
US20050049997A1 (en) * | 2003-08-27 | 2005-03-03 | Microsoft Corporation | Method for persisting a unicode compatible offline address |
US6861963B1 (en) | 2003-11-07 | 2005-03-01 | Microsoft Corporation | Encoding conversion fallback |
-
2006
- 2006-06-15 US US11/455,310 patent/US7400271B2/en not_active Expired - Fee Related
- 2006-06-16 CN CN2006800302950A patent/CN101243441B/zh not_active Expired - Fee Related
- 2006-06-16 WO PCT/CA2006/001003 patent/WO2006136015A1/en active Application Filing
- 2006-06-16 EP EP06761070A patent/EP1899858A1/en not_active Withdrawn
-
2008
- 2008-07-08 US US12/217,703 patent/US7728738B2/en not_active Expired - Fee Related
-
2010
- 2010-05-26 US US12/788,086 patent/US7898441B2/en not_active Expired - Fee Related
-
2011
- 2011-02-28 US US13/036,082 patent/US8077061B2/en not_active Expired - Fee Related
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1575464A (zh) * | 1999-06-18 | 2005-02-02 | 奔流系统公司 | 利用事务语义法分段和处理连续数据流 |
CN1620819A (zh) * | 2001-10-17 | 2005-05-25 | 皇家飞利浦电子股份有限公司 | 改进的可变长度解码器 |
US6737994B2 (en) * | 2002-05-13 | 2004-05-18 | International Business Machines Corporation | Binary-ordered compression for unicode |
CN1520040A (zh) * | 2003-01-24 | 2004-08-11 | ������������ʽ���� | 字符串处理装置、字符串处理方法和成像装置 |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110597644A (zh) * | 2019-09-10 | 2019-12-20 | 深圳市元征科技股份有限公司 | 数据流传输方法、传输装置、电子设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN101243441A (zh) | 2008-08-13 |
US8077061B2 (en) | 2011-12-13 |
US20110140936A1 (en) | 2011-06-16 |
EP1899858A1 (en) | 2008-03-19 |
WO2006136015A1 (en) | 2006-12-28 |
US7728738B2 (en) | 2010-06-01 |
US20080272939A1 (en) | 2008-11-06 |
US20060284745A1 (en) | 2006-12-21 |
US20100302076A1 (en) | 2010-12-02 |
US7400271B2 (en) | 2008-07-15 |
US7898441B2 (en) | 2011-03-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101243441B (zh) | 用于处理字符流的方法与设备 | |
US9218319B2 (en) | Method and apparatus for regular expression processing with parallel bit streams | |
US7783862B2 (en) | Method and apparatus for an inductive doubling architecture | |
US20080040345A1 (en) | Method and Apparatus for String Search Using Parallel Bit Streams | |
US8528000B2 (en) | Execution environment for data transformation applications | |
US20080033974A1 (en) | Method and Apparatus for XML Parsing Using Parallel Bit streams | |
Amiri et al. | SIMD programming using Intel vector extensions | |
CN111512292A (zh) | 用于可配置空间加速器中的非结构化数据流的装置、方法和系统 | |
CN111767080A (zh) | 用于可配置空间加速器中的操作的设备、方法和系统 | |
CN1933334B (zh) | 从比例二进制编码十进制转换到十进制浮点的系统和方法 | |
CN107861728A (zh) | 用于传统程序语言向现代程序语言转换的方法及其系统 | |
CN105247472A (zh) | 用于对统一码字符的可变长度代码点转码的处理器、方法、系统和指令 | |
CN103582883A (zh) | 具有组格式的可变长度数据的改进型编码和解码 | |
US9563534B1 (en) | Debugger display of vector register contents after compiler optimizations for vector instructions | |
TW201732734A (zh) | 用於加速圖形分析的設備及方法 | |
Cameron | u8u16–a high-speed UTF-8 to UTF-16 transcoder using parallel bit streams | |
Roy et al. | Interval stabbing on the automata processor | |
Gustafsson et al. | Bit-level binaries and generalized comprehensions in Erlang | |
Rozenberg | A computational model for analytic column stores | |
Masetti et al. | HUDDL for description and archive of hydrographic binary data | |
Herdy | s2k: A parallel language for streaming text extraction and transformations | |
JP2014167723A (ja) | 構造化電文処理方法 | |
Gustafsson et al. | Pour Some Sugar on Bits: Flexible Manipulation of Bit Streams in Erlang |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20120718 Termination date: 20180616 |
|
CF01 | Termination of patent right due to non-payment of annual fee |