CN108122189A - 硬件中的顶点属性压缩和解压缩 - Google Patents
硬件中的顶点属性压缩和解压缩 Download PDFInfo
- Publication number
- CN108122189A CN108122189A CN201711227740.9A CN201711227740A CN108122189A CN 108122189 A CN108122189 A CN 108122189A CN 201711227740 A CN201711227740 A CN 201711227740A CN 108122189 A CN108122189 A CN 108122189A
- Authority
- CN
- China
- Prior art keywords
- data
- value
- block
- dictionary
- vertex
- 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.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T1/00—General purpose image data processing
- G06T1/20—Processor architectures; Processor configuration, e.g. pipelining
Landscapes
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Compression, Expansion, Code Conversion, And Decoders (AREA)
Abstract
本公开的一个或多个实施例提供了源数据压缩中使用的设备以及用于源数据压缩的方法,所述设备包括存储器和至少一个处理器。存储器被构造为存储顶点属性数据和指令集。处理器耦接至存储器。处理器被构造为接收包括与所述顶点属性数据对应的一个或多个值的源数据流。处理器还被构造为提供针对源数据流中的一个或多个值的字典,其中字典包括与源数据流中的一个或多个值相对应的多个索引值。处理器还被构造为用多个索引值中的相应索引值来替代源数据流中的一个或多个值中的至少一些值。
Description
相关申请的交叉引用
本申请要求于2016年11月29日提交的美国临时专利申请No.62/427,587以及2017年2月14日提交的美国专利申请No.15/432,782的优先权。以上确认的专利申请的全部内容通过引用并入本文。
技术领域
本公开主要涉及数据压缩。更具体地,本公开涉及硬件中的顶点属性压缩和解压缩。
背景技术
计算机图形中使用多边形以组成物体。多边形通常由几何数据定义。几何数据可以包括两个不同的数据集。可以被称为顶点属性数据的第一数据集指定多边形的各个顶点。顶点属性数据也可以包括多边形的附加的数据项。第二数据集可以包括顶点的连接信息。连接信息指定哪些顶点形成给定物体的不同多边形。在图示中,可以使用被称为网孔(mesh)的多个多边形来表示例如球的物体。为了创建例如运动的视觉效果,随着时间改变形成球的多边形的诸如形状、位置、指向、纹理、颜色、亮度等的特征。
在产生视觉效果时,几何图形数据可以由图形处理单元(GPU)多次操作。考虑例如球的物体通过空间移动的示例。形成球的多边形可以由GPU连续地操作以产生球的运动效果。除其他操作外,例如,形成球的多边形的顶点的坐标可以被连续地改变以产生运动效果。因此,几何图形数据多次流过GPU的图形流水线,以支持这种处理。图形流水线是指由GPU为了给出三维场景的二维栅格表示而执行的处理或步骤的序列。
GPU将图形数据从存储器并通过图形流水线移动。包括多边形的顶点属性数据的几何图形数据消耗大量的存储器带宽。鉴于对包括游戏在内的各种应用程序的高质量图形的需求,对图形应用程序的已经很高的存储器带宽需求可能还会增加。
发明内容
本公开提供了硬件中的顶点属性压缩和解压缩。
本公开的第一实施例提供了一种设备,其包括存储器和至少一个处理器。存储器被构造为存储源数据和指令集。至少一个处理器耦接至存储器。所述至少一个处理器被构造为执行指令集以接收包括与顶点属性数据对应的一个或多个值的源数据流。所述至少一个处理器还被构造为执行指令集以提供针对源数据流中的一个或多个值的字典,其中字典包括与源数据流中的一个或多个值相对应的多个索引值。所述至少一个处理器还被构造为执行指令集以用多个索引值中的相应索引值来替代源数据流中的一个或多个值中的至少一些值。
本公开的第二实施例提供了用于源数据压缩的方法。所述方法包括接收源数据流,所述源数据流包括与存储在存储器中的顶点属性数据相对应的一个或多个值。所述方法还包括提供针对源数据流中的一个或多个值的字典,其中字典包括与源数据流中的一个或多个值相对应的多个索引值。所述方法还包括用多个索引值中的相应索引值来替代源数据流中的一个或多个值中的至少一些值。
根据下面的附图、说明书和权利要求书,其他技术特征对本领域技术人员而言可以是显而易见的。
在描述下面的具体实施方式之前,阐述本专利文件全文使用的某些词和短语的定义可能是有利的。术语“耦接”及其派生词是指两个或更多个元件之间的任何直接或间接的通信,无论那些元件是否彼此物理接触。术语“发送”、“接收”和“通信”及其派生词包含直接通信和间接通信两者。术语“包括”和“包含”及其派生词意味着包括但不限于。术语“或”是包括性的,意味着和/或。短语“与……相关联”及其派生词意味着包括、被包括在……之内、与……互连、包含、被包含在……之内、连接到……或与……连接、耦接到……或与……耦接、与……可通信、与……配合、交错、并列、与……接近、接合到……或与……接合、具有、具有……的性质、与……有关等。术语“控制器”意味着控制至少一个操作的任何装置、***或其部分。可以在硬件或硬件和软件的组合和/或固件中实现这种控制器。与任何特定控制器相关联的功能可以是集中的或分散的,无论是本地还是远程。短语“……中的至少一个”当与项目列表一起使用时,意味着可以使用所列项目中的一个或多个的不同组合,并且可能仅需要列表中的一个项目。例如,“A、B和C中的至少一个”包括以下组合中的任一项:A、B、C、A和B、A和C、B和C、以及A和B和C。
而且,可以通过一个或多个计算机程序实现或支持以下所述的各种功能,每个计算机程序由计算机可读程序代码形成并且在计算机可读介质中实现。术语“应用程序”和“程序”是指适用于在适当的计算机可读程序代码中实现的一个或多个计算机程序、软件部件、指令集、过程、功能、对象、类、实例、相关数据或其部分。短语“计算机可读程序代码”包括包含源代码、目标代码和可执行代码在内的任何类型的计算机代码。短语“计算机可读介质”包括能够由计算机访问的任何类型的介质,例如只读存储器(ROM)、随机存取存储器(RAM)、硬盘驱动器、光盘(CD)、数字视频盘(DVD)或任何其它类型的存储器。“非暂时性”计算机可读介质不包括传输暂时的电信号或其他信号的有线、无线、光学或其他通信链路。非暂时性计算机可读介质包括其中可以永久存储数据的介质以及其中可以存储数据并以后盖写数据的介质,诸如可重写光盘或可擦除存储器装置。
本专利文件全文中提供了其他某些词语和短语的定义。本领域普通技术人员应当理解,在许多(如果不是大多数)情况下,这样的定义适用于这样定义的词语和短语的先前以及将来的使用。
附图说明
为了更全面地了解本公开及其优点,现在参考以下结合附图进行的描述,其中:
图1示出了根据本公开的示例用户设备(UE);
图2示出了根据本公开的实施例的示例性图形部件的框图;
图3示出了根据本公开的实施例的图2所示的写入电路的示例性实施方式的框图;
图4示出了根据本公开的实施例的图2所示的读取电路的示例性实施方式的框图;
图5示出了根据本公开的实施例的压缩顶点缓冲区的示例性布局的框图;
图6示出了根据本公开的实施例的用于解压缩的处理;
图7示出了根据本公开的实施例的用于创建字典的处理;
图8示出了根据本公开的实施例的用于字典在压缩期间的使用的处理;以及
图9示出了根据本公开的实施例的用于压缩的处理。
具体实施方式
以下讨论的图1至图9以及用于描述本专利文件中的本公开的原理的各种实施例仅作为说明,并且不应以任何方式解释为限制本公开的范围。本领域技术人员将理解,本公开的原理可以在任何适当布置的图形***中实现。
图1示出了根据本公开的示例UE 100。图1中示出的UE 100的实施例仅用于说明。然而,UE具有各种构造,并且图1不将本公开的范围限制为UE的任何特定的实施方式。
如图1所示,UE 100包括天线105、无线电频率(RF)收发器110、发送(TX)处理电路***115、麦克风120和接收(RX)处理电路***125。UE 100还包括扬声器130、中央处理单元(CPU)140、图形处理单元(GPU)141、输入/输出(I/O)接口(IF)145、输入150、显示器155和存储器160。存储器160包括基本操作***(OS)程序161和一个或多个应用程序162。
RF收发器110从天线105接收由网络的eNB发送的传入的RF信号。RF收发器110将传入的RF信号下变频以产生中频(IF)或基带信号。IF或基带信号被传送至RX处理电路***125,RX处理电路***125通过对基带或IF信号进行滤波、解码和/或数字化来产生处理后的基带信号。RX处理电路***125将所处理的基带信号发送至扬声器130(例如针对语音数据)或发送至CPU 140以进行进一步处理(例如针对网页浏览数据)。
TX处理电路***115接收来自麦克风120的模拟或数字语音数据或来自CPU 140的其他传出的基带数据(例如网页数据、电子邮件或交互式视频游戏数据)。TX处理电路***115对传出的基带数据进行编码、多路复用和/或数字化以产生处理后的基带或IF信号。RF收发器110从TX处理电路***115接收传出的所处理的基带或IF信号并且将基带或IF信号上变频为经由天线105发送的RF信号。
CPU 140可以包括一个或多个处理器或其他处理装置并且执行存储在存储器160中的基本OS程序161,以便控制UE 100的总体操作。例如,CPU 140可以根据众所周知的原理来控制通过RF收发器110、RX处理电路***125和TX处理电路***115的正向信道信号的接收和反向信道信号的发送。在一些实施例中,CPU 140包括至少一个微处理器或微控制器。
CPU 140还能够执行驻留在存储器160中的其他处理和程序。CPU 140可以根据正在执行的处理的需要而将数据移入或移出存储器160。在一些实施例中,CPU 140被构造为基于OS程序161或响应于从eNB或操作者接收的信号来执行应用程序162。CPU 140还耦接到I/O接口145,I/O接口145向UE 100提供连接到诸如便携式计算机和手持计算机之类的其它装置的能力。I/O接口145是这些附件和CPU 140之间的通信路径。
CPU 140还耦接至输入150和显示器155。UE 100的操作者可以使用输入150来将数据输入至UE 100中。输入150可以是触敏屏幕、键盘、鼠标、游戏手柄、操纵杆、生物反馈装置等。显示器155可以是液晶显示器或能够呈现(例如来自网站的)文本和/或至少有限的图形的其他显示器。
GPU可以包括一个或多个处理器或其他处理装置并且被设计为快速地操纵和更改存储器160以加速在用于输出到显示器的帧缓冲区中的图像的创建。GPU 141可以负责数据压缩和/或解压缩。GPU 141可以与CPU 140分离,或者在一些实施例中,GPU 141可以是CPU140的一部分。
存储器160耦接至CPU 140和GPU 141。存储器160的一部分可以包括随机存取存储器(RAM),并且存储器160的另一部分可以包括闪速存储器或其他只读存储器(ROM)。
如下面更详细地描述的,在GPU上运行的图形应用程序中使用的几何通常被定义为网孔。这些网孔由两个数据集组成:顶点或点;以及定义由这些顶点组成的多边形的连接信息。该几何数据通过GPU流水线一次或多次流动,因此构成了存储器流量的重要部分。随着越来越复杂且开放世界的游戏变得流行,几何复杂性很可能会在GPU上的存储器流量中占有越来越大的份额。
顶点通常利用顶点缓冲区(VB)加载到GPU上,而连接信息在索引缓冲区(IB)中定义。顶点缓冲区在每个顶点处使用具有特定值的数来定义顶点的特性(称为属性)。这些属性通常包括使用单精度浮点数定义的(通常在3D空间中的)位置等等。这个顶点属性数据可以由GPU硬件如IB所规定的那样以及GPU选择呈现对象的方式以任意顺序访问。
这些属性在多个属性上的统一特征是重复使用,因为多个顶点和属性可以重复使用相同的值。可以通过减少属性值和保真度的变化来简化复杂的网孔,再次导致属性值的重复使用。该数据的另一方面是属性值的重复使用可能在相邻顶点的小窗口内,从而可以在局部区域中进行对冗余数据的搜索。
尽管图1示出了UE 100的一个示例,但是可以对图1做出各种改变。例如,可以组合、进一步细分或省略图1中的各部件,并且可以根据特定需要添加额外的部件。作为特定示例,尽管图1示出了被构造为移动电话或智能手机的UE 100,但是UE可以被构造为作为其他类型的移动或固定装置来操作。
图2示出了根据本公开的实施例的示例性图形部件205的框图。图2中示出的图形部件205的实施例仅用于说明。在不脱离本公开的范围的情况下可以使用其他实施例。部件205可以是图1所示的GPU141的至少部分的一个示例。
在图2中,部件205耦接至存储器220和存储器225。在图2的示例中,***205包括写入电路210和读取电路215。在该示例中,写入电路210和读取电路215作为分离的单元被示出。在其他示例实施例中,电路210和215可以是同一部件的一部分。
图形部件205可以一次对一个或多个多边形进行操作。部件205被构造为执行关于几何图形数据的操作。在一个特定示例中,部件205被构造为对顶点属性数据执行操作。
顶点被定义为几何的基本单元,并且直观地是空间中的点。顶点的组合用于创建基元(primitive)。例如,一个顶点创建点基元,两个顶点创建线段,而三个顶点创建三角形。属性或矢量属性定义顶点的特性。例如,最常见的属性是位置,其定义空间中顶点的位置。属性的其他示例包括颜色、纹理坐标等。
顶点属性数据可以包括一个或多个矢量属性。每个矢量属性可以包括若干标量分量或由若干标量分量形成。在一个示例中,矢量的标量分量的数量被限定为4,但是本公开中所述的实施例不受矢量中包括的标量分量的数量的限制。例如,矢量可以包括大于或小于4个标量分量。
矢量属性的示例可以包括或指定位置、颜色、纹理等。在位置属性的情况下,例如,属性可以由3个标量属性形成。矢量属性在本文中可以被称为“属性”。标量属性可以是x坐标、y坐标和z坐标。标量属性是定义顶点属性的全部或部分的数值。
在本公开的一个或多个实施例中,计算机图形应用程序中使用的顶点属性数据是以多个矢量属性的方式来定义的,其中每个矢量属性由底层数据类型的1到4个数组成。该底层数据类型可以是32位单精度浮点(称为float或fp32)。常见的fp32属性的示例是顶点的三维位置以及二维纹理坐标。例如有符号或无符号整数的其他数据类型也用于顶点属性。
每个矢量属性由一个、两个、三个或四个标量属性组成,每个标量属性是1、2或4字节的数值。例如,3D空间中的位置由3个标量x、y和z组成,每个标量可以表示为fp32(或C/C++中的float数据类型)值。对于颜色,例如,标量属性可以是红色值、绿色值和蓝色值(RGB值)。
标量是可容纳到32位内的一个或多个标量属性的合并。如果标量的尺寸小于32位,则标量总是一个矢量属性中可以在一个32位值中容纳的最大数量的标量属性。例如,类型为fp32的三个标量属性构成三个标量,而如果类型为fp16,则它们可以构成两个标量,第一个包含前两个标量属性(x,y),第二个包含16位“z”。
在本公开中,术语“分量”是指顶点属性数据的矢量的单独的项目。每个分量可以是标量属性。可以使用任何各种不同的数据类型来指定分量。术语“数据类型”是识别数据的各种类型之一的分类。分量的示例性数据类型可以包括但不限于浮点、固定点、整数、布尔(Boolean)、字符串和/或类似物。其它的示例可以包括特定位宽度或精度的一种或多种或其它数据类型。在一个或多个实施例中,使用相同的数据类型指定相同分量类型的分量。因此,使用相同的数据类型指定x坐标。使用相同的数据类型指定y坐标,等等。
通常,写入电路210可以接收顶点属性数据。可以将顶点属性数据作为源数据流来接收(例如从存储器220或其他源接收)。作为写入的一部分,写入电路210可以将顶点属性数据处理为k个顶点的块(block),其中k是两个或更多个。例如,可将k设置为等于2、4、8、16、32等。写入电路210可以选择顶点属性数据的多个顶点(例如k个顶点)并以每组为基础形成数据包(packet)。块是一组顶点的所有输入矢量属性的集合。块可以由一组数据包组成。数据包是构成块的一组顶点的标量的集合,其中标量由一个矢量属性中的特定标量属性组成,其中从块中的所有顶点得到相同的特定标量属性。写入电路210可以压缩顶点属性数据并且将压缩后的顶点属性数据写入存储器225。写入电路210还可以创建字典以压缩输入源数据。
读取电路215可以从存储器225获取压缩的顶点属性数据。读取电路215可以将从存储器225获取的顶点属性数据(例如块和/或其一部分)解压缩。读取电路215可以将得到的解压缩的顶点属性数据或其一部分存储在存储器220中。读取电路215可以将得到的解压缩的顶点属性数据存储在存储器220中,以供诸如图形***的另一***使用或消费。
在一个示例中,存储器220和存储器225被实现为随机存取存储器(RAM)。在不同的示例实施例中,存储器220和225还可以被实现为存储器子***中的高速缓冲区、被实现为静态RAM(SRAM)或动态RAM(DRAM)。在一个示例实施例中,存储器225和存储器220可以是同一存储器元件的部分,但只是位于所述存储器元件中的不同位置处。在另一实施例中,存储器220和225可以是分离的存储器元件。
在另一示例实施例中,写入电路210可以从可以是DRAM的存储器中读取,并且将输出写入可以是同一DRAM或第二存储器位置的存储器(例如内部存储器)。然后,读取电路215可以从同一DRAM或第二存储器位置(输出被写入的任何地方)读取,并将输出写入其数据被读取的相同的存储器或第三存储器位置。一个示例提供了读取电路215以将解压缩的输出直接传递到GPU固定功能单元。
部件205可以被实现为耦接到印刷电路板或其它电子平台的各种电路部件和/或IC。例如,部件205可被实现在图形处理卡等的内部或者作为图形处理卡等的一部分来实现。部件205可以并入在更大的数据处理***中,例如计算机、游戏***等。在另一示例性实现方案中,部件205可以并入处理器内。例如,GPU可以将部件205包括在其中以促进顶点属性数据的更有效的处理。
图3示出了根据本公开的实施例的压缩器300的示例性实现方案的框图。压缩器300可以是由诸如CPU 140或GPU 141之类的处理装置待执行的指令集。在其他实施例中,压缩器300的一个或多个部件可以被实现为如图2所示的部件205的一部分。图3中示出的压缩器300的实施例仅用于说明。在不脱离本公开的范围的情况下,可以通过使用硬件、软件或其组合而使用任何实施例。
在图3中,压缩器300可以被构造为经由信号335接收压缩请求。压缩器请求可以指定待写入至存储器303的顶点属性数据。响应于压缩请求,块汇编器310可以创建顶点的块。例如,块汇编器310可以产生k个顶点的块,其中每个块可以包括至少两个顶点。k的值也可以被指定为以解压缩形式存储在存储器302中的顶点属性数据的顶点i至顶点j。因此,创建块的指令指示要在待创建的块中包括哪些顶点。响应于块创建指令,块汇编器310可以请求针对顶点属性数据的属性布局。更特别地,块汇编器310可以请求针对待包括在块内的特定顶点的顶点属性布局。块汇编器310可以接收顶点属性布局。顶点属性布局例如可以指定对于待包括在块内的每组顶点必须存在的特定矢量属性以及构成这些矢量属性的标量属性。
利用顶点属性布局,块汇编器310可以确定将在针对顶点i至顶点j中的每一个的顶点属性数据中包括的特定属性。块汇编器310可以确定要在针对顶点i至顶点j的块中包括的数据包的数量。块汇编器310可以指示数据包汇编器315来创建针对顶点i至顶点j的数据包。
数据包汇编器315可以请求针对顶点i至顶点j的顶点属性数据。数据包汇编器315响应于接收针对顶点i至顶点j的顶点属性数据,可以产生提供给本地块缓冲区330的一个或多个数据包。在一个或多个实施例中,每个数据包包括可以驻留在标量中的一个或多个标量属性。数据包可以在本地块缓冲区330内累积,直到该块完整。数据包汇编器315可以通知块汇编器310该块的(多个)数据包在本地块缓冲区330内准备好用于进行压缩。
字典产生器325可以从本地块缓冲区330接收块。块汇编器310可以向字典产生器325指示开始块的压缩。因此,数据包汇编器315可以被构造为向块汇编器310通知数据包准备好被压缩。块汇编器310响应于来自数据包汇编器315的通知可以通知字典压缩器327开始压缩。数据包可以按顺序压缩,以便在所得到的压缩数据内维持数据包位置。
字典压缩器327可以使用来自字典缓冲区326和具有字典缓冲区326的本地块缓冲区330的信息(例如,通过执行用于使用字典、实现运行长度编码等的一个或多个公开技术)来对块进行压缩和排序。字典压缩器327可以输出压缩的数据作为压缩输出320。
压缩器300还可以产生提供给存储器303的元数据。元数据可以是允许以随机或接近随机的顺序访问压缩数据的辅助信息。字典产生器325还可以向存储器303提供用于块的压缩的字典(如下面针对图4更详细地描述的)。响应于完成压缩的指示,压缩器300可以将元数据和字典写入存储器303。在一个方面中,压缩输出320可以将元数据写入存储器303的第一区并且将字典写入存储器303的第二且不同区。
在一个方面中,元数据可以包括索引数组。例如,索引数组可以将块和其中的数据包映射到存储器303中存储块的存储器位置。索引数组可以包括n位描述符,其表示加载以获得压缩块的m个字节的数的倍数。可以被容纳在m个字节的块中的描述符的数量为(8*m)/n,其中m的单位是字节,n的单位是位。例如,使用高速缓存线的尺寸,其中m为64字节,n为4位,可以根据“尺寸=m*2个描述符=64*2个描述符”来确定尺寸。
图4示出了根据本公开的实施例的解压缩器400的示例性实现方案的框图。图4中示出的解压缩器400的实施例仅用于说明。在不脱离本公开的范围的情况下可以使用任何实施例。在一个示例实施例中,解压缩器400可以是图2中所示的读取电路215。
在图4的示例中,解压缩器400可以被构造为经由信号401接收解压缩请求。解压缩器400可以被构造为从存储器402接收(例如获取)字典。所接收的字典用于将从存储器402获取的压缩块进行解压缩。应当理解,字典仅需要在每个顶点缓冲区中被获取。例如,字典可以被加载一次,并且在使用一个顶点缓冲区时在字典缓冲区420中保持一段延长的时间段。
控制器405可以被构造为接收解压缩请求。响应于解压缩请求,控制器405可以被构造为经由信号434请求元数据高速缓存区415以确定元数据高速缓存区415是否包括元数据的部分,所述元数据的部分是将由解压缩请求指定的地址(例如,第一地址)转化为存储器402内的指定压缩数据的第二地址所需的部分。
在实施例中,根据元数据高速缓存区415的尺寸,可能需要多次获取元数据。元数据内使用的寻址可以是线性的。条目(entry)的尺寸例如可以是常数,并且可以包括基地址和被指定为若干高速缓存线的块的尺寸。在另一方面,基地址可以是已知的先验值,在这种情况下,元数据可以仅指定尺寸。在一个示例中,每个压缩块例如可以以被确定为(已知基地址)+(未压缩块的块ID*尺寸)的地址开始。针对块的元数据的地址可以被指定为元数据基地址加上块ID和元数据行的尺寸的乘积。元数据高速缓存区415知道所请求的地址是否存在于其中,即是否被本地地存储在元数据高速缓存区415中。如果是,则元数据高速缓存区415将所请求的地址的元数据提供至控制器405。如果不是,则元数据高速缓存区415可以将元数据请求传送至存储器402。
响应于元数据请求,元数据高速缓存区415可以接收元数据响应。元数据高速缓存区415可以将所接收的元数据(例如,索引数组)提供至控制器405。使用所接收的元数据,控制器405可将接收到的解压缩请求中指定的第一地址转化为压缩块存储在存储器402中的第二地址。控制器405可以被构造为将解压缩请求传送至存储器402。从控制器405到存储器402的解压缩请求可以指定指示待获取的特定压缩块的第二地址。
元数据可以每个压缩块包括一行数据。参考图3,例如,参考上述示例,每个块可以由压缩器300存储在存储器区域中,该区域具有m的高速缓存线尺寸的倍数的尺寸。可以将数据作为一个或多个高速缓存线从存储器402(例如,RAM)中获取。在最坏的情况下,块可能需要存储的高速缓存线的数量为块的未压缩尺寸。可以使用描述符位来表示高速缓存线的数量。通常,可以使用添加到元数据的描述符位来表示压缩块的尺寸。
例如,如果针对顶点i、属性j接收到请求,则可以执行元数据查找。所需的块ID可以表示为floor(i/<#vertices per block>)。结果值是小于或等于顶点i除以块中的顶点数的最大整数值。块ID可以用作在元数据的索引数组中被访问的行。根据索引数组可以确定从其读取所请求的压缩块的存储器402中的基地址。使用描述符位,可以确定待请求的高速缓存线的数量。块解码器425可以使用从字典缓冲区420提供的字典来将压缩块解压缩。块解码器425可以将解压缩的数据包输出至数据包解码器410。
字典缓冲区420可以将字典提供至数据包解码器410。如上所指出的,数据包解码器410可以接收从块解码器425请求的块。数据包解码器410可以接收元数据。在一个方面中,根据接收到的元数据,数据包解码器410可以确定是否需要对数据包执行解码和(如果需要)待执行的特定解码。数据包解码器410可以使用元数据来对接收到的块的数据包进行解码(如果需要的话)。数据包解码器410可以使用元数据选择性地对块的(多个)数据包进行解码,并将解压缩的顶点属性数据输出至取消排序(unsort)解码器411,其可以对数据取消排序然后将解压的数据提供至存储器403。
如上所指出的,例如,数据包解码器410可以根据元数据确定数据包是未压缩的还是压缩的。此外,在另一方面中,数据包解码器410可以根据元数据确定应该写入顶点属性数据的特定输出形式。
在另外的方面中,数据包解码器410可以提供所期望数据的偏移。使用该偏移,请求***可以索引到未压缩的块中以定位最初请求的数据。
如将在下文更详细描述地,本公开的实施例通过创建最常用值的有限尺寸的字典来获取遍及顶点缓冲区(VB)的重复使用。然后在数据流中,由字典索引替代这些值的出现。
一个示例性实施例提供使用运行长度编码(RLE)对值的连续出现进行编码。例如,如果值1.35出现4次,则不是保留该值的4个复制品,而是将其替换为元组(4,1.35),其指出该值存在四个连续的出现。
该示例实施例还可以将分区VB数据提供给顶点块中,其中每个块则包含那些顶点的所有相关属性。每个这样的大块(chunk)还被细分成数据包,其中每个数据包包含针对块中的所有顶点的矢量属性的一个或多个标量属性分量。
本公开的实施例可以以任意次序对每个数据包内的数据进行排序,以允许更长运行的数据引用。在不同的实施例中,可以以特定或指定的顺序在每个数据包内执行排序。
***可以用二进制字典索引来代替预先计算的字典内存在的数据流中的任何值,因此对于N条目字典,该值可以由ceil(log2(N))位索引代替,其中ceil(x)函数返回大于或等于x的下一个整数。在不同的示例中,该值的位数可以是但不限于8、16、24、32、64等。本文所述的***可以对源数据流使用字典。本公开中的字典可以对单个VB使用或在各个VB之间共享。
来自***的压缩数据流可能不具有可变长度编码的分量;所有部分的位宽是已知的先验值,或者其可以在相关部分被读取之前根据数据流的先前部分被确定。压缩数据流纯粹由固定宽度的二进制数组成,尽管宽度不同。相比可变长度的位编码方案,这可以在每个周期需要多个解压缩值(即,每个周期k个值的解码吞吐量,k>1)的情况下简化解码器硬件。
图5示出了根据本公开的实施例的压缩的顶点缓冲区500的示例性布局的框图。图5中示出的顶点缓冲区500的实施例仅用于说明。在不脱离本公开的范围的情况下可以使用其他实施例。
在图5的示例中,顶点缓冲区500包括被压缩的矢量数据502和元数据504。被压缩的矢量数据502可以由块506至510构成,每个块包括若干数据包512至516。
图5由两条信息组成:数据502和元数据504。如名称所示,数据502是实际的被压缩的矢量属性,而元数据504是允许以随机次序访问压缩数据的辅助信息。
被压缩的矢量数据502以分层的方式组织,其中块506至510是最粗级别(一起被压缩和解压缩的实体)以及其下面的数据包512至516。给定为每个顶点定义的一组属性,块包含连续范围的顶点的所有属性,其中可以根据期望设置范围的大小,但可以限制为几个值(例如,2的幂,例如,4、8、16或32),并且被称为大块尺寸(或chunkSize)。因此,块“i”包含针对顶点(i*chunkSize)至顶点((i+1)*chunkSize)(不包括此点)的属性数据。
每个块包含一组数据包,每个数据包包含针对一个标量(不是标量属性)的数据。数据包以标量数组开始,其中数组长度为chunkSize。压缩器可以将每个数据包转变为以下三种类型之一:未压缩,其中数据包516保持长度为chunkSize的未修改的标量数组;无排序的压缩,其中使用RLE和常用的标量值的字典的组合来压缩数据包514;排序的压缩,其中数据包512首先被排序,之后应用REL和字典方法。
为了简化,任何块可以仅包含单个类型的数据包。否则,每个数据包的类型也必须在开始时被编码到块中。以下描述涉及这个简化的实施例,然而可以将各种实施例扩展成包括块内的数据包类型的不同。
本公开的实施例可以使用RLE用于进行压缩,如数据包512和514中所示,其中流中的值的连续出现可以用“双(pair)”(出现次数,值)代替,并且该双被有效地编码以用于更大的节省。一般来说,大多数自然出现的数据偏向于短的运行长度,较长的运行长度并不常见。
在实施例中,RLE被设计为选择压缩出现频率的平衡。例如,2的运行长度可能是非常常见的,但是由于必须与数据一起存储的额外的运行长度,它们还将导致小于2X的压缩比。可替代地,8或16的较长运行长度可能更少,但也提供显著更高的压缩比。本公开的实施例使用数据包512至516内的RLE来跟踪其内的值的连续重复使用,因为连续重复使用的概率在数据包内是最高的。
在一个实施例中,如数据包512和514中所示的字典方法依赖于创建输入数据的直方图,也就是指出每个唯一值在输入中出现的次数的表格。然后按照频率的降序对直方图进行排序,之后针对某个固定的n,将前n个值用作字典。在另一个示例实施例中,可以在对输入数据(排序或无排序)进行运行长度编码之后创建字典,以便使输出数据流中的压缩最大化。
这些值可以在数据流中表示为到字典的索引(纹理命名法中也称为调色板)以及指向字典本身的使用的附加元数据,因为字典不包含所有值,必须将指出下一个读取值是字典索引还是普通数据的一些指示添加到压缩数据流。
只要可以使用比数据本身少很多的位来表达到字典的索引,那么通过字典方法获得的压缩是有价值的。这些索引可以被表示为固定宽度的二进制值或可变长度的代码。为了简化硬件,本公开的实施例纯粹依赖于固定宽度二进制索引,尽管替代实施例可以使用可变宽度索引。
如数据包512所示,以任何次序(升序、降序或类似顺序)进行排序确保了相同唯一值的复本开始在输出流中的相同相邻邻域中出现。这确保了运行长度被最大化,从而增加了压缩。
当使用排序来重新创建原始输入流时,数据的原始次序也可以在流中被编码(在本公开中称为取消排序信息/元数据)。
图5还示出了包括标头520和数据522的元数据504的示例。可以以4位来组织数据522:指示块所在的位置的1位sortEn 524以及指示要获取的高速缓存线的数量的3位nCachelines 526。该实施例包括仅获取八个高速缓存线的隐含假设,元数据504可以被推广为ceil(log2(k))位,其中块的最大尺寸是k个高速缓存线,则总的元数据条目将是(1+ceil(log2(k)))位。
对于每个块都存在一个这样的元数据条目。该组织被设计为与存储器子***进行交互,其通常以可以在存储器子***中的一个操作中获取和修改的高速缓存线的粒度(即,对齐的数据大块:32或64字节)有效地运行。该元数据设计被优化以最小化其尺寸,从而最小化其元数据开销,因此在该实施例中,这为512字节的数据消耗0.5字节,小于0.01%的开销。
在该实施例中,块506至510在其直观存储范围的开始处存储,即对于块i,基地址是i*sizeOfBlockInCacheLines。这允许获取计算被简化。替代实施例可以提供打包在一起的块。在这样的替代实施例中,元数据条目可以包含基地址和待获取的高速缓存线的数量。
用于矢量缓冲区500的字典在元数据的开始处被打包在标头520中。由于字典中条目的数量是固定的先验值,因此针对字典获取的字节数本质上是条目数和条目尺寸的乘积,其中每个条目的尺寸被预期为是32位,这是因为fp32数据就是那个尺寸,但其他尺寸也是可能的,并且可以被使用。该字典被组织成简单的数组,其中以C编程语言中的dict[index]来访问值。
除了字典之外,还需要某个标头520元数据来协助也与字典一起存储的解码器。标头520可以包括以字节为单位的每个标量的尺寸,这有助于定义每个数据包产生的未压缩数据的量,并且还可以包括未压缩顶点的尺寸或者所有启用的标量的前字段的总和。
元数据504的第一字段允许解码器检测其已到达特定数据包的末端。在矢量缓冲区500中活动的标量的数量是作为状态传统地传递到解码器的信息,或者以其他方式也可以被打包到元数据504中。未压缩顶点的尺寸(通过乘以chunkSize)也直接转化为未压缩块的尺寸。需要此尺寸来检测块是否是未压缩的,如果针对块待获取的高速缓存线的数量与未压缩块将占据的高速缓存线的数量相同,则块必须保持未压缩,因为在能量或性能方面压缩该块所获得的好处很小。
如上所述,三种类型的数据包存在于矢量属性压缩中:未压缩、不排序的压缩以及排序的压缩。未压缩数据包516可以包括标量数组530。字段表示的一个示例可以是data[chunkSize][k:0],其中函数包括数据数组,其中每个条目是(k+1)位宽。不使用排序的压缩数据包514包括RLE前缀信息540的集合,随后是数据或字典索引542。为了降低从高速缓存线获取数据的硬件复杂性,所有前缀540被聚集成集合,以使得它们的尺寸为最小尺寸(在这种情况下为4位)的倍数。如果前缀540的数量不是该集合尺寸的倍数,则该数被舍入到下一个倍数。解码器硬件预计会检测chunkSize值被读取的时间,并且在该时间点停止读取流,因为数据条目的数量未被填充。
运行长度前缀(RLP)可以包括作为字典启用位的dictEn[0:0]字段。如果该位为1,则数据条目为4位字典索引,否则为k位数据值。其中k可以是但不限于8位、16位、24位、36位、64位等之一。一个示例字段可以是作为指出运行长度的列举的runLength[m:0]。m==1时的示例列举为00→1、01→2、10→4、11→chunkSize。在一个示例实施例中,对于2位RLP,将一组四个相邻的RLP称为RLP集合544。对于具有不同位宽的运行长度,可以使用每个集合的不同数量的RLP。例如,如果runLength为4位的数,则RLP集合可以是一个RLP。
对于RLP集合544中的每个RLP 540,dictEn位指出该值是到字典的索引542dictIdx[(n-1):0](对于包含2n个条目的字典)还是未压缩数据值530data[(k-1):0]。RLP集合544的数量使得它们的运行长度的总和加起来达到大于或等于chunkSize的数。然而,解码器硬件可以只是解析和解释RLP直到运行长度之和加起来恰好达到chunkSize为止。即使RLP被填充到四的倍数来创建离散的RLP集合,数据和字典索引可以直到满足期望的定量(例如4字节边界)之前不会用零个或多个额外的位/字节/字(适当的话)扩充。例如,如果有效运行的数量为10,则压缩数据包将包含三个RLP集合中的十二个RLP。可以共有十个数据条目和字典索引。
排序的压缩的数据包512包含在任何RLP或数据之前的在数据包的开始处添加的附加的一条取消排序信息550。取消排序数据是从期望的次序到数据包中的次序的映射。因此,在所有的运行长度被展开之后,第i个取消排序索引是在该展开的数据中期望的次序中的第i个值的索引-实质上为收集操作。该操作可以通过以下伪代码执行:
在给定压缩矢量缓冲区500内的块索引的情况下,每块的元数据504使用以下逻辑来识别它是哪种类型的块:
///将未压缩块的尺寸计算为矢量属性压缩(VAC)VBO中的
///每个顶点的属性数据量和chunkSize(2的幂)的乘积
const sizeOfUncompressedBlock=sizeOfUncompressedVertex<<log2(chunkSize);
///计算储存未压缩块所需的高速缓存线的数量
const sizeOfUncompressedBlockCL=ceil(sizeOfUncompressedBlock/64);
///使用的高速缓存线的数量绝对不能超过
///以高速缓存线的粒度测量的未压缩块的尺寸
assert(metadata.nCachelines<=sizeOfUncompressedBlockCL);
if(metadata.nCachelines==sizeOfUncompressedBlockCL){
///为未压缩块
}else if(metadata.sortEn){
///为排序的压缩块
}else{
///为不排序的压缩块
}
在一个示例实施例中,限制块仅包含一种类型的数据包减少了额外的元数据和/或复杂性。允许块内的数据包类型的变化需要保留指出每个数据包的数据包类型的额外的元数据,或者需要根据参数(如基础属性的数据类型)来定义规则。
图6示出了根据本公开的实施例的用于解压缩的处理600。图6中示出的处理600的实施例仅用于说明。在不脱离本公开的范围的情况下可以使用其他实施例。
图6提供了一旦期望的块ID已知时对压缩块进行解压缩的处理600。在步骤602处,解压缩器读取RLP代码。在步骤604处,解压缩器确定字典是否被启用。如果字典被启用,则在步骤606处解压缩器获取字典索引。如果字典未被启用,则在步骤608处解压缩器获取原始数据。当获取数据时,解压缩器从压缩的标量缓冲区中获取块,伪代码如下所示。
///获取块数据并返回所获取的高速缓存线的数量
uint fetchBlock(uint blockID,byte&retdata[8*64],bool&isCompressed,bool&isSort){
///得到元数据-4位宽,所以得到字节并提取
Metadata entry=((metadataArray[blockID/2])>>(blockID modulo 2))&0xF;
///因为字段是有偏差的所以减去1
isCompressed=(entry.nCachelines==(sizeOfUncompressedBlockCL-1));
isSort=(isCompressed&&entry.sortEn);
///由于偏差使用‘<=’
for(i=0;i<=entry.nCachelines;++i){
///得到以偏移量blockID*s izeOfUncompressedBlockCL开始的相关高速缓存线
retdata[(64*i)...64*(i+1)]=fetchCachelineAt
(dataArray[blockID*sizeOfUncompressedBlockCL]);
}
return entry.nCachelines;
}
在步骤610处,解压缩器更新运行长度计数器并对数据进行移位。如果在数据包中有更多的数据,则解压缩器可以在步骤602处继续读取代码。在步骤612处,解压缩器可以确定数据包是否被排序。如果数据包没有被排序,则在步骤614处解压缩器将数据写入存储器。如果压缩包被排序,则解压缩器在步骤616处识别取消排序索引查找信息,然后在步骤614处将数据写入存储器。
一旦块数据被获取,并且知道块的类型,则相关数据可以从块中被提取。在不同的实施例中,可以不总是使用块的所有内容,并且可以针对特定顶点提取特定数据包以及数据。为了简化,以下伪代码显示所有数据的提取,不考虑消耗,并且不显示掩盖和提取子集。
需要解码的第一类数据包是无排序的压缩数据包,其解码伪代码如下所示:
在定义了该解码逻辑的情况下,可以轻松实现用于排序的压缩块的解码逻辑,如下所示:
上面显示的伪代码从组成块的数据流中获取特定数据包。对于压缩数据包,仅对于确定尺寸而言,不需要任何取消排序操作或任何数据提取操作,只需要提取和解释RLP。
本公开的一个或多个实施例提供一种压缩器来给定输入块时创建压缩块。压缩器的一个任务是确定理想的字典,另一个任务是确定每个块必须是未压缩的、无排序的压缩的、还是排序的压缩的。
虽然这些任务是相互关联的,即,理想的字典是获得最大压缩的字典,这反过来取决于每个数据大块使用哪个块类型,可以通过将每个任务单独地解析为一系列相关的子任务来充分近似该任务。这构成了什么是耦合优化的近似算法。虽然一个或多个实施例可以使用近似,但是任何实现方案(特别是通过压缩器)可以选择不同的近似。即使在这个近似中,所提出的算法也可以是双通(two-pass)算法,即使如果足够的缓冲区空间可用,它可以被实现为扩展的单通(one-pass)算法。
本实施例中的第一任务是在不存在字典的情况下创建中间块。该任务通过收集关于每个顶点的属性的信息并且确定可以存储在块中的顶点的数量来开始。该计算是直接的-以字节为单位将必须属于该VAC压缩向量缓冲对象(VBO)的顶点的所有属性的尺寸求和,并将8*64字节除以该数。于是,块中的顶点数量是四个值{4,8,16,32}中小于或等于前面步骤中获得的值的最大值。请注意,数8*64(8×64B高速缓存线)仅仅是一个VAC块的矢量数据压缩器(VDC)中专用的缓冲量,并且是基于大多数情况下预期的平均属性负载的任意限制。
在一个或多个实施例中,压缩器可以基于块中顶点的数量来创建中间块。为了创建中间块,压缩器可以取回块内顶点的所有属性,并将它们调换为数组结构(SOA)次序。这可以通过以下伪代码实现:
上面的伪代码在设计上是简单的,并且不处理边界之外的情况,并且执行低效的存储器分配方式。在另一个示例中,如果要维持这个暂存空间,则所有存储器分配可能会发生一次以使不相交分配的数量最小化。如果不维持,则相同的暂存空间可以重新用于下一个块。另外,如果任何标量不使用完整的32位,则最终的SOA存储可以存储每个值的已使用的位,而不是全部的32位。该情况下每个单独的标量的可能的尺寸包括8位、16位、24位或32位。然而,为了简单起见,中间表示可以选择将所有数据保持为32位。
在一个实施例中,压缩器代码可将中间表示转换成VAC块表示(减去字典压缩)。该数据已经是未压缩块,并且可以被转换成无排序的压缩块。然后,该块可以保持为这两种类型之一。在一个示例实施例中,可以仅基于哪种类型(压缩或未压缩)提供最小尺寸来选择类型。当填充到64B边界时,选择可以不考虑量化损耗。到目前为止,可以完成无排序。排序可能只会增加可最终处于该类型的块中的标量也将最终处于字典中的可能性。因此,排序可以增加存在更多的压缩类型的块的可能性,这将在整体上增加压缩。
在这一点上,实现方案可以选择将所有块保持在该表示中,或者一次仅生成一个块来馈送下一个阶段。根据所选择的选项,如果保留所有块,则该处理是扩展的单通(one-pass)方法,如果仅生成一个块,则该处理是双通(two-pass)方法。选择可以取决于实现方案想要使用的工作存储器的量(双通(two-pass)方法可能仅使用一个块的价值的附加存储器),这可以导致更多的缓存命中。
VAC的这个实施例中的字典是每个VBO,因此它可以被调谐到所讨论的VBO。然而,为了以压缩为代价的实施效率,任何实现方案都可以选择在各个VBO之中重复使用字典的全部或部分。
本公开的一个或多个实施例识别并考虑到创建字典的问题是找到VBO内的所有32位数据条目的直方图中的前X个(例如,13个)条目。这个问题是创建数据的稀疏直方图并保留直方图中前X个条目作为字典的问题。
字典可以由在第一阶段结束时创建的中间表示中标量出现的最高频率组成。也就是说,任何长度的运行都计数为标量的一次出现。例如,意味着4.5的四个实例的运行(4,4.5)将被计数为4.5的仅一次出现,用于创建字典的目的。
图7示出了根据本公开的实施例的用于创建字典的处理700。图7中示出的处理700的实施例仅用于说明。在不脱离本公开的范围的情况下可以使用其他实施例。
在图7中,创建了单独完整的直方图。在步骤702处,压缩器可以对块进行迭代。在步骤704处,压缩器可以基于来自迭代的信息来创建用于块的直方图705。在为块创建该直方图705之后,在步骤706处,将直方图705与用于VBO的运行直方图707合并,即创建两个直方图的联合直方图709。可以根据之前的迭代创建运行直方图707。在联合结束时,在步骤708处,压缩器选择直方图709中的前k个值,并丢弃剩余的值。在选择之后,压缩器可以使用联合直方图709对下一个块运行处理700,并更新到新的VBO直方图711。
直方图只是被截断,只保留字典条目最常见的值。
另一实施例提供了创建块的子集的完整直方图的处理。随机选择某些块,并且单纯地从块的该子集中创建完整的直方图。当选择块时,为收集类似数量的两个块而作出努力,并且在以下所有中没有偏向(即确保尽力而为的公平性):
块类型:未压缩、无排序的压缩,尽可能接近均匀采样,只要其不与任何其他条件冲突;以及
顶点ID范围:对整个顶点ID范围进行采样,近似该空间中的均匀分布或泊松分布。
当发生冲突时,采样应该以顶点ID范围中的公平性优先于块类型。
为了减少直方图代码的内存占用,在一个或多个示例实施例中,可以使用装仓(binning)方法。装仓处理可以对于某个值的k将整个频谱划分为k个仓(bin),并确定数据集的粗略直方图。所提出的处理是首先计算粗略直方图,然后集中地仅对在前N个仓内的值进行精细直方图生成,即,在直方图生成中忽略前N个仓之外的所有值。当与其他处理结合使用时,装仓方法也可以用作降低复杂性的策略。
图8示出了根据本公开的实施例的字典在压缩期间的使用的处理800。图8中示出的处理800的实施例仅用于说明。在不脱离本公开的范围的情况下可以使用其他实施例。
作为压缩处理的最后一步,将最后一步中创建的字典应用于中间块数据。处理800可以用在每个块上。
在步骤802处,压缩器迭代每个块。在步骤804处,压缩器将字典应用于每个块,并将块转换为无排序的压缩。在另外的示例实施例中,块可以首先被排序。在步骤806处,压缩器可以将数据排序并创建运行以获得排序的压缩块。在步骤808处,压缩器可以针对排序的压缩块、无排序的压缩块以及未压缩的块计算64MB高速缓存线中的块尺寸。在步骤810处,压缩器选择具有最小尺寸的块类型。如果两个或多个类型的尺寸相等,则优先次序为未压缩,然后是无排序的压缩,然后是排序的压缩。
处理800允许不同实施例在特定条件下可以使用的两个变型。一个示例可以选择在步骤804之后将数据保持为SOA形式(即作为未压缩块),并使直方图创建代码了解计数原则。针对值的每个连续运行,压缩器可以对标量进行仅一次计数。这可以移除展开运行的需要,并且最后的阶段可以纯粹作为只是在最后将未压缩转换成无排序的压缩和排序的压缩的处理而运行。在另一示例中,如果处理800需要对时间敏感,则处理800可以恢复为极为简单的字典,或者如果在时间压力下,则可以一个也不创建。在这种情况下,仍然可以纯粹地使用不同的块类型来获得一些压缩。
本公开的一个或多个实施例提供了具有以下设计的允许所有运行长度都可以在大块内的处理:
2位列举,其指出随后的数据是以下中的哪一个:(a)不在字典中的值的运行长度、(b)字典中的值的运行长度、(c)字典值,单次出现、或(d)非字典值,单次出现。
根据列举,以下中的一个:(a)元组(运行长度,值),其中运行长度在1至chunkSize范围内,(b)元组(运行长度,字典索引),其中运行长度在1至chunkSize的范围内,并且对于2n个条目的字典而言字典索引是的n位二进制数,(c)字典索引,具有2n个条目的字典的n位二进制数,或(d)其固有位宽的值。
这些实施例中的一个或多个由于较大的前缀而允许较大百分比的数据包以更低的压缩比被压缩。换句话说,压缩的不同变型可能比其他变型更有效。也就是说,不同的实施例可以允许压缩适用于更大或更小百分比的输入数据,其可以以每块和每个顶点缓冲区的不同压缩比为代价。
另一个实施例是可能的,其中在块的开始处的2位列举的数组指出块内的每个数据包的类型-未压缩、不排序的压缩或者排序的压缩。
图9示出了根据本公开的实施例的用于压缩的处理900。处理900可以由处理电路***、处理器、图形处理器执行。处理器可以执行一组指令以执行处理900的操作。处理900可以由图3所示的压缩器300来实现。
在操作902中,压缩器接收源数据流,其包括与顶点属性数据对应的一个或多个值。源数据流可以是直接来自存储器的输入流。源数据可以是图形应用数据,其是未编码数据。源数据流也可以包括包含两个或更多个数据类型在内的数据。在本公开的一个或多个实施例中,一个或多个值中的每一个在两个或更多个数据类型上是等效的。在示例实施例中,两个或更多个数据类型至少包括整数和浮点数据类型。
在操作904中,压缩器提供用于源数据流中一个或多个值的字典。字典包括与元数据流中的一个或多个值相对应的多个索引值。在不同的实施例中,字典可以预先产生或者可以在压缩期间产生。
在操作906中,压缩器可以用多个索引值中的相应索引值来替代源数据流中的一个或多个值中的至少一些值。在一个示例中,使用直方图来选择由字典中的相应索引值表示的源数据流的一个或多个值中的一些值。直方图识别源数据流的根据至少预定义的频率出现的值。
在一个或多个示例性实施例中,处理器在不知道一个或多个值的基础数据类型的情况下提供字典并且替换一个或多个值中的至少一些值。也就是说,压缩器提供源数据流的压缩,而不考虑在源数据流中使用的数据类型。如本文所使用的,“提供”字典还可以包括“创建”或“产生”字典,其包括与源数据流中的一个或多个值相对应的多个索引值。
尽管图9示出了用于处理数据处理器900的一个示例,但是可以对图9做出各种改变。例如,虽然图9示出了一系列步骤,但是各种步骤可以重叠、并行发生、以不同的顺序发生、或者发生任何次数。此外,处理900可以包括任何数量的事件、事件信息检索和通知。
例如,处理900还可以包括使用运行长度编码来对源数据流中的一个或多个值的连续出现进行编码的操作。压缩器可以用多个索引值中的相应索引值来替代源数据流中的一个或多个值中的至少一些值。处理900还可以包括将源数据流划分成顶点块的操作(其中每个块包含块中各个顶点的所有相关属性)以及将每个块划分成数据包的操作(其中每个数据包包含块中所有顶点的一个或多个属性)。
在一个或多个实施例中,压缩器还可以包括按照各自的顺序对至少一些数据包内的数据进行排序的操作,其中值的出现的连续性相比数据未排序时的连续性更大。在另一个示例中,压缩器可以包括向每个块添加识别块中的数据包的类型的代码的操作。
本申请中的描述不应被视为意味着任何特定的元件、步骤或功能是必须包含在权利要求范围内的必要要素。专利主题的范围仅由权利要求限定。
Claims (20)
1.一种设备,包括:
存储器,其被构造为存储顶点属性数据和指令集;以及
至少一个处理器,其耦接至所述存储器,所述至少一个处理器被构造为执行所述指令集,以:
接收包括与所述顶点属性数据对应的一个或多个值的源数据流;
提供针对所述源数据流中的一个或多个值的字典,其中所述字典包括与所述源数据流中的一个或多个值相对应的多个索引值;并且用所述多个索引值中的相应索引值来替代所述源数据流中的一个或多个值中的至少一些值。
2.根据权利要求1所述的设备,其中,所述源数据流包括未编码的数据。
3.根据权利要求1所述的设备,其中,在不知道所述一个或多个值的一个或多个基础数据类型的情况下,执行提供所述字典并且替代所述一个或多个值中的所述至少一些值的操作。
4.根据权利要求3所述的设备,其中,提供所述字典的操作包括:
创建包括与所述源数据流中的一个或多个值相对应的多个索引值的字典。
5.根据权利要求1所述的设备,其中,所述至少一个处理器还被构造为执行所述指令集,以:
使用运行长度编码来对所述源数据流中的一个或多个值的连续出现进行编码。
6.根据权利要求1所述的设备,其中,所述至少一个处理器还被构造为执行所述指令集,以:
将所述源数据流划分为顶点块,其中,每个块包含该块中的各个顶点的所有相关属性,并且
将所述块中的每一个划分为数据包,其中,所述数据包中的每一个包含所述块中的所有顶点的一个或多个属性。
7.根据权利要求6所述的设备,其中,所述至少一个处理器还被构造为执行所述指令集,以:
按照各自的顺序对所述数据包中的至少一些数据包内的数据进行排序,其中值的出现的连续性相比所述数据未被排序时的连续性更大。
8.根据权利要求6所述的设备,其中,所述至少一个处理器还被构造为执行所述指令集,以:
将对所述块中的数据包类型进行识别的代码添加到每个块中。
9.根据权利要求1所述的设备,其中,使用直方图来选择由所述字典的相应索引值替代的所述源数据流中的一个或多个值中的所述一些值,其中所述直方图对源数据流中的根据至少预定义的频率而出现的值进行识别。
10.根据权利要求1所述的设备,其中,替代所述源数据流中的一个或多个值中的至少一些值的操作包括:
用所述多个索引值中的相应索引值来替代所述源数据流中的任何准确值。
11.一种用于源数据压缩的方法,所述方法包括步骤:
接收源数据流,所述源数据流包括与存储在存储器中的顶点属性数据相对应的一个或多个值;
提供针对所述源数据流中的一个或多个值的字典,其中所述字典包括与所述源数据流中的一个或多个值相对应的多个索引值;并且
用所述多个索引值中的相应索引值来替代所述源数据流中的一个或多个值中的至少一些值。
12.根据权利要求11所述的方法,其中,所述源数据流包括未编码的数据。
13.根据权利要求11所述的方法,其中,在不知道所述一个或多个值的一个或多个基础数据类型的情况下,执行提供所述字典并且替代所述一个或多个值中的所述至少一些值的步骤。
14.根据权利要求13所述的方法,其中,提供所述字典的步骤包括:
创建包括与所述源数据流中的一个或多个值相对应的多个索引值的字典。
15.根据权利要求11所述的方法,还包括步骤:
使用运行长度编码来对所述源数据流中的一个或多个值的连续出现进行编码。
16.根据权利要求11所述的方法,还包括步骤:
将所述源数据流划分为顶点块,其中,每个块包含该块中的各个顶点的所有相关属性,并且
将所述块中的每一个划分为数据包,其中,所述数据包中的每一个包含所述块中的所有顶点的一个或多个属性。
17.根据权利要求16所述的方法,还包括步骤:
按照各自的顺序对所述数据包中的至少一些数据包内的数据进行排序,其中值的出现的连续性相比所述数据未被排序时的连续性更大。
18.根据权利要求16所述的方法,还包括步骤:
将对所述块中的数据包类型进行识别的代码添加到每个块中。
19.根据权利要求16所述的方法,其中,使用直方图来选择由所述字典的相应索引值替代的所述源数据流中的一个或多个值中的所述一些值,其中所述直方图对源数据流中的根据至少预定义的频率而出现的值进行识别。
20.根据权利要求16所述的方法,其中,用所述多个索引值中的相应索引值来替代所述源数据流中的一个或多个值中的至少一些值的步骤包括:
用所述多个索引值中的相应索引值来替代所述源数据流中的任何等效值。
Applications Claiming Priority (6)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US201662427587P | 2016-11-29 | 2016-11-29 | |
US62/427,587 | 2016-11-29 | ||
US15/432,782 US10282889B2 (en) | 2016-11-29 | 2017-02-14 | Vertex attribute compression and decompression in hardware |
US15/432,782 | 2017-02-14 | ||
KR10-2017-0153970 | 2017-11-17 | ||
KR1020170153970A KR102589299B1 (ko) | 2016-11-29 | 2017-11-17 | 하드웨어에서 버텍스 속성 압축 및 압축 해제 방법 및 장치 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108122189A true CN108122189A (zh) | 2018-06-05 |
CN108122189B CN108122189B (zh) | 2021-11-30 |
Family
ID=62228651
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201711227740.9A Active CN108122189B (zh) | 2016-11-29 | 2017-11-29 | 硬件中的顶点属性压缩和解压缩 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108122189B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109949202A (zh) * | 2019-02-02 | 2019-06-28 | 西安邮电大学 | 一种并行的图计算加速器结构 |
CN110648385A (zh) * | 2018-06-27 | 2020-01-03 | 北京京东尚科信息技术有限公司 | 三角面拣选方法、装置、电子设备及计算机可读介质 |
CN112083875A (zh) * | 2019-06-12 | 2020-12-15 | 三星电子株式会社 | 用于在存储***中减少读取端口并加速解压缩的方法 |
CN112487880A (zh) * | 2020-11-13 | 2021-03-12 | 河北省科学院应用数学研究所 | 基于最大误差准则的中值滤波器、设备和*** |
CN113608669A (zh) * | 2020-05-05 | 2021-11-05 | 辉达公司 | 用于对基于字典的压缩进行缩放的技术 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103810228A (zh) * | 2012-11-01 | 2014-05-21 | 辉达公司 | 用于经采样的后缀数组的并行重建的***、方法和产品 |
US20140204080A1 (en) * | 2013-01-22 | 2014-07-24 | Qualcomm Incorporated | Indexed streamout buffers for graphics processing |
US20150091913A1 (en) * | 2013-09-27 | 2015-04-02 | Rahul P. Sathe | Techniques and architecture for improved vertex processing |
CN105931279A (zh) * | 2016-04-18 | 2016-09-07 | 邱友龙 | 一种三维模型数据压缩方法及*** |
CN106127671A (zh) * | 2015-05-06 | 2016-11-16 | 联发科技股份有限公司 | 顶点数据压缩方法和装置及相关的顶点数据解压缩方法和装置 |
-
2017
- 2017-11-29 CN CN201711227740.9A patent/CN108122189B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103810228A (zh) * | 2012-11-01 | 2014-05-21 | 辉达公司 | 用于经采样的后缀数组的并行重建的***、方法和产品 |
US20140204080A1 (en) * | 2013-01-22 | 2014-07-24 | Qualcomm Incorporated | Indexed streamout buffers for graphics processing |
US20150091913A1 (en) * | 2013-09-27 | 2015-04-02 | Rahul P. Sathe | Techniques and architecture for improved vertex processing |
US20160321834A1 (en) * | 2013-09-27 | 2016-11-03 | Intel Corporation | Techniques and architecture for improved vertex processing |
CN106127671A (zh) * | 2015-05-06 | 2016-11-16 | 联发科技股份有限公司 | 顶点数据压缩方法和装置及相关的顶点数据解压缩方法和装置 |
CN105931279A (zh) * | 2016-04-18 | 2016-09-07 | 邱友龙 | 一种三维模型数据压缩方法及*** |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110648385A (zh) * | 2018-06-27 | 2020-01-03 | 北京京东尚科信息技术有限公司 | 三角面拣选方法、装置、电子设备及计算机可读介质 |
CN109949202A (zh) * | 2019-02-02 | 2019-06-28 | 西安邮电大学 | 一种并行的图计算加速器结构 |
CN112083875A (zh) * | 2019-06-12 | 2020-12-15 | 三星电子株式会社 | 用于在存储***中减少读取端口并加速解压缩的方法 |
CN112083875B (zh) * | 2019-06-12 | 2022-09-30 | 三星电子株式会社 | 用于在存储***中减少读取端口并加速解压缩的方法 |
CN113608669A (zh) * | 2020-05-05 | 2021-11-05 | 辉达公司 | 用于对基于字典的压缩进行缩放的技术 |
CN112487880A (zh) * | 2020-11-13 | 2021-03-12 | 河北省科学院应用数学研究所 | 基于最大误差准则的中值滤波器、设备和*** |
Also Published As
Publication number | Publication date |
---|---|
CN108122189B (zh) | 2021-11-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108122189A (zh) | 硬件中的顶点属性压缩和解压缩 | |
CN104040541B (zh) | 用于更高效地使用存储器至cpu带宽的技术 | |
CN112292816B (zh) | 处理核心数据压缩和存储*** | |
CN104283567B (zh) | 一种名称数据的压缩、解压缩方法及设备 | |
CN104380267B (zh) | 数据解压/压缩装置 | |
CN104143990B (zh) | 顶点参数数据压缩 | |
CN101311931B (zh) | 基于值的出现的表压缩 | |
CN105207678B (zh) | 一种改进型lz4压缩算法的硬件实现*** | |
CN102122960B (zh) | 一种针对二进制数据的多字符组合无损数据压缩方法 | |
CN105573962B (zh) | 单指令多数据处理器与相关方法 | |
KR102589299B1 (ko) | 하드웨어에서 버텍스 속성 압축 및 압축 해제 방법 및 장치 | |
US9268807B2 (en) | In-memory bitmap for column store operations | |
CN108886367A (zh) | 用于压缩和解压缩数据的方法、设备和*** | |
CN101449462A (zh) | 基于集合关联高速缓存映射技术的高速数据压缩 | |
KR20160001652A (ko) | 데이터 프로세싱 방법 및 디바이스 | |
Gurung et al. | Zipper: A compact connectivity data structure for triangle meshes | |
CN112422972A (zh) | 用于对图像数据的压缩块进行解压缩的方法和解压缩单元 | |
Yoon et al. | Random-accessible compressed triangle meshes | |
CN103209328A (zh) | 多源卫星图像实时在线处理技术方法及装置 | |
CN108092670B (zh) | 编码方法和装置 | |
CN107341113B (zh) | Cache的压缩方法和装置 | |
US8270742B1 (en) | Data compression for computer-aided design systems | |
Sun et al. | Bandwidth efficient near-storage accelerator for high-dimensional similarity search | |
Georgopoulos et al. | Enhancing multi-threaded sparse matrix multiplication for knowledge graph oriented algorithms and analytics | |
CN114140569B (zh) | 一种三维场景序列化压缩方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |