首页> 中国专利> 使用SIMD指令的数据压缩和解压

使用SIMD指令的数据压缩和解压

摘要

本发明公开了使用SIMD指令的数值数据的压缩与解压。数值数据包括整型和浮点型样本。压缩支持是哪个编码模式:无损、固定速率和固定质量。用于压缩操作的SIMD指令可以包括衰减、微分计算、位打包以及形成压缩包,用于该包的报头产生,以及压缩数组的输出操作。用于解压的SIMD指令包括压缩数组输入操作、报头恢复、解码器控制、位解包、积分以及放大。压缩和解压可以被实施在使用SIMD指令的在微处理器、数字信号处理器、现场可编程门阵列、专用集成电路、片上系统或图像处理器。数值数据的压缩与解压可以减少存储、网络和存储瓶颈。该摘要并不用来限制权利要求中所述的本发明的保护范围。

著录项

  • 公开/公告号CN105264779A

    专利类型发明专利

  • 公开/公告日2016-01-20

    原文格式PDF

  • 申请/专利权人 阿尔特拉公司;

    申请/专利号CN201480005743.6

  • 发明设计人 阿尔伯特·W·魏格纳;

    申请日2014-01-22

  • 分类号H03M13/27(20060101);G06F9/38(20060101);

  • 代理机构11256 北京市金杜律师事务所;

  • 代理人酆迅

  • 地址 美国加利福尼亚

  • 入库时间 2023-12-18 13:43:06

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2019-06-07

    授权

    授权

  • 2016-02-17

    实质审查的生效 IPC(主分类):H03M13/27 申请日:20140122

    实质审查的生效

  • 2016-01-20

    公开

    公开

说明书

技术领域

本发明涉及计算机领域,尤其涉及一种使用单指令多数据(single instructionmultipledata,SIMD)SIMD指令的数据压缩和解压。

背景技术

此处描述的技术关于数值数据的编码与解码,使用用于在计算应 用中编码的数据的效率存储和/或传输特定的SIMD指令。

在当前的高性能计算应用中,通常需要在多个处理器核心之间或 在处理器核心和存储器之间传输大量的数值数据。在多个处理器核心 之间或在核心和存储器之间接口的有限的传输速率能产生对于所有 数据处理速度和性能的瓶颈。在数据丰富的应用中,数值数据的存储 对存储资源和存储设备提出了挑战。减少数值数据的数据传输和存储 容量的指令能够提升计算系统的效率、经济性和性能。数值数据的压 缩可以减少这些需求,然而却需要消耗额外的计算成本。在具有大量 数值数据的应用中,该计算上有效的压缩是尤其重要的,以最小化对 计算资源的需求。

在当前的微处理器架构中,SIMD处理执行由多数据元素或操作 数上的单指令所指示的相同操作。在多操作数上,SIMD操作被并行 而不是循序地执行,从而加速了计算。SIMD实施的优点包括减少的 循序处理的处理时间、降低的指令的数目和更高的处理效率。SIMD 技术的实现可以从多个公司得到,包括:

●Intel和AMD,其SIMD指令集通常称作MMX、SSE和 AVX,

●先进RISC机器(ARM),其SIMD指令集被称作Neon,

●IBM、Freescale和Apple,其SIMD指令集被称作AltiVec。

上述的SIMD实现方式的列表并非用来详尽列出而是说明SIMD 处理已经被广泛地整合进微处理器架构中。本发明的实施例使用的 SIMD结构,并定义将在新SIMD指令中实施的功能,以加速每个指 令的多个数字样本的编码与解码的处理。

共有的专利和应用描述了多种压缩技术,其可应用于数值数据或 信号样本的固定点、或整数表示。这些包括US5,839,100(‘100专利), 由Wegener提交的“样本数据信号的无损或限损压缩”、于1998年 11月17日授权。共有的美国专利7,009,533(‘533专利),由Wegener 提交的名为“带限信号的自适应压缩和解压”,于2006年3月7日 授权,其在这里被引用并描述是可配置的基于信号数据的特性与测量 相关的信号特征压缩的压缩算法。共有的美国专利8,301,803(‘803专 利),由Wegener提交的名为“信号数据的块浮点型压缩”,于2011 年4月28日授权,其在这里被引用并描述了用于整型样本的块浮点 型编码器和解码器。共有的美国专利申请号13/534,330(‘330申请), 于2012年6月27日申请,由Wegener提交的名为“浮点型数据的计 算高效压缩”,其在这里被引用并描述了通过处理浮点型格式的指数 值和尾数值来进行直接压缩浮点型数据的算法。共有的专利申请号 13/617,061(‘061申请),于2012年9月14日申请,由Wegener提交 的名为“转换和压缩的浮点型和整型数据”,其在这里被引用并描述 用于将浮点型数据转换为整型数据和整型数据的压缩算法。这些申请 所描述的压缩和解压的操作的至少一部分可以使用本发明所描述的 SIMD技术来实施。

共有的专利申请号12/891312(‘312申请),由Wegener提交的名 为“使用压缩和解压的增强型多处理器波形数据交换”公告号为 2011-0078222,公开于2011年3月11日,其在此被引用做为参照,其 描述了在具有多核处理器的计算系统中的可配置的固定点或整型数 值数据类型。在多核处理环境中,输入、中间的以及输出波形数据经 常在核心之间和在核心与存储设备之间交换。该‘312申请描述了在每 个核心处的可配置的压缩器或解压器,它们能够压缩/解压整型的或数 值的波形数据。该‘312申请描述了在存储控制器处的可配置的压缩/ 解压以压缩/解压在压缩包中向片外存储器传输或自片外存储器传输 的整形或数字波形数据。‘312申请的可配置的压缩器和解压器的至少 一些操作可以使用本说明书中所描述的SIMD技术来实现。

共有的专利申请号13/617,205(‘205申请),申请于2012年9月14, 由Wegener提交的名为“用于直接内存存取传输的数据压缩”,在这里 通过引用被参考,描述了通过DMA描述符提供用于压缩的数据和参 数的直接内存存取(DMA)传输的压缩。共有的专利申请号13/616, 898(‘898申请),申请于2012年9月14日,由Wegener提交的名为“包 括数据压缩API的处理系统和方法”,其通过引用被参考,描述了包括 操作以及该操作的参数的应用编程接口,该接口用于数据压缩和解压 联连同在存储系统的存储元件间的移动数据。这里描述的SIMD指令 可以被实施以用于’205和’898申请中所述的压缩和解压操作。

为了更好地满足很多计算应用中的高速传输数据、减少内存使用 和最小化计算的要求,需要使用SIMD技术的数值数据的计算有效率 的压缩和解压。

发明内容

由对数值数据进行SIMD实现的压缩而获得的计算效率可以提供 更有效的数据传输和内存利用。

在一方面,数值数据压缩可以使计算机系统的资源来实现。该计 算机系统的数据处理器可以执行SIMD指令,该指令实施用于数据样 本的压缩操作的至少一部分。该操作包括为对应于数据样本编码组的 第一寄存器的操作数确定最大指数值,对所述操作数的位进行交织以 产生多个半字节以存储在第二寄存器中,其中所述位基于各操作数中 的所述位的位值被映射至给定的半字节。半字节的子集被选自所述第 二寄存器中的多个半字节中,其中该子集的半字节的数目取决于最大 指数值。半字节子集包括所述操作数的交织的尾数位。所述半字节子 集的交织的尾数位被打包进压缩的数据包,其中所打包的交织的尾数 位表示用于数据样本的所述编码组的压缩的数据。

指数令牌可以被产生以表示最大指数值、当前编码组和之前编码 组的最大指数值之间的指数差异、或指数差异对。所述指数令牌被存 储在所压缩的数据包中。

一方面,数据样本可以为第一寄存器提供操作数。在另外的方面, 冗余去除操作可以被应用至数据样本,并且所得到的样本被作为操作 数提供至所述第一寄存器。冗余去除操作可以包括计算数据样本的一 阶或更高阶微分和/或衰减数据样本。冗余去除操作中的一个或多个可 以使用SIMD指令和寄存器实施。

在另一方面,压缩数据的解压可以使用计算机资源来实施。该计 算机系统的数据处理器可以执行SIMD指令,该指令实施用于压缩的 数据样本的解压操作的至少一部分。存储在压缩数据包中的压缩数据 包括用于多个编码组的指数令牌和打包的交织尾数位。该操作包括将 多个压缩数据位子压缩数据包传送至解码位寄存器。为了处理该指数 令牌,该操作包括提取和解码来自解码位寄存器以产生至少一个解码 的指数值,其中,每个解码指数值对应于特定的编码组。为了处理该 打包的交织的尾数位,该操作包括将压缩数据位的一部分自解码位寄 存器传输至打包的尾数寄存器,该部分包括对应于特定编码组的打包 的交织尾数位,将半字节子集自打包尾数寄存器传送至分级寄存器中 的第一半字节子集,并且将填充值插入至分级寄存器中的第二半字节 子集。该解码的指数值指示了来自打包尾数寄存器的子集中的半字节 数目,形成分寄存器中的第一子集。将分级寄存器中的半字节的位进 行反交织产生多个操作数以存储于第一寄存器。给定的半字节的反交 织映射位取决于各操作数中的位的位值。所得到的操作数具有数据处 理器所使用的数据格式。

在一方面,所得到的操作数表示解压的数据样本。杂技另一方面, 信号再生处理被用至所述操作数以产生解压的数据样本。信号再生操 作可以包括计算一阶或多阶积分和/或放大该操作数。冗余去除操作中 的一个或多个可以使用SIMD指令和寄存器而被实施。

可以通过下面的附图、详细的说明以及权利要求认识到本发明的 其它方面和优点。

附图说明

图1为用于实施压缩操作的逻辑资源的模块图;

图2为用于实施解压操作的逻辑资源的模块图;

图3描述了SIMD寄存器和操作的示例;

图4描述了依据优选实施例的可用于样本序列减法运算的SIMD 寄存器架构;

图5描述了依据优选实施例的积分样本序列的SIMD操作;

图6描述了依据优选实施例的图4的DERIV指令的扩展容量;

图7描述了DERIV指令,该指令隐式地指示了其中存储有早前 样本x(-1)...x(-4)的SIMD寄存器;

图8描述了可替换的DERIV指令,该指令明确地地指示了其中 存储有早前样本x(-1)...x(-4)的SIMD寄存器;

图9描述了使用两个或更多个DERIV指令的更高阶微分(二次 微分,三次微分等等)的计算;

图10描述了确定用于数值数据的两个补码表示的指数;

图11描述了用于确定四个SIMD操作数的最大指数的两个指令 序列;

图12描述了用于确定SIMD操作数的最大指数的单指令;

图13描述了依据一实施例的半字节交织器;

图14描述了当操作数为有符号的两个补码整型时交织和选择的 一个示例;

图15描述了当操作数为单精度浮点型样本时交织和选择的一个 示例;

图16描述了用于压缩的数据包的一个配置;

图17描述了用于压缩的数据包的指数令牌和尾数令牌的另一配 置;

图18描述了使用SIMD寄存器和操作的压缩器的优选实施例;

图19示出了用于在指数令牌和指数差值或最大指数值之间的映 射的指数令牌产生器的优选指数编码表;

图20描述了编码的最后一级的编码的存储打包器的操作,;

图21描述了用于将打包的输出字写至打包阵列的操作;

图22描述了使用SIMD指令序列来对包含编码的(压缩的)整 型或浮点型样本的打包阵列进行解码的位解包器的操作;

图23描述了依据优选实施例的位收件器的操作;

图24描述了用于包报头的配置;

图25描述了指数解码器的模块图;

图26示出了用于指数解码器的操作的指数令牌解码表;

图27描述了尾数解包器的功能;

图28描述了整型符号扩展器的操作;

图29描述了浮点型尾数填充数的操作;

图30描述了半字节解交织器的操作;

图31提供了用于对4N整型或浮点型样本进行编码的程序的伪代 码SIMD指令的示例;

图32提供了用于将压缩的数据包解码至重构的4N整型或浮点型 样本的程序的伪代码SIMD指令的示例;

图33进一步描述了宏V_INTEG_N的细节;

图34描述了用于实现无损、固定速率或固定质量编码操作的编 码功能的额外指令;

图35示出了用于在固定速率操作期间更新“atten”值的指令;

图36提供了用于SIMD编码指令的相关参照表;

图37提供了用于SIMD解码指令的相关参照表;

图38为适用于使用SIMD操作的来压缩和解压的示例的计算机 系统的模块图。

具体实施方式

本文描述的压缩和解压实施例可以包括使用数值格式来表示数 字的数据(这里称作数值数据)的多种计算架构。数值数据可以包括 不同位宽(譬如,8位、16位、32位、64位等等)的整型数据和不 同位宽(譬如,32位、64位、128位等等)的浮点型数据。该数值数 据可以由多种应用产生并且该计算架构可以是通用的或特别用于特 定的应用。该数值数据可以由来自物理进程的所检测到的数据,该数 据由计算机模拟或数据处理的中间值所产生。例如,该数值数据可以 源自模拟传感器信号,该模拟传感器信号是由模数转换器(ADC)转 换至数字信号,该数字信号的样本被一数值格式(通常为整型格式) 表示。另一示例中,该数字的数据可以是用于整形或浮点型格式的模 拟计算机图形图像的空间数据点。

图1为用于实施压缩操作的逻辑资源的模块图。这些资源可以被 实施为一个以上的硬件加速器,其具有通过软件实现的对应的库函数 来提供的API的参数。可替换地,图1中的资源的一些或全部可以被 实施为库函数中的软件。可替换地,图1中的一些或全部的资源可以 被实施为硬件加速器和软件的结合。压缩操作可以使用本文描述的 SIMD寄存器和指令。通常地,压缩资源包括预处理器模块50和压缩 器模块52,具有相关联的控制54。预处理器模块50适配多种不同的 数据类型,在此示例中,包括整型数据、浮点型数据以及图像数据。 将要被预处理和压缩的数值数据是由线51所表示的输入,并且所压 缩的数据包是由线60所表示的输出。在硬件加速的环境中,线51和 60能够对应于片上寄存器或数据总线。在软件实施例中,线51和60 可以对应于由执行用于预处理和压缩的功能的处理器读取或写入的 数据。其他实施例可以包括预处理器50的部件的一部分或不包括预 处理器50。

预处理器模块50包括用于为压缩操作准备的输入数据的进程。 这些可以包括在具有硬件加速器的实施例中的数调整器62,该硬件加 速器被耦合至集成电路上的内总线。该数调整器62利用该内总线对 将被压缩为一个宽度的样本进行调整,这可以具有与样本宽度不同的 宽度。在一个示例中,内总线可以是DDR内存(DDR3)的64位宽 的接口,而将被压缩的样本是16位整型。在另一示例中,内总线可 以是128位宽总线,并且将被压缩的样本可以是32位的单精度的浮 点型数据。在压缩操作之前,浮点型样本通过浮点预处理器64直接 输入至选择器66或转换为整型格式。整型样本可以被直接转发至选 择器66。图像样本被转发至图像预处理器68,其可以执行图像文件 编码、颜色空间转换、颜色空间抽取等等多种独有的功能。对于一些 应用,该些样本能够被转发至中心频率估计器70,该中心频率估计器 70能够被用于从冗余去除算法得到的样本流,该算法取决于该样本流 的中心频率。如下所述的,中心频率估计器70的输出被应用至控制 模块54,其利用该中心频率为冗余去除器来产生“跨步”参数。

选择器66的输入包括浮点型预处理器64的输出、自数调整器 62直接转发的样本以及图像预处理器68的输出。选择器66基于由控 制模块54采用的参数选择合适的数据流,以给压缩器模块52提供输 入样本。该参数可以从与被转发至控制模块54兼容的API的DMA 描述符来确定。

压缩器模块52能够包括冗余去除器56和位打包器58。响应于 由控制模块54提供的参数,压缩器52能够实施能够被用于无损和有 损压缩的压缩算法。伴随冗余去除器56和位打包器58,报头产生器 72被包含以用在将在线60上转发的包组件,包括去除冗余后的被压 缩的数据。使用SIMD操作的冗余去除器56和位打包器58的实施例 被参照图18来描述。

控制模块54通过不同的逻辑模块来控制样本的路由并应用所需 的压缩参数至该不同的逻辑模块。该控制模块54还控制在一些压缩 模式中使用的衰减因素,以控制固定速率或固定质量的操作,例如, 基于关于被压缩的包的特性的统计反馈的操作。该控制模块54可以 接收DMA描述符,该DMA描述符可以提供例如用于选择器66的数 据类型参数和用于压缩器52的压缩参数。

图2为用于实施解压操作的逻辑资源的模块图。这些资源可以被 实现为硬件加速器,并具有通过软件实现的对应的库函数来提供的 API的参数。可替换地,图2中的这些资源的一些或全部可以被实现 为库文件中的软件,并且与兼容API的其他部件协调使用。可替换地, 该资源可以被实现为硬件加速器和软件的结合。通常,该解压资源与 参照图1中描述的压缩资源互补,并且包括解压器模块80、后处理器 模块82和控制模块90。将被解压的数据包是由线61表示的输入,并 且后处理的、解压的样本是由线99表示输出。在硬件加速环境下, 线61和99能够对应于片上寄存器或数据总线。在软件实施例中,线 61和99能够对应于由执行库函数的处理器读取或写入的数据。其他 实施例可以包括后处理器82的部件的一部分或不包括后处理器82。

解压器模块80包括扩展压缩数据以产生解压样本的位解压器84 和信号再生器86。解压参数可以由报头提取器88提取自包报头。控 制模块90将自包报头提取的参数提供至解压器88以配置解压操作。 DMA描述符或API可以提供额外的参数(譬如数据类型)至控制模 块90。这些可以被后处理器所使用以执行合适的操作。

该位解包器84和报头提取器88处理该压缩数据以分开报头位和 压缩数据位。该包的报头位被提取,并且被转发至控制模块90。控制 模块90使用来自提取的包报头的参数以控制信号再生器86。该位解 压器和报头提取器88的实施例被参照图22-24在下面更详细地描述。

信号再生器86执行与冗余去除器56相反的操作。使用SIMD操 作的信号再生器的实施例在下文被进一步详细地描述。信号再生器86 的输出被应用于后处理器模块82的相应的单元。取决于引入的数据 类型,信号再生器82的输出可以通过浮点型后处理器92或通过图像 后处理器94路由。浮点型后处理器92可以执行整型至浮点型格式的 转换,以反转由浮点型预处理器64执行的格式转换。选择器96由控 制逻辑90控制,响应于API参数、DMA描述符参数或由解压的包携 带的参数。在此示例中,选择器408的输入包括浮点型后处理器92 的输出、信号再生器86的直接输出或图像后处理器94的输出。该选 择器96的输出然后被应用于数调整器99(互补于以上在图1中所讨 论的数调整器),以在必要时形成输出99。

图1和2中示出的额外方面的部件在’061申请、’205申请和’898 申请中描述。根据图1、2中示出的部件的结构,使用SIMD寄存器 和指令的压缩和解压函数的独立部件的一些细节在下文进行描述。

图3描述了SIMD寄存器和指令的示例。SIMD寄存器100包括 N寄存器集合,该N寄存器集合包括做为由SIMD指令所指定的操作 的操作数的数值数据。该SIMD寄存器100的N寄存器集合保存相同 数据类型的数值数据。SIMD指令指定了将执行的操作以及SIMD寄 存器中的位将如何被积分为用于此操作的操作数。例如,SIMD寄存 器100包括N样本,譬如标记的样本A(0)110a、A(1)110b和A(N)110c。 因为SIMD寄存器100中的每个操作数110a、110b或110c具有Nv 位的长度,因此SIMD寄存器中的位的全部数目Nr是等于N*Nv。操 作数110a、110b或110c的数据类型的示例是8位有符号或无符号整 型、16位有符号或无符号整型、32位有符号或无符号整型、64位有 符号或无符号整型、32位浮点型样本或64位浮点型样本。SIMD寄 存器长度Nr的通常值是64位(例如,IntelMMX)、128位(例如, IntelSSE、SSE2、SSE3)以及256位(例如,IntelAVX)。操作数 长度Nv的通常值是8、16、32或64。SIMD寄存器长度Nr和操作数 长度Nv可以具有与这些通常值不同的其他值。SIMD寄存器中的操 作数N的数目是Nr/Nv。SIMD寄存器的变化和操作数的变化不限制 本发明的保护范围。

图3描述了对包含在两个SIMD寄存器中的操作数执行SIMD操 作102的示例。通常地,SIMD操作与被包含在SIMD寄存器中的多 个操作数并行地应用。数学的、逻辑的或其他运算符120被用于包含 在一个SIMD寄存器REG_A100a中的多个操作数和包含在第二SIMD 寄存器REG_B100b中的多个操作数,并且结果被存储在第三SIMD 寄存器REG_C100c。用于包含SIMD寄存器100a-c的处理器的程序 可以具有一指令,该指令用于操作SIMD源寄存器100a和100b、SIMD 目标寄存器100c和多个格式中之一的运算符120,其中“运算符”指 示了所需的数学的、逻辑的或其他操作(譬如,加法、减法、乘法、 除法等),并且“dType”指示了操作数的数据类型:

●REG_C=REG_A(operator,dType)REG_B

●opcode(REG_A,REG_B,REG_C,dType)

●opcode_dType(REG_A,REG_B,REG_C)

●(dType)REG_C=REG_A(operator)REG_B

上文的示例的指令格式描述了SIMD指令集可以使用以表示相 同的结果的一些可能的指令的句法。其他指令句法是可能的,并且不 限制本发明实施例中的SIMD指令的形式。发展SIMD架构的公司(譬 如,Intel、AMD、ARM等)经常开发他们自己的SIMD指令集句法, 或它们可能采用另外公司的指令句法。本发明中描述的多种SIMD操 作将采用下列指令句法:(dType)REG_C=REG_A(operator)REG_B, 其中“dType”指示了操作数110a、110b和110c的数据类型,并且 “operator”指示了所述的操作120。通常地,但不是独有,“operator” 具有特定的前缀、后缀或其他指示SIMD操作的标签。例如,Intel 的SIMD指令经常在操作数中包括字母“P”(用于并行)或“V”(用 于向量),以指示该指令是SIMD指令。虽然操作120可以是一元的 (一个输入值或操作数,产生一个输出值)、二元的(两个输入值或 操作数,产生一个输出值)或三元的(三个输入值或操作数,产生一 个输出值),但是其他操作数可以接收或要求其他数目的输入操作数, 并且可以产生其他数目的输出结果。操作数还可以包括输入样本可以 被读取的内存地址、或输出样本可以被写入的内存地址。SIMD指令 还可以包括立即值(即值在指令中被编码的操作数)和用于SIMD操 作的多种选项的选择。

例如,对于假发和减法运算符,SIMD寄存器REG_B100b中的 四个操作数[B(3)B(2)B(1)B(0)]被加至(+)SIMD寄存器REG_A100a中 的四个操作数[A(3)A(2)A(1)A(0)]或自SIMD寄存器REG_A100a中的 四个操作数[A(3)A(2)A(1)A(0)]减去,从而得到寄存器REG_C100c中 的结果[C(3)C(2)C(1)C(0)]。在这个示例中:

●对于加法(+):REG_C=REG_A+REG_B

●C(3)=A(3)+B(3)C(2)=A(2)+B(2)

●C(1)=A(1)+B(1)C(0)=A(0)+B(0)

●对于减法(-):REG_C=REG_A–REG_B

●C(3)=A(3)-B(3)C(2)=A(2)-B(2)

●C(1)=A(1)-B(1)C(0)=A(0)-B(0)

在多个应用中,数学操作被应用于表示可以一次表示信号样本的 波形的样本序列,譬如模拟传感器的由模数转换器(ADC)数字化的 输出、图像的一个以上的栅格或颜色面、表示视频的像素阵列序列等 等。如在’312申请中所描述的,采样的数据波形是经常地(但不是独 有地)使用模数转换器(ADC)来数字化现实世界的模拟信号(譬如, 演讲、音频、图像、视频或其他传感器输出信号)来得到。采样的数 据信号还能够被模拟并且直接地或在额外的波形数据处理操作之后 馈入数模转换器(DAC),从而产生模拟的演讲、音频、图像、视频 信号。在本说明书中,术语“采样的数据波形”还包括自基于输入或 即时的采样的数据波形执行的数学和/或逻辑操作产生的即时的和/或 最终的采样的数据波形。

图4描述了依据优选实施例的可用于样本序列的减法操作的 SIMD寄存器架构。图4指示了序列样本的子集[A(3)...A(-1)],譬如 来自采样的数据波形,可以被存储在SIMD寄存器REG_A100a和寄 存器130中,并且图4还指示减法器420能够被配置为产生序列样本 的一阶微分(也被称为一阶差异)。该SIMD减法元件420产生相邻 样本间的差异以产生REG_B100b的微分样本。SIMD微分指令440, REG_B=DERIV(REG_A)是有用的压缩操作。样本与样本的相关性可 以通过对原始的样本流进行一个以上的微分而被减少。相较于原始样 本流,该微分样本使用更小的动态范围,这允许了该信号使用比表示 原始样本流所要求的位数更少的位来被表示。

SIMD微分指令440产生来自SIMD寄存器REG_A和寄存器130 的5个样本的序列的一阶微分,并且存储该结果至REG_B100b中: B(0)=A(0)–A(-1)B(1)=A(1)–A(0)B(2)=A(2)–A(1) B(3)=A(3)–A(2)

图5描述了依据优选实施例的积分(累加)样本序列的SIMD操 作。SIMD积分操作540提供了与SIMD微分操作440的相反的操作。 该SIMD积分操作540产生了来自REG_A100a和寄存器130的5个 样本序列的一阶积分:

B(0)=A(0)+A(-1)B(1)=A(1)+A(0)B(2)=A(2)+A(1) B(3)=A(3)+A(2)

在图4和5中,样本A(-1)被存储在寄存器130中,而不是在SIMD 寄存器REG_A100a中。用于存储样本A(-1)和其前导子A(-2)、A(-3) 等的SIMD寄存器的可替换的实施例被结合图7至9在下面进行描述。 依据一实施例,图6显示了依据一优选的实施例,图4的DERIV指 令440的扩展的功能。有时,样本序列被交织,即数组中的奇数和偶 数索引包含来自两个不同数值序列的样本。在这种情况下,具有奇数 索引[A(-1)、A(1)、A(3)、A(5)等]的样本是相关的,并且具有偶数索 引[A(0)、A(2)、A(4)等]的样本是相互关联的。在这种情况下,该 DERIV指令640包括一个附加的参数,称为“跨步(stride)”,该 参数指示在序列中相关样本间的距离。图6显示了DERIV指令640 使用为2的跨步生成的下列差异:

B(0)=A(0)–A(-2)B(1)=A(1)–A(-1)B(2)=A(2)–A(0) B(3)=A(3)–A(1)

例如,在SIMD指令640中,该跨步被指示为DERIV指令的第二参 数:REG_B=DERIV(REG_A,2)。

图7和图8说明了用于存储结合图4和5描述的DERIV和 INTEG操作的样本序列的两个选择。图7和图8说明如何生成样本序 列{x(-4),x(-3),...x(2)、x(3)}的一阶微分,其中x(-4)是序列中的第 一个样本,x(3)是序列中的最后一个样本。图7描述了隐式地指示哪 个SIMD寄存器中存储有早前的样本x(-1)...x(-4)的DERIV指令。早 前样本的位置通过寄存器次序的隐含序列来被隐式地指示。在隐含的 寄存器排序中,SIMD寄存器REG_A、REG_B、REG_C等都是隐式 地按顺序排列,并且DERIV指令710使用该隐式序列来确定之前的 样本x(-1)的存储位置。在图7中,REG_B700b保存样本{x(3),x(2), x(1),x(0)},并且因为隐式寄存器顺序(REG_A700a在REG_B700b之 前),REG_A700a因此包含早前的样本{x(-1)、x(-2)、x(-3)、x(-4)}。 该SIMD指令710REG_B=DERIV(REG(B))表示x(-1)被隐式地存储 在SIMD寄存器REG_A(700a)的最左操作数中。

图8说明了显式地指示哪些SIMD寄存器中存储早前的样本 x(-1)...x(-4)的可替换的DERIV指令。DERIV指令810(REG_h= DERIV(REG_h,REG_g)显式地具有两个寄存器标识符(REG_g800a 和REG_h800b),其中REG_g800a包含早前的样本{x(-1),x(-2),x(-3), x(-4)},并且REG_h800b包含样本{x(3)、x(2)、x(1)、x(0)}。因此REG_g 800a的最左操作数包含样本x(-1)。用于积分操作540的显式和隐式 SIMD指令的类似的替换如下所示。积分操作REG_B=INTEG(REG_B) 隐式地指示如图7中REG_A700a和REG_B700b所示的样本次序。 积分操作REG_h=INTEG(REG_h,REG_g)显示地指示为了积分操作, REG_g800a存储早前的样本{x(-1)、x(-2)、x(-3)、x(-4)}并且REG_h 800b存储样本{x(3)、x(2)、x(1)、x(0)}。

图9显示了使用两个或多个DERIV指令940的高阶微分的计 算(二阶微分,三阶微分等)。在图9中,REG_A900a保存样本{x(3)… x(0)},并且另一个寄存器(未显示在图9中)保存早前的样本{x(-1), x(-2)}。在第一DERIV指令940a[REG_B=DERIV(REG_A)]之后, REG_B900b包含一阶微分{d1(3)...d1(0)}。同样,在第二DERIV指令 940b[REG_C=DERIV(REG_B)]之后,REG_C900c包含二阶微分 {d2(3)...d2(0)}。用于压缩的SIMD微分(DERIV)操作可能通过SIMD 积分(INTEG)操作被反向。使用图5INTEG指令540的连续操作可以 用于从{d2(3)...d2(0)}再生{d1(3)...d(0)},并且从{d1(3)...d(0)}再生 {x(3)...x(0)}。因此,SIMDDERIV指令940可以减低数值序列的数值 范围,同时SIMDINTEG指令540可以恢复原始数值序列,该原始数 值序列的微分使用一个或多个DERIV指令940生成。通过减少数字 序列的数值范围,该序列可以使用更少的位来被编码以用于传输或存 储。当被应用处理需要时,该序列能够使用反向操作再生。

图10描述了确定用于数值数据的二进制补码的表示形式的指 数。有符号的整型的通用格式是二进制补码表示。二进制补码表示包 含大小和符号位;通常地,整型的大小使用该整型的低位的整型表示 形式,同时,符号位(和符号扩展位)使用整型表示形式的高位。第一 个例子是一个具有12个幅值位1042b的16位整型1042(符号位为1, 其次是“0”位,其次是10“无关”x位)和4个符号扩展位1042a, 其是幅值区最左侧符号位(“1”)的复制。对于该第一个示例,指数 是12。第二个例子是16-位整型1044,其具有14个幅值位1044b(符 号位为0,其次是“1”的位,然后12“无关”x位)和2个符号扩展 位1044a,其是幅值区最左侧符号位(“0”)的复制。对于第二个示例, 指数是14。指数生成逻辑1120确定来自SIMD寄存器1100a(REG_A) 的输入操作数的指数,并将生成的指数值存储在SIMD寄存器 1100b(REG_B)中。在优选的实施例中,应用于SIMD寄存器1100a 的指数生成逻辑1120可以通过并行使用N优先编码器以对在前的1 (负二进制补码整型)和在前的0(正二级制补码整型)编码来实现,其 中N是SIMD寄存器1100a中操作数的数目。优先编码器包括对单个 操作数执行指数计算的逻辑。所确定的指数指示代表数值数据的、非 符号扩展位的数目。

图11和图12描述了确定SIMD操作数的最高指数的两个可替换 的SIMD指令序列。图11显示了用于确定四个SIMD操作数最大指 数的两个指令序列。对于此示例,SIMD输入寄存器1100a(REG_A) 存储有四个操作数{A(3)...A(0)},第一指令1140a [REG_B=EXP(REG_A)]计算用于SIMD寄存器1100a[REG_A]中的四 个操作数的四个指数,使用结合图10在先讨论的指数计算逻辑 1120a,并且将四个所计算的指数存储在SIMD寄存器1100b[REG_B] 中。第二指令1140b[REG_C=MAX(REG_B)]从四个指数 {B(3)......B(0)}中计算最大的指数,并且将该最大的指数存储在SIMD 寄存器1100c[REG_C]的最右操作数C(0)中。图12描述了用于确定 SIMD操作数的最高指数的单指令。对于此示例,SIMD指令1204 [RA_exp=EXPMAX(REG_A)]使用时序逻辑执行指数计算1202和 最大指数计算1200,而不在寄存器中保存四个个体指数。最大的指数 计算优选的实施例是SIMD指令1204,因为单SIMD指令预计比两个 连续的SIMD指令的操作更快。当寄存器1100a(REG_A)包含浮点型 操作数,SIMD最大值的指数操作1202和1204可以应用于操作数的 浮点型指数位以确定最大的指数值。对于浮点型数据类型,SIMD指 令可以确定浮点型操作数的最大浮点型值。额外的SIMD指令可以规 格化以基于最大浮点型值或最大浮点型指数值来规格化浮点型样本。 如上文所述,具有每操作数的位数为Nv以及SIMD寄存器长度为Nr 的数据类型决定SIMD寄存器中操作数的数量N。对于某些数据类 型,最大指数值可以被计算以用于SIMD寄存器中N个操作数的子集。 例如,八个操作数可能分为两个四操作数子集,并且为每个子集确定 最大指数。如上文所述,指令句法可能包括“dType”来指示操作数 的数据类型。虽然最大指数测定的操作数优选的数目为4,其他数目 的操作数也是可以的。

最大的指数或块指数(blockexponent)被用于对来自寄存器 1100a(REG_A)的组输入进行高效的编码和打包,进一步说明如下。 最大的指数或块指数对应于此处作为编码组的一组样本。对于图11 和图12的示例,SIMD寄存器1100a为对应于最大指数的编码组保 存四个样本。

上文所述的SIMD指令也可以用在用于从数值数据去除冗余计 算机程序中。冗余去除操作减少数值输入操作数的动态范围。指数计 算指令确定相关位的数目,或用于范围减少的样本的编码组的块指 数。用于该编码组的块指数被用于有效的位打包操作,从而形成压缩 的数据包。

图13示出了依据一实施例的半字节交织1320。“半字节”具有 4位。在此示例中,SIMD寄存器1310a[REG_A]包含四个32位样本 {val3,val2,val1,val0}。半字节交织器基于每个样本的位的位值重 组REG_A1310a中的每个样本的位,从而形成存储在REG_Ai1310b 中的半字节。例如,当REG_A1310a存储四个32位的样本时,每个 半字节根据位值包含来自每个样本中的一位,以形成REG_Ai1310b 中的32个半字节,n0至n32。优选地,在REG_Ai1310b中,该些半 字节按顺序从最低有效的(最右)半字节的最低有效位到最高有效半 字节的最高有效(最左)位。图13的例子显示了{val3,val2,val1, val0}的最低有效位(bit[0])被顺序地存储在SIMD寄存器1310b [REG_Ai]中的最低半字节中,其中,“i”后缀表示“交织的”。

半字节交织器1320也可应用于位宽不是32位的操作数。对于 128位的SIMD寄存器长度(例如,英特尔SSE、SSE2、SSE3),至少 下面的组合是可能的:

●将四个32位的样本交织为32个4位的半字节(如图13所 示)

●将八个16位的样本交织为16个字节(每个字节为8位)

●将十六个8位的样本交织为8个短整型(每个短整型字为 16位)

●将两个64位的样本交织为32个4位的半字节,其中每个 半字节包含来自两个样本中每一个的2位。

对于256位的SIMD寄存器长度(例如,英特尔AVX),至少下面 的组合是可能的:

●将四个64位的样本交织为64个4位的半字节

●将八个32位的样本交织为32个字节

●将十六个16位的样本交织为16个短整型

●将两个128位的样本交织为64个4位的半字节,其中每个 半字节包含来自两个样本中每一个的2位。

半字节交织器网络1320优选的实施方式可使用电线将寄存器 1310a的位单元连接至寄存器1310b中的合适的位置,从而产生如图 13所示的相继次序的半字节。此实施方式具有最小化交织操作的延 迟的优点。半字节交织器的一个有用的特点是其操作可以完全使用电 线来执行,如半字节交织网络1320,而不是组合逻辑(晶体管)。在 片上系统(SoC)实现中,其也称为专用集成电路(ASIC),晶体管和导 线被结合以创建集成电路的功能元件。实施使用电线的半字节交织的 吸引人的特征是它们需要的延迟明显地少于比级联的组合逻辑元件 (晶体管)。仅使用半字节交织网络1320的电线来实现的半字节交织器 将比使用组合逻辑元素的可选的实施方式操作更快且延迟更低。

下面所述的位打包操作包括从样本选择将要打包的位子集。半字 节的相继次序允许更简单的操作以从寄存器1310bREG_Ai选择位子 集以进行位打包操作。

通常情况下,选择四个32位样本{val3,val2,val1,val0}的四 个M位的子集需要被称为掩蔽电路和桶形移位器的几个电路。掩蔽 电路通常清除(设置为0)输入操作数的一个或多个位;掩蔽电路可选 地清除输入操作数的Nmask最高有效位或Nmask最低有效位。桶形 移位器是相对复杂的设备,其通过将输入操作数移至左边(上移)或 移至右边(下移)来将输入操作数置于几个输出位单元中的一个。

用于位包装的可替换的实施方式可采用掩蔽电路和桶形移位器。 例如,可替换的实施方式能够以下列方式将SIMD寄存器1310a{val3, val2,val1,val0}四个操作数[REG_A](与示例指数19)打包进SIMD 寄存器1310b[REG_Ai]:

●Val0[18:0]→REG_Ai[18:0]

●Val1[18:0]→REG_Ai[37:19]

●Val2[18:0]→REG_Ai[56:38]

●Val3[18:0]→REG_Ai[75:57]

以这种方式交织位要求以下的掩蔽和移位操作:

●掩蔽val0的上部13位以及传送到REG_Ai[18:0]

●掩蔽val1的上部13位、右移val113位,以及传送到REG_Ai [37:19]

●掩蔽val2上部的13位,右移val226位,以及传送到 REG_Ai[56:38]

●掩蔽val3的高13位,右移val339位,以及传送到REG_Ai [75:57]

这些掩蔽和移位操作需要重要的组合逻辑,该逻辑引入REG_A 1310a和REG_Ai1310b之间的延迟。

相比之下,基于位值(如图13的REG_Ai1310b所示),半字节 交织器优选的实施方式仅使用电线将不同顺序的输入位进行分组。对 于位打包的示例,75个顺序位的子集可以选自REG_Ai[75:0]。在SoC 和ASIC器件的设计中,更快的速度和更低的延迟是优选的特点。半 字节交织1320优选的实施方式能够操作得明显更快,并且比使用掩 蔽电路和桶形移位器实现的可替换的位打包器具有更小的延迟。

在位打包操作的优选的实施例中,位的一个子集选自REG_Ai 1310b的交织位。该选择操作可以取决于SIMD输入寄存器中的操作 数的数据类型。

图14示出了当操作数是有符号的二级制补码整型时交织和选 择的一个示例。SIMD寄存器REG_A1310a包含四个32位的操作数, 该操作数具有由“sgnE”指示的符号、符号扩展位和由“mant”指示 的尾数位。该变量Nexp指定将为每个样本被保存的位的数目。对于 此示例,Nexp=24,包括1个符号位和23个尾数位。二级制补码算 法生成存储在SIMD寄存器1310a[REG_A]中每个样本的最高有效 (最左)半字节中的附加符号扩展位。将在半字节交织的SIMD寄存器 1310b[REG_Ai]的位打包期间存储的位是Nexp最低有效(最右)半 字节。对于此示例,Nexp=24个最低有效半字节,n0到n23,其被 选择以打包。包括SIMD寄存器REG_Ai1310b中的Nexp最右半字 节的子集对应于从SIMD寄存器REG_Ai1310a中的每个操作数选 择Nexp位(包括1个符号位和Nexp-1个尾数位)。将要被打包的 半字节的数目,Nexp,可以适合于使用结合图10所描述的技术的每 组SIMD寄存器操作数。

图15示出了当操作数是单精度浮点型样本时的交织和选择的 示例。SIMD寄存器1310a[REG_A]包含四个32位的单精度浮点型样 本,每个包括符号位“s”、浮点型指数位“ex”以及尾数位“mant”。 例如,浮点型算法的IEEE754标准指定浮点型为1个符号位([31:0] 的第31位)、8个指数位(位[30:23])和23个尾数位(位[22:0])。使用 半字节交织网络1320对SIMD寄存器1310b的最左(最高有效)半字 节进行打包保持了每个浮点型操作数的符号位、每个浮点型操作数指 数位中的一个或多个以及每个浮点型操作数的一定数量的最高有效 (最左)尾数位。将要被打包的半字节数目由Nexp指定。对于图15 中的示例,Nexp=23,每个样本的23个最左的位将被存储以打包, 包括1个符号位、8个指数位以及和14个尾数位。该子集包括SIMD 寄存器1310b的Nexp=23最高有效(最左)半字节,其对应于从 每个操作数SIMD寄存器1310a中选择Nexp位。对于浮点型的样 本,Nexp可能被选择以在解码(解压)之后实现所需的用户指定的 或者依赖于数据的数值质量,或在编码(压缩)后实现所需的用户 指定或者依赖于数据的压缩比。Nexp越大,解码(解压)的结果的 质量越高,但编码(压缩)的压缩比越低。’330申请,题为“浮点型 数据的计算高效压缩”描述了用于确定尾数位数以为浮点型样本编码 的方法。

图16示出了压缩的数据包的一个配置。被应用于样本的编码组 的块浮点型编码提供指数令牌E_TOK1—E_TOKM和尾数令牌 MANT_1—MANT_N。对于此示例,一个指数令牌E_TOK表示编码 组的四个尾数的块指数。四个尾数令牌中的每个浮点型编码组具有由 块指数的值所指示的相同数目的位。每个四尾数组的指数令牌E_TOK 表示该组的指数或其与先前指数的指数差异。第一指数令牌E_TOK1 将被绝对地编码,也就是说,块指数值被直接保存到压缩的数据包。 在优选的实施例中,第一次指数令牌被使用8位来表示,因此,从0 到255之间的指数值可以被表示。后续的块指数通过对之前的块指数 和当前的块指数之间的差异进行编码而被编码。例如,如果6个编码 组的块指数序列是{10,9,8,10,11,12},该6个块指数将使用序 列{10,-1,-1,+2,+1,+1}来被编码。因为指数差异经常是小范 围的(如范围-2至+2},相较于对每个指数进行绝对编码(即使用8 位),指数差异可以使用更少的位来编码。因此可以使用表示指数差 异的指数令牌来对指数编码,而不是使用块指数自身。在图16的配 置中,每个指数令牌E_TOK被编码组的4个尾数令牌MANT_i紧跟。 例如,指数令牌E_TOK1后紧接着尾数令牌MANT_1、MANT_2、 MANT_3、MANT4,并且指数令牌E_TOK2后紧跟着4个尾数令牌 MANT_5、MANT_6、MANT_7、MANT_8。压缩的数据包可以包括 报头610,该报头610包括可以运输用于解码器的配置参数的Nhdr 位。压缩的数据包的报头、指数令牌和尾数字段可能有不同的位宽。 压缩的数据包的链接位可以一次性地被存储在内存Nb位中,其中Nb 是计算系统的优选的内存宽度。Nb的示例值为32、64或128位。

图17示出了用于压缩的数据包指数令牌和尾数令牌的另一种 配置。在此配置中,指数令牌E_TOK表示最连续的编码组的最大指 数的两个指数差异。指数令牌E_TOK对应于两个块指数e1和e2。块 指数e1指示第一4尾数令牌MANT_a到MANT_d中的每一个令牌的 位数,指数e2指示第二4尾数令牌MANT_e到MANT_h中的每一个 令牌的位数。压缩的数据包可以包含用于图16和17所示的指数令牌 和尾数令牌的配置的结合,其中,指数令牌后紧跟着4或8个尾数。 选择的一个或两个指数差异的指数令牌的选择如下结合图19和26和 专利803进一步地描述。

图3-17描述了使用SIMD操作的压缩与解压功能的单个组 件。接下来介绍了使用这些组件在实施方案中的压缩器52(图1)和 解压程序80(图2)。

图18示出了使用SIMD寄存器和操作的压缩器52的实施例。 本例中的冗余去除器1801的此示例的资源包括SIMD输入寄存器 1800a、1800b和1800c、指数寄存器1200a、1200b和1200c和利用 相关的与SIMD寄存器选择器1810b和指数寄存器选择器1810a的微 分选择信号(DERIV_SEL)1880。位打包器1802的此示例的资源包括 包括半字节交织器1860、指数寄存器1820a和1820b、指数差异寄存 器1830a和1830b、中间SIMD寄存器1810a和1810b、指数令牌生 成器1700、输出分级寄存器1840,和输出大小寄存器1850。该SIMD 输入寄存器1800a[RA]保存提供用于冗余去除器1801的操作的数值 操作数的输入样本。在可替换的实施例中,可以包括SIMD衰减操作, 其将输入寄存器1800a[RA]的样本乘以衰减因子并将结果存回寄存器 1800a[RA],其中,衰减因子存储在另一个寄存器中(未显示)。冗余 去除器1801和位打包器1802的操作减少了存储SIMD输入寄存器 1800a’的数值操作数所需的位数。

例如,SIMD输入寄存器1800a[RA]可以包含4个32位操作数, 其操作数可以是4个32位整型或4个32位浮点型样本。SIMD寄存 器1800b[RB]保存SIMD指令940aRB=DERIV(RA)的结果,SIMD 输入寄存器1800a输入样本的一阶微分。SIMD寄存器1800c[RC]存 储SIMD指令940bRC=DERIV(RB)的结果,SIMD输入寄存器 1800a的输入样本的二阶微分。寄存器1200a[RAe]、1200b[RBe]和 1200c[RCe]分别存储SIMD寄存器1800a[RA]、1800b[RB]和 1800c[RC]的块指数。微分选择信号1880[DERIV_SEL]控制SIMD寄 存器选择器1810b和指数寄存器选择器1810a的操作。在一种替代方 法中,可以根据用户所选参数来设置微分选择信号1880。在另一种选 择中,冗余去除器1801可以测量样本和微分,并且设置微分选择信 号1880以选择提供最大压缩的寄存器。在优选的实施例中,对于将 在相同压缩的数据包中存储的每组样本,微分选择信号1880是固定 的,并且微分选择信号1880在包报头610中被指示,如结合图24所 进一步描述的。

寄存器选择器1810b为半字节交织器1860提供对所选的SIMD 寄存器RA、RB或RC的访问。寄存器选择器1810b可以通过多路复 用器来实现,该多路复用器具有来自寄存器1800a-c的三个输入和提 供给半字节交织器1860的一个输出。多路复用器输入和输出的宽度 优选地与SIMD寄存器1800a-c相同。对于此示例,该宽度是128位, 但其他的宽度也是可能的。半字节交织器1860根据所选择的寄存器 的操作数的位值对操作数的位重新排序,如图13所描述的,并且将 所交织的位存储在寄存器1812b(RD)中。对于每个寄存器1800a-c 中的四个操作数的此示例中,在寄存器1812b(RD)中的每个半字节具 有来自所选的寄存器的每个操作数的一位。中间的SIMD寄存器 1812a(RE)和1812b(RD)存储用于顺序编码组的半字节交织器1860的 半字节交织的输出。

如结合图12中所描述的,寄存器1800a-c的最大指数值根据 EXPMAX指令1204来计算,并且被存储在相应的指数寄存器 1200a-c中。选择器1810a根据微分选择信号1880来选择指数寄存器 RAe、RBe或RCe。所选的指数Rae、RBe或RCe对应于选定的SIMD 寄存器RA、RB或RC。顺序选择的指数值被存储在寄存器1820b和 1820a中。寄存器1820a存储来自来先前迭代的指数e1。用于连续迭 代的所选的最大指数值之间的差异被计算,并且存储在指数差异寄存 器1830a和1830b中。指数差异寄存器1830a保存最大的指数值e1 和在e1之前的最大的指数值e0之间的差异d1,同时,指数差异寄存 器1830b保存最大指数值e2和最大指数值e1之间的差异。指数令牌 生成器1700(结合图20、21被进一步描述)生成指数令牌“tok”1842, 该令牌需要令牌长度TOK_LEN位。在优选的实施例中,指数令牌的 长度可能是0、4或8位。SIMD寄存器1810a(RE)和1810b(RD) 存储半字节交织器1860的顺序半字节交织输出,同时,指数令牌生 成器1700生成指数令牌1842。输出分级寄存器1840(RF)存储的输出 存储指数令牌1842和中间寄存器1812a的、已进行令牌长度 TOK_LEN位的移位的一个版本。

输出大小寄存器1850存储将由编码的存储打包器2005打包的位 的数目Nnew,其结合图20和21被进一步描述。如果输入寄存器 1800a(RA)中的操作数的数据类型是32位整型,如结合图14所述, 来自输出分级寄存器1840(RF)的多个最低有效半字节将被打包。如 果输入寄存器1800a中的操作数的数据类型是32位浮点型数,如图 15所述,来自输出分级寄存器1840(RF)的多个最高有效位将被打包。 参数Nnew指示将被打包的位的数目(包括指数令牌和编码组的编码 的尾数)。

指数的令牌生成器1700基于指数差异值或最大指数值来提供 指数令牌。图19显示了用于在指数令牌和指数差异值或最大的指数 值之间的映射的指数令牌生成器1700优选的编码表。指数令牌生成 器1700的输入包括最大指数1820a(e1)、最大指数1820b(e2)、指数 差异1830a(d1)和指数差异1830b(d2)。指数令牌可以表示1个最大指 数(e1)或2个最大指数(e1和e2,其间接地由指数差异d1和d2来 表示)。指数令牌生成器1700生成落入以下三个条件的指数令牌:

●联合的指数条件-指数令牌1842表示2个联合编码的指数 差异,并且指数令牌长度1844是4位,如行1870所示

●差异指数条件-指数令牌1842表示1个指数的差异,并且 指数令牌长度1844是4位,如行1872所示

●绝对的指数条件-指数令牌1842表示绝对编码的1个指数, 并且指数令牌1844长度为8位,如该表底部的行所指示, 如行1874所示。

当指数差异1830a(d1)和1830b(d2)均位于范围{-1到+1}之间时, 相应的最高指数e1和e2都可以使用4位指数令牌1842来表示,其 令牌长度1844为4位。当指数差异1830a(d1)和1830b(d2)都不在 范围{-1至+1}中,但指数差异d1是在{-2到+2}的范围中时,单指数 e1可以使用4位的指数令牌1842来表示,其令牌长度1844为4位。 当d11830a或d21830b不在{-2到+2}的范围中时,最大指数e1使用 8位的指数令牌1842来被绝对编码,其令牌长度是8位。在最后的条 件下,指数令牌以3位‘'111’开头并且后面有5位‘abcde’,这能 够表示从0到32的绝对指数长度。当编码组指数为0时,没有尾数 位因该编码组而被发送。指数令牌生成器1700还计算指数令牌位加 尾数位的总数来确定Nnew1850,将要为该编码组打包的位数。编码 组中每个编码尾数的位数是由最大指数值给出。编码组中尾数的位数 由编码组中的尾数的数目乘以每个编码的尾数的位数的数目所得到。 根据d11830a和d21830b值,指数令牌生成器1700可以生成一个或 两个指数令牌1842、令牌长度(TOK_LEN)1844值和Nnew1850值。 在联合指数编码期间,当为两个最大指数仅生成一个令牌时,如行 1870行的令牌长度所指示的,没有指数令牌为第二尾数组而编码。所 得到的编码组对应于图17中所示的配置。例如,当{d1、d2}={0, 0}时,指数令牌1842是‘0100’,对于第一尾数组,令牌长度1844 是4,对于第二尾数组,令牌长度1844是0(无令牌)。同样,对于第 一尾数组,Nnew1850是e1+4,对于第二尾数组,Nnew1850是e2。 ‘803专利,题为“信号数据的块浮点型压缩”描述了指数令牌生成 器1700的其它实施例。

图18中所描述的冗余去除器1801的示例计算一阶和二阶微分和 寄存器1800a-c的所对应的最大指数值。依据微分选择信号1880,选 择器1810a、b每个从三种备选方案中选择。在其他实施例中,冗余 去除器1801可以包括用于其他高阶微分的寄存器和指令,其中选择 器1810a,b可以从三种以上的备选方案中选择。在另一个实施例中, 冗余去除器1801可以计算一阶微分,而不是二阶微分,使用两个寄 存器1800a、b和两个指数寄存器1200a、b,并且选择器1810a、b将 从两个备选方案中选择。在另一个实施例中,冗余去除器1801可以 使用一个固定的微分阶数,并且将不包括选择器1810a和1810b。在 另一个实施例中,冗余去除器1801可以为寄存器1200a计算寄存器 1800a中输入样本的最大指数,并且可以不包括微分操作、相关寄存 器1800b、c和1200b、c以及选择器1810a和1810b。对于此可替换 的实施例,位打包器1802将对寄存器1800a中的输入样本的块指数 和尾数进行编码和打包。

图20和图21示出了编码的内存包2005的操作,压缩的最后级 将固定宽度Nout的位写至压缩数组2130。例如,Nout可能是32、64 或128位。对于图21的示例,Nout=128。压缩数组2130可以被存 储在任何合适的片上或片外存储器中,包括缓存内存(通常位于片 上,位于与编码逻辑相同的裸片上)或双数据速率随机存取(DDR)内 存(通常位于与编码逻辑分开的片外裸片上)。在优选的实施例中,输 出寄存器2000a和2000b具有与压缩数组2130相同的宽度。在图20 的示例中,输出寄存器2000a和2000b均是128位宽(Nout=128), 与SIMD寄存器1800a-c的宽度相同。根据指数尾数选择器2095 (HDR_OR_EM)的值,编码的存储打包器2005能够对具有报头长度 2070位(HDR_LEN)或打包的指数令牌的报头位2080和具有Nnew205 位(Nnew)的尾数位2080进行编码。在优选的实施例中,HDR_OR_EM 选择器2095利用值0对EM进行编码(编码指数+尾数位2060)并且 利用值1对HDR进行编码(编码报头位2080)。输出寄存器2000a、 2000b实现双缓冲技术,其中,样本被写入到第一(“活动”)寄存 器,直到该寄存器包含超过Nout=128位,因此,剩余位被存储在 第二(“溢出”)寄存器中。位计数寄存器2010(Ncount)包含存储在两 个计数输出寄存器2000a和2000b中所有位的计数。当位计数寄存器 2010在打包新的报头或指数尾数位之后超过Nout时,该“活动”的 输出寄存器2000a或2000b将被写到编码的输出数组2130。图21示 出了用于将打包的输出字写到压缩的数组2130的操作。当新的位被 提供给编码的存储打包器2005时,根据HDR_OR_MEM2095的值, 位计数寄存器2010递增Nnew2050或HDR_LEN2070。位计数寄存 器2010通常比对Nout编码所需的位数要宽1位。例如,当Nout=128 位宽(需要7个地址位),位计数寄存器2010将是8位的宽度。位计 数寄存器2010的最高有效位(MSbit)指示输出寄存器2000a或2000b 是否将充满指数尾数位2060或报头位2080。当MSbit2010a=0时, 输出寄存器2000a是“活跃”寄存器;当MSbit2010a=1时,输出寄 存器2000b是“活跃”的寄存器。编码的存储打包器2005将Nnew2050 或HDR_LEN2070位与当前存储在“活动的”寄存器(2000a或2000b) 中的Ncount位2010匹配。在“活动的”寄存器以及被打包后,剩余 的任何溢出位被存储在“溢出”寄存器(2000b或2000a)中。

在将新的位打包进输出寄存器2000a和/或2000b中后,如果更 新的位计数寄存器2010a等于或超过Nout,以往“活跃的”寄存器 的所有Nout位将被写入编码的输出数组2130。图21示出了在写控制 逻辑2115的控制下,“活跃的”寄存器的Nout位如何被写入编码的 输出数组2130的细节。存储器阵列可以使用至少3个寄存器来写入 到在相关联的编码的输出数组2130中的位置:

●地址寄存器2126

●数据寄存器2128

●写使能信号2117。

写控制逻辑2115维持存储压缩数组2130中将要被写入的下一 位置的地址的压缩数组指针2120。在位计数寄存器2110已经递增了 Nnew2050或HDR_LEN2070后,写控制逻辑2115检测位计数器2010 的MSbit2010a何时已更改状态(从0到1,或从1到0)。当这发生时, 此前的“活跃的”寄存器现在包含将被写入到压缩数组2130的Nout 位。为了执行该写操作,写控制逻辑2115激活写使能信号2117,这 将使得数据寄存器2140中的内容被写入到地址寄存器2126中指定的 地址(压缩数组指针2120中存储的地址)。如果MSbit2010a被设置为 “1”,输出寄存器位2000a的Nout位将被写入到数据寄存器2128。 如果MSbit2010a被设置为“0”,输出寄存器2000b的Nout位将被 写入到数据寄存器2128。写多路复用器2124通过倒相的MSbit2110a 信号(由反相器2122进行倒相)来控制。当反相器2122的输入是0时, 输出为1。当2122反相器的输入是1时,输出为0。当数据寄存器2128 中的新写入的数据值已经被写入压缩数组2130后,写控制逻辑2115 使能地址递增信号2119,其递增输出指针。压缩数组指针2120可以 递增1或其他适当的数量,取决于用于访问压缩数组2130的寻址方 案。结合图16和17所述的,压缩数组2130可以保存一个或多个压 缩的数据包。

综上所述,图18至21描述了压缩器52或数值编码器的实施例, 其使用SIMD指令序列,接受SIMD输入寄存器中的整型或浮点型的 样本,并且产生布置在压缩的数据包中并且写入压缩数据2130的编 码的压缩数据。图22-30将开始描述解压器80(图2)的操作或数值 解码器的操作,其接收来自压缩数据包的编码的压缩数据并且输出 SIMD输出寄存器中的解码的整型或浮点型样本。减压操作包括用于 位解包和信号再生的操作。用于位解包的操作处理压缩的数据数据包 以产生用于编码组的未打包的尾数和编码指数。信号再生的操作反转 应用于压缩的冗余去除操作,以产生解压的样本。在图22-30中描述 的示例中,SIMD寄存器被假定有128位的宽度并存储四个32位的整 型或四个32位浮点型样本。在可替换的实施方式中,SIMD寄存器可 以存储多于或少于128位,并且SIMD寄存器中的操作数可以是8、 16、32、64,其中,操作数通常是SIMD寄存器宽度的整型的因子。 SIMD寄存器和操作数的变化不限制本发明的范围。下面的例子都只 是说明用于解码器的SIMD指令解码器的一种实施方式。

图22示出了位解包器220的操作,位解包器2200使用SIMD指 令序列来解码包含编码的(压缩的)整型或浮点型样本的压缩数组 2130。位解包器2200包括用于四个客户端操作的功能模块:位收件 器2220、包报头解析器2240、指数解码器2260和尾数解包器2280。 位收件器2220获取来自压缩数组2130的打包的单元(通常具有32、 64或128位的宽度),使用索引到压缩数组2130的地址ADDR。除了 指向压缩数组2130的地址指针,位收件器2220维持一个位计数器从 而当前Nbits最新位都可以被位收件器2220的客户端所使用。位收件 器2200将包报头数据和压缩的数据包的压缩数据分离。对于包报头 数据,根据其状态,位收件器2220公式将最近的48位传送到数据包 报头解析器2240,根据每个包报头610中的控制位,其解析该48位 并且确定32或48位是否是必需的。包报头解析器从用于解码操作的、 如在图24所述的报头数据中提取参数。如在图16和17中所描述的, 压缩的数据包含指数令牌和尾数令牌。对于指数令牌,根据其状态, 位收件器2220将8个最新位传送至指数解码器2260,指数解码器2260 对每个指数令牌1842解码并决定0、4或8位构成当前指数令牌。对 于尾数令牌,根据其状态位,收件器2220将4*Nexp个最近位传送至 尾数解包器2280。对于此示例,4*Nexp<=128。尾数解包器2280对 尾数令牌的编码组进行解包。为重构整型样本,尾数解包器2280适 当地对尾数组的最高有效位进行符号扩展。为重建浮点型样本,尾数 解包器2280将尾数组的最低有效位填入0。图23进一步介绍了在 INT_OR_FLOAT信号的控制下,尾数解包器2280重新构造整型或浮 点型样本。由此产生的解码的尾数被存储在解包的SIMD寄存器2275 中。

图23显示了依据一优选的实施例的位收件器2220的操作。位收 件器2220的客户端将请求(或被提供)达128位,并不是所有的将被需 要。位收件器2220的操作为其所有客户端执行三个通用功能:

●它保持解码位寄存器2322中的至少128位,

●它向其客户提供N_FETCH位2324,以及

●它通过对解码位寄存器2322右移位将R_SHIFT位2328丢 弃,然后选择性地从压缩数组2130中读取额外的128位以 保持解码位寄存器2322中的至少为128位。

如在位收件状态机表2326中所示,位收件器2220具有三种状态: 报头解析状态、指数解码状态和尾数解包状态,这对应于先前结合图 16、17讨论的编码单元的三种类型。在报头解析状态,位收件器2220 向包报头解析器2340提供来自解码位寄存器2322的48位。在包报 头(进一步如图24中所述的)优选的实施例中,包报头包含32或48 位。在解析包报头之后,包报头解析器2340返回32或48的R_SHIFT 值,或在优选的实施例中,返回0或1的HDR_LEN指示符至位收件 器2320。位收件器2320然后将解码位寄存器2322(当HDR_LEN=0 时)右移32位或右移48位(当HDR_LEN=48时)。如果解码后位寄存 器2322的位的数目在右移后是少于128,则包报头解析器2340从压 缩数组2130读取额外的128位。同样,位收件器2220提供8位至指 数解码器2360,指数解码器2360返回0、4或8位的R_SHIFT计数(或 在优选的实施例中,0、1或2的TOK_LEN指示符为)至位收件器2220。 然后,当TOK_LEN=0、1或2时,位收件器2220对解码位寄存器2322 分别右移0、4或8位。如果在解码后位寄存器2322中右移的位数是 少于128,则包报头解析器2340从压缩数组2130读取额外的128位。 同样,位收件器2220提供128位至尾数解压器2360,尾数解压器2360 返回4*Nexp的R_SHIFT计数,其中,Nexp是当前的尾数组的指数 位宽。位收件器2320然后对解码位寄存器2322右移4*Nexp位。如 果解码位寄存器2322中的尾数的数目在右移后是少于128,那么包报 头解析器2340从压缩数组2130读取额外的128位。

图24描述配置数据包报头610。在优选的实施例中,当压缩的 数据包包含压缩的整型样本时,包报头610包含32位,或压缩的数 据数据包中包含压缩的浮点型样本时,包报头610包含48位。数据 包报头610包括六个字段610a到610f。列2451列出了每个包报头字 段的示例的名字,而列2452提供有关每个字段的注释,在优选的实 施例中,包括用于该字段的位编码。同步字段610a有助于将数据从 压缩的数据包同步,从而每个压缩的数据包以相同的SYNC值开始。 衰减字段610b保存用于在如下所述的信号再生后合适地放大再生的 尾数的参数ATTEN。微分字段610c指定在信号再生期间需要多少次 积分操作,这对应于由冗余去除器1801的选择器1810b所选择的微 分操作的顺序。数据类型指示符字段610d指示编码的尾数表示整型 还是浮点型样本。保留的字段610e可能用于携带额外的编码参数。 可选浮点型的指数比例字段610f可以用于转换重建的整型样本至为 浮点型样本。如果数据类型指示符字段610d指示的数据类型是浮点 型,浮点型指数比例字段610f出现在包报头610中。

图25显示了指数解码器2260的框图。位收件器2220提供指数 令牌TOKEN82564至指数令牌解码表2570,其在图26中被进一步 地描述。在优选的实施例中,指数令牌2564包含8位,以反映用于 绝对指数编码的8位的指数最大宽度。指数解码表2570生成令牌长 度TOK_LEN指示符2562,并将其提供回至位接收器2220以控制 R_SHIFT2328。指数的译码表2570还会生成指数差异 EXP_DIFF12575和指数差异EXP_DIFF22576。在优选的实施例中, 指数解码器2260维持内部当前指数寄存器2573,其表示最近解码的 指数。当前指数寄存器2573的内容被添加到指数差异EXP_DIFF1来 生成指数12568a。指数12568a被添加到指数差异EXP_DIFF2以生 成指数EXP22568b。如图25所述,指数EXP12568a和指数EXP2 2568b并不总是有效,所以指数有效信号EXP1_22566指示指数EXP1 2568a和指数EXP22568b一个或两个是有效的。在某些情况下,指 数令牌解码表2570检测指数已经被绝对编码,这需要8指数令牌位。 在这种情况下,也会生成额外的绝对指数值ABS_EXP2571。最后, 指数令牌解码表2570生成指数选择控制信号EXP_SEL2572以控制指 数选择复用器2574,指数选择复用器2574依次地控制当前指数寄存 器2573的更新的内容。在指数解码周期后,当前的指数寄存器2573 可以包含指数EXP12568a、指数EXP22568b或绝对指数值 ABS_EXP2571。当前的指数寄存器中的解码的指数表示尾数令牌的 相应编码组的最大的指数。

图26示出了用于指数解码器2260操作的指数令牌解码表2570。 表条目中的“x”表示“不关心”的条件。在优选的实施例中,0、4 或8位的令牌长度可能编码为2位二进制值0、1或2以传递回位接 收器2220。由于一些指数令牌表示两个指数(如先前结合图18所述), 指数令牌解码表2570可以提供1或2个令牌长度指示符TOK_LEN 2562至位收件器2220。为给定的指数令牌2564而生成的令牌长度指 示符的数目在列2562中由1或2个令牌长度指示符的存在而指示。 作为指数令牌2564的函数,用于指数差异EXP_DIFF12575和指数差 异EXP_DIFF22576的值在图26中被列出。作为指数令牌2564的函 数,指数有效信号EXP1_22566的值、绝对指数值ABS_EXP2571和 指数选择控制信号EXP_SEL2572在图26中列出。总之,指数解码器 2260为每个指数令牌2564生成1或2个指数,分别提供足以解压4 或8编码的尾数的指数信息。

图27示出了尾数解包器2280的功能。指数解码器2260向尾数 解包器2280提供指数有效信号EXP1_22566和结合的指数寄存器 EXPS2568中的一个或两个指数。尾数解压控制块2784内部存储1 或2个指数,并且产生一个或两个自位收件器2220的128位请求。 通过请求来自位收件器2220的最近的128位,由于最大指数值是32, 尾数解包器2280能够将4个打包的尾数解码至非打包的尾数寄存器 U_MANTS2275。当指数有效信号EXP1_22566指示结合的指数寄存 器EXPS2568中的一个指数是无效的,尾数解压控制2784使四个打 包的尾数能够从接收自位收件器2220的打包的尾数位P_MANT2782 被解码。当指数有效信号EXP1_22566指示结合的指数寄存器 EXPS2568中的两个指数是有效时,尾数解包控制2784使两组的四个 打包的尾数依次地被解码。根据由包报头解析器2240先前自包报头 610解码的数据类型指示符INT_OR_FLT610d,尾数多路复用器2700 从整型符号扩展器2790或从浮点型尾数填充器2795中选择半字节反 交织器3050的输入。

如结合图14和15在前文所述的,32位整型的最低有效半字节 或32位浮点型样本的最高有效半字节被存储在打包的尾数 P_MANTS2782中。如结合图28和29所示,整型符号扩展器2790 和浮点型尾数填充器2795为整型和浮点型样本将打包的尾数2782中 的半字节对齐。尾数多路复用器2700使用数据类型指示符610d来选 择适当的半字节对齐方式。如结合图30所示的,半字节反交织器3050 完成尾数解包操作,并生成解压的SIMD寄存器2275的内容 U_MANTS。

图28显示了整型符号扩展器2790的操作。给定的128个候选打 包的尾数位2782(P_MANTS)和块指数(Nexp),整型符号扩展器2790 将Nexp半字节自寄存器2891a复制到SIMD分级寄存器2898a中最 低(最右)的Nexp半字节。此外,包括打包的尾数的四个符号位SGN 2894的最高半字节2893s被复制并被复制至分级寄存器2898a的上部 半字节。完成此操作后,分级寄存器2898a的最高有效半字节全包含 符号扩展半字节。如果分级寄存器2898a被尾数多路复用器2700选 择,然后其准备好半字节反交织。

图29示出了浮点型尾数填充器2795的操作。给定128个候选的 打包尾数位2782和块指数(Nexp),浮点型符号扩展器2790将Nexp 半字节自寄存器2891b复制到SIMD分级寄存器2898b中最高(最左) 的Nexp半字节。此外,分级寄存器2898b的下部半字节2997被以零 填充。完成此操作后,分级寄存器2898a的最高有效位包含合适的浮 点型半字节,并且下部的尾数半字节2997包含零。如果被尾数多路 复用器2700选择,然后分级寄存器2898b准备好半字节反交织。

图30显示了半字节反交织器3050的操作。半字节反交织器3050 可以解包由结合图13所述的半字节交织器1320和结合图18所述的 半字节交织器1860生成的半字节交织的位。半字节反交织器3050的 输入以整型格式抵达半字节交织的SIMD分级寄存器2898a或以浮点 型格式抵达半字节交织的SIMD分级寄存器2898b。在经半字节反交 织器网络3062处理后,反交织的位被存储在SIMD寄存器2275中。 反交织器网络3062还原原始的位顺序,以重建在交织前样本的数据 格式。在这例子中,32位整型或浮点型样本,由val0、val1、val2和 val3表示。在尾数解包器2280的背景下,半字节反交织器3050恢复 用于被打包的位的子集的位的尾数的原始顺序。尾数解包器2280通 过对浮点型样本进行零填充或恢复二级制补码整型样本的符号扩展 位来该该尾数还原到样本的原始长度。尾数解包器2280的这些操作 将打包的尾数转换为具有整型或浮点型格式的解包样本。寄存器2275 中的解包的尾数U_MANTS表示通过信号再生操作来进一步处理的 解包的样本。

信号再生操作可能应用于SIMD寄存器2275中解包的样本,以 反向冗余去除器1801所执行的操作。信号再生操作可能包括如之前 在图5中描述的SIMD积分指令540。该积分操作按照来自微分字段 610c的参数DERIV来执行,该参数之前由报头解析器2240解码。该 DERIV参数决定了积分操作的积分阶数,这将反转由冗余去除器1801 计算的微分。当衰减操作在压缩过程中被应用到的样本时,解压操作 包括乘以放大因子的操作,该放大因子大约地反向了该衰减因子。该 放大因子基于来自包报头610的衰减字段610d的ATTEN参数所确 定。

图31和32给出了用于编码(压缩)操作和解码(减压)操作的伪代 码指令的示例。伪代码不是旨在正确编译或考虑到在句法正确、充分 运作的软件实现中所需的所有可能的条件。图31和32中的伪代码指 令的示例仅说明用于实施压缩与解压操作的SIMD指令序列。许多伪 代码指令运算符具有前缀“V_”,这是典型的SIMD运算符名称。

图31提供了用于对4N整型或浮点型样本编码的程序的伪代码 SIMD指令的示例。4N中的“N”表示的编码器函数700的迭代的次 数,其中每次迭代处理4个样本,共4N个样本。编码器函数700利 用指定将被编码的第一个数值操作数的地址的输入数组指针701来指 定数值操作数将被编码的输入数组。例如在图31中,访问存储器的 SIMD指令将从存储器(譬如,片上缓存)读取4个32位样本(共计 128位),或向存储器(譬如,片上缓存)写入4个32位样本(共计128 位)。输出数组指针701b指定编码的输出值将存储的位置的起始地址, 即压缩数组2130(前面所述在图21)的起始地址。循环计数器701c指 定将被编码的样本数目,该数目被除以4(因为每个SIMD内存读取指 令815获取四个32位操作数)。衰减器设置701d指定将要编码的4N 个样本的衰减值。通常,衰减器的设置落在0.0至1.0的范围中。参 数“DERIV”对应于微分选择器DERIV_SEL1880(先前结合图18进 行讨论的),并指定当前编码组的哪个微分将被打包。

编码器函数700一般分三个阶段执行:

●初始化(元素705、800、710和805)

●编码循环(元素810、815、820、940a、940b、817、720和 725)

●清除(元素730、735、825、830和740)。

当启动指针寻址指令805将输出数组指针701b保存在称为 “startPtr”的局部变量中时,初始化阶段开始。包报头指令 705[V_PACK_HDR]将衰减器设置701d和微分选择器1880写入编码 的数据包报头610。在其他实施例中,包报头指示705可包括额外的 报头参数,譬如在图23中所述的那些。衰减器初始化指令800加载 衰减器设置610d到所有四个32位操作数的SIMD寄存器R4,这将 被用在编码环路中从而以相同的数量对输入样本进行衰减。微分说明 符指令710将微分选择参数“deriv”或DERIV_SEL1880加载至寄存 器中,如之前结合图18所述的,该寄存器控制指数寄存器选择器 1810a和SIMD寄存器选择器1810b。

图31的编码循环开始于循环初始化和控制指令810,其指定了 循环计数器变量“i”的起始值和结束值,以及“i”随着每个循环迭 代而递增。SIMD寄存器加载指令815[V_LOAD]将四个32位操作数 从当前输入的数组指针701a加载到SIMD寄存器R1中。该输入数组 指针在4-操作数接收后递增,有效地将输入数组指针701a推进到下 一个4-操作数存储位置。SIMD乘法指令820将SIMD寄存器R1中 每个操作数与衰减器设置701d(以前存储在SIMD寄存器R4中)相乘。 两个顺序SIMD微分指令940a和940b生成四个输入操作数的一阶和 二阶微分,如上文结合图6、7、8和9所述。一阶微分存储在SIMD 寄存器R2中,二阶微分储存于SIMD寄存器R3中。最大指数的计 算和选择指令817[V_EXPMAX]将EXPMAX1204指令的操作、 DERIV_SEL参数1880和之前结合图12和18所描述的选择器1810a 和1810b相结合。可替换地,V_EXPMAX指令817的操作可以计算 选定的SIMD寄存器R1、R2、R3中的样本的最大指数,由微分选择 参数“deriv”决定的(即DERIV_SEL1880)。在另一种选择中, V_EXPMAX指令817的操作计算SIMD寄存器R1、R2和R3中样 本的最大指数,并且根据微分选择参数“derive”(即DERIV_SEL1880) 选择从最大的指数中(即,从图18中的寄存器1200a-c中)选择。 V_EXPMAX指令817的操作在寄存器Re(即寄存器e21820b)中存储 最大的指数,并且从R1、R2和R3中对应选择的尾数存储至SIMD 寄存器R5中。该打包指令V_PACK_REG720结合如图18和19所描 述的半字节交织器1860和指数令牌生成器1700的操作。该操作使用 SIMD寄存器Re中的最大指数信息来从所选SIMD寄存器(R1、R2、 R3)来生成具有与四个打包的尾数1840的相应的指数令牌1842。 SIMD条件性写指令V_WRITE_IF_FULL725实施如图20和21所述 的编码的存储打包器2005的操作。这些操作将指数令牌1842和四个 打包的尾数1840与输出寄存器2000a、b中任何先前存储的位相结合, 并且将输出寄存器2000a、b的任意完整的128位字写入到打包数组 2130。

图31中更新阶段始于SIMD清除指令30[V_FLUSH],这使得输 出寄存器2000a、b中的任何保留的位被写入压缩数组2130中。微分 更新指令735[V_UPDATE_DERIV]审查三个指数寄存器1200a-c(前面 在图18所述的)和更新对应于最低计数的微分选择参数“DERIV” 1880,即当前编码组的要求最少尾数位的输入的样本、一阶微分或二 阶微分。该更新的微分选择参数“deriv”或DERIV_SEL1880将被用 于选择SIMD寄存器R1、R2和R3以及在下一次迭代中处理的下一 个编码组的对应的最高指数。数据包长度计算指令825计算最终输出 指针值(outPtr)和初始输出指针(startPtr)之间的差异,其表示被写入用 于压缩的数据包的压缩数组2130的128位字的数目。在固定速率编 码期间,数据包长度误差计算指令830计算当前压缩的数据包的大小 (pktLen)和目标数据包长度之间的差异。SIMD衰减器更新指令 740[V_UPDATE_ATTEN]基于之前由数据包长度错误计算指令830 计算的数据包差异更新衰减器设置701d。V_UPDATE_ATTEN指令 740被结合图35做进一步描述。当执行函数返回指令840时,编码器 功能700完成。

图31描述了两个替代方法,编码循环指令可以通过将两个或多 个编码循环指令结合成一条指令来指定。通过将两个指令的逻辑和寄 存器结合为背靠背的电路,指令的这种结合在SIMD架构中是被允许 的,其中,第一SIMD指令的输出变为第二(或后续)SIMD指令的输 入。这种结合可能会引入额外的延迟,但缩短了程序内存。在可替换 的方式1a中,SIMD冗余去除指令745[V_RR]表示四个SIMD指令 V_MPY820、V_DERIV940a(第一调用)、V_DERIV940b(第二调用) 以及V_EXPMAX817的顺序的执行。SIMD打包和写指令750 [V_PACK_WRITE]表示顺序执行两个SIMD指令V_PACK_REG720 和V_WRITE_IF_FULL725。在可替换的方式1b中,SIMD编码指令 755[V_ENCODE]表示SIMD指令V_RR745和V_PACK_WRITE750 的顺序执行。在可替换的方式2中,SIMD编码器参数更新760 [V_UPDATE_PARAMS]表示SIMD指令V_UPDATE_DERIV735和 V_UPDATE_ATTEN740的顺序执行。

图32提供了用于程序的伪代码SIMD指令的示例,该程序对压 缩的数据包解码以来重建4N整型或浮点型样本。解码器函数900利 用输入数组指针901a来指定江北解码的压缩数组2130,该数组指针 901a指定在一个或多个压缩数据包中第一个被压缩的数据包的地址。 在此示例中,SIMD访问内存的指令会从内存读取或向内存写入四个 32位样本(共计128位),该内存通常是片上缓存。对于其他的实施方 式,比128位更宽或更窄的内存宽度是可能。输出数组指针901b指 定将存储已解码的128位输出样本的起始地址。循环计数器901c指 定将被解码的样本的数目,该数目被除以4(因为每个128位内存写入 指令815存储四个32位操作数)。在此示例中,每个解码循环的迭代 创建四个新的32位操作数。

解码器的功能900一般分三个阶段进行:

●初始化(元素905、910和800)

●解码循环(元素812、915、920,925a-b、930a-b、820a-b、 850a-b和860a-b)

●更新(元素730和840)。

当SIMD解码初始化指令V_INIT_DECODE905初始化所有解码 器状态机和指针时,初始化阶段开始。V_INIT_DECODE905将输入 的指针901a复制到指向压缩数组2130的第一个128位的内部解码器 寄存器。如前文在图23中所述的,在将压缩数组2130的第一个128 位读进解码位寄存器2322后,该指令也递增输入指针901a。参考图 22,位收件器2220还保持解码位寄存器2322中的位元的可用数目的 内部计数器,并且自压缩数据213读取所需的附加的128位组,因为 包报头解析器2240、指数解码器2260和尾数解包器2280指定从解码 位寄存器2322放弃多少位R_SHIFT2328。每当从压缩数组2130读取 额外的128位组,位收件器2220引用(然后推进)当前输入指针。SIMD 报头读取和解码指令V_DECODE_HDR910读取和解码衰减器设置 “atten”610b和来自包报头610的微分选择参数“DERIV”610c。在 其他实施例中,指令V_DECODE_HDR910可能返回的附加报头参数, 譬如在图24所述的那些。SIMD衰减器初始化指令V_LOAD800将衰 减器设置“atten”的倒数加载到SIMD寄存器R4的所有四个32位操 作数。寄存器R4将用在编码循环中以放大在信号再生处理末尾的样 本。

图32中的解码循环开始于“while”循环初始化和控制指令812, 这指定了在大括号“{}”中的代码将会重复,直到计数器值N是零或 负数。SIMD读取指数指令V_FETCH_EXP915使得位收件器2220(图 22-23)中的来自解码位寄存器2322的8位被传输至指数解码器 2260(图25)。接下来,指数解码指令V_DECODE_EXP920对该对这 些8位执行前面结合图25和26所述的指数解码功能。由 V_DECODE_EXP指令920所得到的解码的指数被存储在寄存器R3, 并且指数的数目被保存在本地变量nExps921中。接下来,SIMD尾 数解码的指令V_DECODE_MANTS925a使得128位被自位接收器 2220中的解码位寄存器2322中传送到尾数解包器2280,其对最高有 效SIMD寄存器位进行解码和符号扩展(对于打包的整型),或对最低 有效SIMD寄存器进行解码和零填充(对于打包的浮点型数),如上 文结合图27、28和29所述。尾数解包的结果存储在寄存器R2中。 V_DECODE_MANTS指令925a路包括一个控制参数"1",其指定寄存 器R3中将用于解码该四个尾数的第一指数,因为由V_DECODE_EXP 指令920解码的指数令牌代表两个指数。下一步,V_INTEG_N宏 930(在图33中进一步描述),由指令930a调用,其可以计算寄存器 R2中的一阶或二阶积分,或在微分选择参数"DERIV"610c控制下, 不计算积分。SIMD乘法指令V_MPY820a将SIMD寄存器R1中的 每个操作数与放大因子相乘,该放大因子是由V_LOAD指令800存 储在SIMD寄存器R4中的衰减器设置610b的倒数。SIMD寄存器写 指令V_STORE850a将SIMD寄存器R1的内容(四个32位的字)写入 解码的输出数组。V_STORE指令850递增输出指针901b以反映128 输出位被写入输出数组。最后,指令860a递减组计数器901c("while" 循环812迭代计数器)。

条件测试“if”指令924确定是否应该解码额外的四个尾数,其 发生在本地变量nExps921的值等于2的时候。在这种情况下,指令 序列{925b、930b、820b、850b和860b}生成第二组的解码32位操作 数并将其写入到输出数组。

图32的更新阶段始于SIMD清除指令730[V_FLUSH],如果任 何部分的比特处于压缩数组2130中,其推进了编码输入的数组指针 901a。解码函数通900过执行函数返回指令840完成。

图32描述解码循环指令能够通过将两个或多个编码循环指令合 成为一个单指令来指定的两个替代方法。通过将两个指令的逻辑和 寄存器结合为背靠背的电路,指令的这种结合在SIMD架构中是被允 许的,其中,第一SIMD指令的输出变为第二(或后续)SIMD指令的 输入。这种结合可能会引入额外的延迟,但缩短了程序内存。备选方 案1中,SIMD获取并解码指数V_FD_EXP指令935表示两个SIMD 指令顺序执行:

●V_FETCH_EXP指令915,和

●V_DECODE_EXP指令920,

同样,SIMD再生尾数指令940[V_REGEN]表示四个SIMD指令 顺序执行:

●V_UNPACK_MANTS指令925,

●V_INTEG_N宏指令930,

●V_MPY指令820,和

●V_STORE指令850。

在备选方案2中,SIMD解码V_DECODE945表示SIMDV_FD_EXP 指令935和SIMDV_REGEN指令750顺序执行。

图33进一步描述V_INTEG_N宏930,其具有输入参数SIMD 输入寄存器Ra930a、微分选择参数“DERIV”930c和SIMD输出寄 存器Rb930c。取决于微分选择参数“DERIV”930c的值,SIMD积 分指令141不被调用(当DERIV=0时),在指令141a被调用一次(当 DERIV=1时),在指示141b和141c被调用两次(当DERIV=2时)。在 所有三种情况下,所需的积分结果被返回输出寄存器Rb930b。如果 微分控制930c的值不是0、1或2,在输出寄存器Rb930b中返回错 误代码。

条件执行的“if”语句通常减慢软件的执行,尤其是如果条件测 试执行在如“while”循环812的循环中。因为这个原因,图33的解 码循环的另一种可替换的实施例将包括三个单独的“while”循环,每 个“while”循环包含适当数量的(0、1或2)对微分选择参数“DERIV” 610c值的V_INTEG指令141的调用。在主要的解码循环之前进行一 次微分测试,可以通过将执行条件测试“if”指令924的成本移出主 循环来加速循环。这个可替换的实施例也不需要V_INTEG_N宏930。

图34说明用于编码函数700的附加指令以实施无损、固定速率 或固定的质量编码操作模式。取决于被编码的数值数据的性质及统 计,用户可能需要无损编码的数值数据,从而,所解码的数值样本与 原始数值样本是相同的。在其他情况下,用户可能想要针对特定的压 缩比,如2:1或3:1,以便编码数值数据可以通过所期望的带宽传输 或以所期望的容量存储。在第三种情况下,用户可能想要指定少量可 容忍的错误。出于这些原因,编码和解码算法支持一个或多个模式是 所希望的:无损、固定率和固定的质量。可替换的实施例支持三种模 式中的一个或多个,如结合图34和35进一步说明的,利用以下指令:

●SIMD衰减器初始化V_LOAD指令800,

●数据包误差计算指令825,和

●衰减器更新指令740(需要固定速率方式)

再参考图31,主编码循环中有衰减指令820采用的衰减量是由 SIMD衰减器初始化V_LOAD指令800加载的"atten"参数所决定的。 当"atten"值设置为1.0时,衰减指令820不修改将编码的任何数值操 作数。同样地,如果"atten"值被SIMD衰减器初始化V_LOAD指令 800设置为小于1.0,并且然后在压缩处理中永远不会被修改,衰减指 令820将把相同的衰减值(小于1.0)应用到每个将被压缩的样本,这支 持了固定质量模式。在固定速率编码是所需的情况下,"atten"值可能 会更改。数值数据时难以压缩(比可预测的更随机),较小的衰减值去 除每个操作数的更最低有效位,以进一步提高压缩比。同样,当数值 数据容易被压缩(比随机更容易预测),较大的衰减值保留每个操作数 的最低有效位。为了实现固定的输出比特率,"atten"值可以修改,取 决于压缩数组2130中的压缩的数据包的顺序进行(平均)的大小。

图34显示SIMD衰减器初始化V_LOAD指令800加载atten=1.0 的无损模式,而固定的速率和固定的质量模式接收初始atten值(小于 1.0)。图34进一步显示,对于无损和固定质量模式,数据包长度计算 指令825和数据包长度误差计算指令830并非所必需的,因为对于这 些模式,"atten"值不会基于数据包长度或块长度进行修改。最后,图 34显示在每个编码的块大小被计算后,固定的速率编码模式如何利用 以下三个指令来更新"atten"值:

●数据包长度的计算指令825,

●数据包长度误差计算指令830,

●V_UPDATE_ATTEN指令740,在图35中进一步被详述。

图35显示在固定的速率操作期间用于更新"atten"值的指令。在 数据包长度误差被计算后,atten值通过将数据包长度误差的一小部分 (mu)的添加到现有的atten值进行调整。如果仅是编码的包小于目标 包大小,数据包长度误差将是正的并且和衰减值将增加(少衰减)。如 果仅编码的数据包大于目标数据包大小,则数据包长度误差将是负的 且衰减值将降低(更多衰减)。适应常数mu控制衰减器反馈回路的适 应的速率:较小的mu对应于较慢的更新速率、而更大的mu对应于 较大的更新速率。适应常数mu应在{0.0,1.0}范围内,首选值为0.25。

图36提供用于SIMD编码指令的一个交织引用表,其涉及以下 项:

●(第1栏)SIMD编码指令的元素数字,

●(第2栏)SIMD编码指令,

●(第3栏)由SIMD编码指令执行的操作的说明,

●(第4栏)与SIMD编码指令相关的附图列表,

图37提供用于SIMD解码指令的交织引用表,其涉及以下项:

●(第1栏)SIMD解码指令的元素数字,

●(第2栏)SIMD解码指令,

●(第3栏)由SIMD解码指令执行的操作的说明,

●(第4栏)与SIMD编码指令相关的附图列表,

数值编码器(压缩器)和解码器(解压器)的实施例存在多个可替换 的实施方式。实现可以包括逻辑来执行此处所述的过程,其逻辑可以 包括专用逻辑电路,如现场可编程逻辑阵列FPGA块的可佩的逻辑, 配置为执行功能,被编程以执行功能的通用用途的处理器或数字信号 处理器,以及这里的各种组合。上面引用的’312申请描述可配置的、 被多核心处理系统中的应用于数值数据的压缩器/解压器。使用此处所 述的SIMD操作数值的压缩和减压技术可能在申请’312所述的可配置 的压缩器和解压器中实施。

数值的压缩与解压操作可以实现在硬件、软件或两者的组合,并 被列入计算系统。硬件实现包括ASIC、FPGA或知识产权(IP)块。数 值的压缩与解压操作可以在软件或固件在可编程处理器,如数字信号 处理器(DSP)、微处理器、微控制器、多核CPU或GPU上的实现。 压缩的数据数据包可用于在数据处理系统或计算机系统的组件之间 的压缩的数值数据的传输,譬如,在数据处理器和存储器之间,在多 个处理器内核之间,在数据处理系统的存储器之间等。压缩的数据包 也可用于在通信通道或网络上传输数据至存储设备、计算机可读介质 或另一种数据处理系统。

图38是适合应用SIMD操作以压缩和解压的计算机系统的框图。 计算机系统10通常包括至少一个处理器14,其与多个外围设备通过 总线子系统12进行通信。这些外围设备可能包括存储子系统24(包 括存储器子系统26和文件存储子系统28)、用户接口输入设备22、 用户接口输出设备20和通信接口子系统16。输入和输出设备允许用 户与计算机系统10交互。通信接口子系统16提供连接至通信信道或 网络18的接口,其可以是单信道或有多个信道的通信网络。通信信 道或网络18被耦合到在其他计算机系统中的、传输或接收设备中的 或外部网络(未显示)中的相应的接口装置。通信信道或网络18可能包 括有线链接、光链路、无线链接或任何其他信息沟通机制。通信网络 18可能包括许多相互连接的计算机系统和通信链路。在一个实施例 中,通信网络18是互联网,在其他实施例中,通信网络18可能是任 何适合的计算机网络。

用户界面输入的设备22可能包括键盘,指点设备(如鼠标,轨 迹球、触摸板或图形的平板电脑,扫描仪,纳入显示的触摸屏)、音 频的输入的设备(如语音识别系统、麦克风)以及其他类型的输入设 备的触摸屏。一般情况下,使用"输入设备"一词的用意是要包括所有 可能的类型的设备和方法可用于输入信息转化为计算机系统10,可为 我们提供适合的用户输入101。

用户接口输出设备20可能包括显示子系统、打印机、传真机或 非可视显示器等音频输出设备。显示子系统可能包括阴极射线管 (CRT)、液晶显示器(LCD)等平板设备、投影设备或用于创建一个可见 的图像的其他一些机器。显示子系统也可以提供非可视显示,如通过 音频输出设备。一般情况下,使用"输出设备"一词旨在包括所有可能 的设备和方法以输出的信息从计算机系统10给用户或另一台计算机 或计算机系统类型。

存储子系统24存储可能提供对SIMD实施的压缩和/或解压的一 些或全部功能的基本程序和数据结构。这些软件模块一般都由处理器 14执行。

处理器14可能包括一个或多个DSP、微处理器、微控制器、中 央处理单元(CPU)或图形处理单元(GPU)或这些设备组合。处理器14 也可能包含实施一些或所有的压缩和/或减压的功能的专用集成电路 (ASIC)或现场可编程逻辑阵列(FPGA)逻辑。处理器14包括可能充当 SIMD寄存器的寄存器和具有一个或多个流水线站以执行用于上文所 述压缩和解压的SIMD指令。存储器子系统26通常包括大量的存储 器,该存储器包括用于存储在程序执行期间的指令和数据的随机访问 存储器(RAM)30和用于存储固定的指令的只读存储器(ROM)32。 存储器子系统26可能存储用于压缩和解压(譬如,如指数编码表(图 19)和指数译码表(图26)操作)的参数。文件存储子系统28持久性存 储提供程序和数据文件,并可能包括硬磁盘驱动器、软盘驱动器和相 关联的可移动媒体、CD-ROM驱动器、光盘驱动器或可移动媒体盒, 包括带USB接口的通用串行总线(USB)拇指驱动器和闪存存储媒体。 可能由文件存储子系统28存储数据库和执行某些实施方案中的功能 模块。

总线子系统12提供了一个机制,让各种组件和子系统的计算机 系统10彼此通信。虽然总线子系统12被示意为单总线,总线子系统 可替换实施例可以使用多个总线。

计算机可读介质40可以关联于文件存储子系统28,和/或通信接 口子系统16介质。计算机可读介质40可以是硬盘、软盘、CD-ROM、 光学介质、可移动介质盒、USB拇指驱动器,闪存介质存储或电磁波。 计算机可读介质40示出了使用此处所述的SIMD操作来存储一个压 缩的数据文件42的数据压缩。计算机可读介质40可以存储使用SIMD 指令的功能实现压缩和/或减压的程序或库,并可能包括处理器14的 扩展的指令集,该指令集包括用于压缩/解压的程序或库的SIMD指 令。在一些实施例中,压缩/解压的程序或库或扩展的指令集被配置为 特定的硬件配置、硬件配置类或一个或多个硬件加速器。在其它实施 例中,压缩/解压程序或库或扩展的指令集包括支持多个不同的硬件配 置类的硬件配置的组件。

在一个实施例中,通过提供库访问编译器来使用压缩/解压库80, 该编译器将应用程序链接到由程序员选择的库的组件。可以使用指定 的参数的库函数和相应的库文件(例如,具有".lib"文件扩展名、 Windows操作系统的系统,或具有Linux操作系统的系统",所以"文 件扩展名的文件".obj"文件扩展名的文件),使用的参数和执行压缩操 作头文件(例如,具有".h"文件扩展名的文件)完成对库由编译器访问/ 减压,包括至少某些SIMD操作。由编译器将由计算机运行的应用程 序连接的组件存储,可能作为编译的对象的代码,执行由应用程序的 要求。在其他实施例中,库可以包含组件可以动态地链接到应用程序, 和这种动态链接组件存储在计算机的系统内存,可能作为编译的对象 的代码,执行由应用程序的要求。链接或动态链接组件可以包括部分 可能在‘898申请中描述包括用于压缩操作参数应用程序编程接口 (API)的应用程序。

至少一个处理器14包括执行单元,包括配置为执行单指令多数 据(SIMD)指令的逻辑,其包括响应于一个或任意组合的以下指令的逻 辑:

(1)第一SIMD指令(V_DERIV)包含多数据标识符,用于标识多 个操作数,以计算对由多数据标识符,以产生多个差异值操作数标识 多个操作数中的操作数之间的区别。多数据标识符可包含指向SIMD 寄存器的指针寄存器(例如"REG_A"),SIMD寄存器被逻辑用来存储 指令执行中的多个操作数。因为被包含在SIMD寄存器中,多个差异 值可以包含相同数量的结果数据值。结合此处的V_DERIV,所述指 令标识保存N(如四个或八个)操作数的单个的SIMD寄存器,并隐 式或显式地标识用于在目标SIMD寄存器中生成的差异数目N的额外 一个、两个或多个操作数的位置。

(2)第二SIMD指令(V_EXPMAX)包含多数据标识符,以标识多 个操作数来确定由多数据标识符标识的多个操作数的最大指数值。

(3)第三SIMD指令(V_PACK_REG)用于基于最大指数值(例如 响应于V_ECPMAXSIMD指令而确定的)每个所述多个操作数中打 包多个位以形成压缩的数据组,其中压缩的数据组代表多个操作数。

(4)第四SIMD指令(V_DECODE_MANTS)包含标识恒定数据长 度的多个数据值的目标的多数据标识符,其使用一组打包的尾数的指 数,解码并符号扩展用于整形数据的最高有效位以产生由多数据标识 符标识的多数据值,或解码和零填充用于浮点数据类型的最低有效位 以产生由该多数据标识符标识的多数据值。。

(5)第五SIMD指令(V_INTEG)包含多数据标识符,用于标识多操 作数,以计算对由第二标识多数据标识符标识的多个操作数中的操作 数的对的和,以产生多个积分的值操作数。

处理器14可以使用一个或多个SIMD指令来控制,以及其他逻 辑和指令来控制,以执行此处所述的压缩和解压过程。

实现SIMD寄存器和指令集的执行单位因硅供应商而异。一般情 况下,可以使用控制可编程逻辑的微代码指令实现SIMD。在一个实 施方式中,现有的的与英特尔SSESIMD指令集一起使用128位的寄 存器也可以用于存储执行冗余去除器1801和封隔器位1802的指令操 作数。新SIMD指令的实施方式,例如那些列在图36和37中的,仍 然需要规范的一个或多个输入操作数(多数据标识符或寄存器指针)和 存储结果(输出)操作数(寄存器指针)的位置。指定输入和输出寄存器 可能是相似的或甚至可能完全相同,使用现有的SIMD指令如何制定 输入和输出的寄存器操作数。新的指令将包括新的、独特的操作码, 它指定新的操作。当调用时新SIMD操作码(指令)时,对应于新的操 作码(指令)的组合逻辑会访问一个或多个输入操作数从现有的SIMD 寄存器中。一旦结果是由新指令的组合逻辑生成的,结果将被存储在 指定的SIMD输出寄存器中。因此每个新的SIMD操作码(指令)通常 (但不是限于)可能伴随着用于新指令的专用逻辑,这将在执行相应的 SIMD操作码时被使用。现对于给定操作码(指令),硬件加速器实, 尽可能的提高新指令的速度和/或减少延迟。通过修改组合逻辑的流水 线阶段的数目,来修改每个新SIMD指令的速度和延迟。除了或代替 现有的SIMD寄存器,新的SIMD指令的其他实现可以使用专用的输 入和输出寄存器中。

虽然本发明的优选实施方案已经进行了说明和描述,但明确的是 本发明并不局限于这些实施例。对于本领域技术人员来说,大量修改、 更改、变更、替换和等同将是明显的,而不脱离本发明的范围与思想。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号