掌桥专利:专业的专利平台
掌桥专利
首页

用于在存储器中存储可变长度数据块的方法和系统

文献发布时间:2023-06-19 11:39:06


用于在存储器中存储可变长度数据块的方法和系统

技术领域

本申请涉及用于在存储器中存储可变长度数据块的方法和系统。

背景技术

有许多应用程序将可变长度数据块存储在存储器中。例如,图形处理系统被配置成(例如,从在计算机系统上运行的应用程序)接收图形数据,并从图形数据确定渲染图像的像素值。在一些情况下,将图像的像素值分成多个块,根据无损压缩算法/方案各个地压缩所述多个块中的每个块。这可能导致可变长度的压缩块。

在这些应用程序中,常常期望能够以减少用于存储可变长度数据块的存储器量的方式将可变长度数据块存储在存储器中;和/或允许以最小数量的存储器访问请求存储可变长度数据块并从存储器读取可变长度数据块。

下面描述的实施方案仅以举例的方式提供,而不构成对解决用于在存储器中存储可变长度数据块的方法和系统的任何或所有缺点的实施方式的限制。

发明内容

提供本发明内容是为了介绍在以下详细描述中进一步描述的一些概念。本发明内容不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于限制所要求保护的主题的范围。

本文描述了用于在存储器中存储两个或更多可变长度数据块的集合的方法和系统。每个可变长度数据块具有N*B的最大大小,其中N是大于或等于二的整数,并且B是可使用单个存储器访问请求写入到存储器的最大数据大小。该方法包括:针对该集合中的每个可变长度数据块,在分配给该可变长度数据块的存储器的组块中存储该可变长度数据块的大小为B的前P个非重叠部分,其中P是(i)可变长度数据块的大小为B的非重叠部分的数目和(ii)是小于N的整数的X中的最小值;将该集合的可变长度数据块的任何剩余部分存储在存储器的在该集合的可变长度数据块之间共享的剩余区段中;以及在存储器的标头区段中存储指示该集合中的每个可变长度数据块的大小的信息。

第一方面提供了一种在存储器中存储至少两个可变长度数据块的集合的方法,每个可变长度数据块具有最大大小N*B,其中,N是大于或等于二的整数,B是能够使用单个存储器访问请求写入存储器的最大数据大小,该方法包括:针对该集合中的每个可变长度数据块,在分配给该可变长度数据块的存储器的组块中存储该可变长度数据块的大小为B的前P个非重叠部分,其中P是(i)可变长度数据块的大小为B的非重叠部分的数目和(ii)是小于N的整数的X中的最小值;将该集合的可变长度数据块的任何剩余部分存储在存储器的在该集合的可变长度数据块之间共享的剩余区段中;以及在存储器的标头区段中存储指示该集合中的每个可变长度数据块的大小的信息。分配给每个可变长度数据块的存储器的组块可以具有X*B的大小。

将可变长度数据块的剩余部分存储在剩余区段中可以包括将可变长度数据块的剩余部分彼此相邻地存储在剩余区段中。

可变长度数据块的剩余部分可以从剩余区段的起始地址开始彼此相邻地存储于剩余区段中。

可变长度数据块的剩余部分可以从剩余区段的最后地址开始彼此相邻地存储于剩余区段中。

剩余部分可以分成多个B大小的部分,并且将可变长度数据块的剩余部分存储在剩余区段中可以包括:在剩余区段的开始或结束处存储该集合的第一可变长度数据块的剩余部分;针对该集合的每个其它可变长度数据块,确定将该可变长度数据块的剩余部分与在前剩余部分相邻地存储于剩余区段中是否将使得可变长度数据块的该剩余部分被存储在多个B大小部分中的至少两个B大小部分中;响应于确定将可变长度数据块的剩余部分与在前剩余部分相邻地存储于剩余区段中将使得该剩余部分被存储在多个B大小部分中的至少两个B大小部分中,在剩余区段的下一个B大小部分的开始处存储该剩余部分;并且响应于确定将可变长度数据块的剩余部分与在前剩余部分相邻地存储于剩余区段中不会使得该剩余部分被存储在多个B大小部分中的至少两个B大小部分中,与在前剩余部分相邻地在剩余区段中存储该剩余部分。

在剩余区段中存储可变长度数据块的剩余部分可以包括由剩余部分形成一个或多个剩余块,以及将一个或多个剩余块存储在剩余区段中。

可变长度数据块的剩余部分可以以与可变长度数据块的B大小的前P个非重叠部分存储在存储器中的相同次序存储在剩余区段中。

可变长度数据块的剩余部分可以以与可变长度数据块的B大小的前P个非重叠部分存储在存储器中的不同次序存储在剩余区段中。

分配给每个可变长度数据块的存储器的组块可以具有(N-1)*B的大小,并且X可以等于N-1。

剩余区段可以具有M*B的大小,其中,M是集合中的可变长度数据块的数目。

在存储器的标头区段中存储指示集合中的可变长度数据块中的每一个的大小的信息可以包括在针对集合中的每个可变长度数据块的标头中存储标识可变长度数据块大小的信息。

该方法可进一步包括:接收该集合中的可变长度数据块的修改版本;在分配给该可变长度数据块的存储器的组块中存储该可变长度数据块的修改版本的大小为B的前P个非重叠部分;从该剩余区段读取该多个可变长度数据块中的至少一个其它可变长度数据块的剩余部分;由该可变长度数据块的修改版本的任何剩余部分和至少一个其它可变长度数据块的剩余部分形成剩余块;以及将剩余块存储在该剩余区段中。

该集合中的可变长度数据块中的至少一个可以包括根据无损压缩算法压缩的压缩数据块。

每个可变长度数据块可以代表帧缓冲数据的一部分。

第二方面提供了一种用于在存储器中存储至少两个可变长度数据块的集合的存储器系统,每个可变长度数据块具有最大大小N*B,其中,N是大于或等于二的整数,B是能够使用单个存储器访问请求写入存储器的最大数据大小,该系统包括:存储器,包括:分配给该集合的每个可变长度数据块的组块;在该集合的可变长度数据块之间共享的剩余区段;以及标头区段;以及逻辑,该逻辑被配置为:针对该集合的每个可变长度数据块,在分配给该可变长度数据块的存储器的组块中存储该可变长度数据块的大小为B的前P个非重叠部分,其中P是(i)可变长度数据块的大小为B的非重叠部分的数目和(ii)是小于N的整数的X中的最小值;在该剩余区段中存储该集合的可变长度数据块的任何剩余部分;以及在标头区段中存储指示该集合中的每个可变长度数据块的大小的信息。每个组块可以具有X*B的大小。

第三方面提供了一种从存储器读取至少两个可变长度数据块的集合的可变长度数据块的方法,每个可变长度数据块的最大大小为N*B,其中,N是大于或等于二的整数,并且B是可以使用单个存储器访问请求写入到存储器的最大数据大小,该方法包括:获得用于该可变长度数据块集合的一个或多个标头,该一个或多个标头包括标识该集合中的每个可变长度数据块的大小的信息;从该一个或多个标头确定该可变长度数据块是否包括大小为B的至少一个单元;响应于确定该可变长度数据块包括大小为B的至少一个单元,从分配给该可变长度数据块的存储器的组块读取大小为B的前P个单元,其中,P是(i)该可变长度数据块的大小为B的单元数目和(ii)作为小于N的整数的X中的最小值;从一个或多个标头确定该可变长度数据块是否包括未存储在分配给该可变长度数据块的存储器的组块中的剩余部分;以及响应于确定该可变长度数据块包括剩余部分,标识该剩余部分在多个可变长度数据块之间共享的存储器的剩余区段中的位置,并且从剩余区段中的所标识位置读取该可变长度数据块的该剩余部分。分配给该可变长度数据块的存储器的组块可以具有X*B的大小。

第四方面提供了一种从存储器读取至少两个可变长度数据块的集合的可变长度数据块的存储器系统,每个可变长度数据块的最大大小为N*B,其中,N是大于或等于二的整数,并且B是可以使用单个存储器访问请求写入到存储器的最大数据大小,该系统包括:存储器,包括:分配给该集合的每个可变长度数据块的组块;在该集合的可变长度数据块之间共享的剩余区段;以及标头区段;以及逻辑,该逻辑被配置为:从标头区段获得用于该至少两个可变长度数据块的集合的一个或多个标头,该一个或多个标头包括标识该集合中的每个可变长度数据块的大小的信息;从一个或多个标头确定该可变长度数据块是否包括大小为B的至少一个单元;响应于确定该可变长度数据块包括大小为B的至少一个单元,从分配给该可变长度数据块的存储器的组块读取该可变长度数据块的前P个大小为B的单元,其中,P是(i)该可变长度数据块的大小为B的单元数目和(ii)作为小于N的整数的X中的最小值;从一个或多个标头确定该可变长度数据块是否包括未存储在分配给该可变长度数据块的存储器的组块中的剩余部分;以及响应于确定该可变长度数据块包括剩余部分,标识该剩余部分在该剩余区段中的位置,并且从剩余区段中的所标识位置读取该剩余部分。每个组块可以具有X*B的大小。

第五方面提供了一种图形处理系统,其被配置成执行第一方面的方法或第三方面的方法。

第六方面提供了一种图形处理系统,其包括第二方面的存储器系统或第四方面的存储器系统。

本文所描述的存储器系统(或其逻辑)和图形处理系统可以包含在集成电路上的硬件中。可以提供一种在集成电路制造系统中制造如本文所述的存储器系统(或其逻辑)和/或图形处理系统的方法。可以提供一种集成电路定义数据集,当在集成电路制造系统中被处理时,该集成电路定义数据集配置该系统以制造本文描述的存储器系统(或其逻辑)或图形处理系统。可以提供一种非暂态计算机可读存储介质,其上存储有存储器系统(或其逻辑)或图形处理系统的计算机可读描述,所述计算机可读描述当在集成电路制造系统中处理时使得集成电路制造系统制造包含存储器系统(或其逻辑)或图形处理系统的集成电路。

可以提供一种集成电路制造系统,包括:非暂态计算机可读存储介质,其上存储有本文描述的存储器系统(或其逻辑)或图形处理系统的计算机可读描述;布局处理系统,其被配置为处理该计算机可读描述,以便生成包含该存储器系统(或其逻辑)或图形处理系统的集成电路的电路布局描述;以及集成电路生成系统,其被配置为根据电路布局描述来制造该存储器系统(或其逻辑)或图形处理系统。

可以提供用于执行如本文所述的方法的计算机程序代码。可以提供其上存储有计算机可读指令的非暂态计算机可读存储介质,当在计算机系统处执行时,所述计算机可读指令使计算机系统执行如本文所述的方法。

如对本领域的技术人员显而易见的,上述特征可以适当地组合,并且可以与本文所述的示例的任何方面组合。

附图说明

现在将参考附图详细描述示例,在附图中:

图1是示出用于存储可变长度数据块的存储器的第一示例性部分的示意图;

图2是示出在存储器中存储可变长度数据块的第一示例性方法的示意图;

图3是示出在存储器中存储可变长度数据块的第二示例性方法的示意图;

图4是用于在存储器中存储可变长度数据块的示例性系统的框图;

图5是用于存储可变长度数据块的存储器的第二示例性部分的示意图,该可变长度数据块包括最大可访问数据单元区段和剩余区段;

图6是在存储器中存储可变长度数据块的第三示例性方法的流程图;

图7是示出可变长度数据块的示例性集合的示意图;

图8是示出在图5的存储器的该部分中存储图7的可变长度数据块的集合的第一示例性方法的示意图;

图9是在图5的存储器的部分的剩余区段中存储剩余部分的示例性方法的流程图;

图10是示出根据图9的方法在剩余区段中存储剩余部分的示意图;

图11是从存储器读取可变长度数据块的示例性方法的流程图;

图12是在存储器中存储修改的可变长度数据块的示例性方法的流程图;

图13是示出修改的可变长度数据块的示意图;

图14是示出将图13的修改的可变长度数据块存储在存储器中的示意图;

图15是其中可实施本文中所描述的方法和存储器系统(或其逻辑)的示例性图形处理系统的框图;

图16是其中可以实施本文所述的存储器系统(或其逻辑)和/或图形处理系统的示例性计算机系统的框图;以及

图17是用于生成包含本文所述的存储器系统(或其逻辑)和/或图形处理系统的集成电路的示例性集成电路制造系统的框图。

附图示出了各种示例。技术人员将理解,附图中所示的元件边界(例如,框、框的组,或其他形状)表示边界的一个示例。在一些示例中,情况可能是一个元件可以被设计为多个元件,或者多个元件可以被设计为一个元件。在适当的情况下,贯穿各附图使用共同附图标记来指示相似特征。

具体实施方式

通过示例的方式给出以下描述,以使本领域的技术人员能够制造和使用本发明。本发明不限于本文中描述的实施方案,并且对所公开的实施方案的各种修改对于所属领域的技术人员而言将是显而易见的。仅通过示例的方式描述实施方案。

如上所述,有许多应用程序和系统生成要存储在存储器中的可变长度数据块。在可变长度数据块具有最大长度或大小的情况下,一种在存储器中存储可变长度数据块的简单方法可以包括为每个可变长度数据块分配大到足以存储最大大小的可变长度数据块的存储器的组块,以及将每个可变长度数据块存储在其分配的存储器的组块中。

例如,如果如图1所示,每个可变长度数据块具有256字节的最大长度,则存储器可以被分成256字节的组块。例如,在图1中,存储器100被分成256字节的四个组块102、104、106、108。然后,每个可变长度数据块被分配存储器的组块,并被存储在关联的组块中。例如,如图2所示,第一可变长度数据块(“块0”)202被分配第一组块(“组块0”)102且存储在其中(或向其中写入);第二可变长度数据块(“块1”)204被分配第二组块(“组块1”)104且存储在其中(或向其中写入);第三可变长度数据块(“块2”)206被分配第三组块(“组块2”)106且存储在其中(或向其中写入);且第四可变长度数据块(“块3”)208被分配第四组块(“组块3”)108且存储于其中(或向其中写入)。这种方法的优点之一在于,容易确定每个块位于存储器中的哪里,因为每个数据块开始于关联组块的开始处。

然而,通常对可通过单次存储器访问请求写入到存储器或从存储器读取的数据量存在限制。可以经由单次存储器访问请求写入存储器或从存储器读取的数据量的限制在本文中称为最大可访问数据大小。在系统实施突发模式存储器读取/写入的情况下,最大可访问数据大小可替代地称为突发大小。突发大小通常表达为若干字或双字。在可变长度数据块的最大大小大于最大可访问数据大小的情况下,可能需要多于一次存储器访问请求(例如,多于一次写入请求)以将可变长度数据块写入到存储器中的对应组块中。例如,如果最大可访问数据大小为64字节,并且可变长度数据块可能高达256字节,则可能需要多达四次存储器访问请求(四次写入请求)来将可变长度数据块存储在存储器中。

在此类情况下,将可变长度数据块存储在分配给那些可变长度数据块的单独组块中可能导致额外的存储器访问请求以将可变长度数据块存储在存储器中。例如,在图2中,四个示例性可变长度数据块(“块0”、“块1”、“块2”、“块3”)202、204、206和208的总大小小于最大可访问数据大小的十倍(即小于640字节),表示可以使用十次写入请求来向存储器写入四个可变长度数据块202、204、206和208。然而,将需要十二次存储器访问请求(例如十二次写入请求)来将四个可变长度数据块202、204、206和208写入存储器,因为要写入存储器的十二个不同最大可访问数据大小(例如,64字节)的部分。在可变长度数据块是压缩块(例如,帧缓冲器的压缩块)的情况下,这可能有效地降低压缩块的压缩率。

为了解决这个问题,可以在存储器中将可变长度数据块打包在一起。例如,可以将可变长度数据块分组成M个可变长度数据块的集合而不是为每个可变长度数据块分配其自己专用的存储器的组块,其中M是大于或等于二的整数,并且大小R的存储器量可以被分配给该集合,其中R是存储器的组块大小的M倍。集合中的M个可变长度数据块可以打包在一起并作为打包块存储在所分配的存储器中。以此方式将可变长度数据块打包在一起可以减少将可变长度数据块写入存储器的写入请求的数量。例如,如图3所示,如果图2的四个可变长度数据块202、204、206和208的集合被分配有四个存储器的组块,并且将可变长度数据块打包在一起以形成打包块;然后将打包块写入到所分配的存储器,则可以减少在存储器中存储四个可变长度数据块的存储器访问请求的数量。具体地,在图3中,打包块只被写入到存储器的十个不同的最大可访问数据大小(例如64字节)的部分,因此可以仅使用十次存储器访问请求(例如十次写入请求)向存储器写入打包块(与图2所示方法中的十二次形成对比)。因此,以此方式存储可变长度数据块可以减少在存储器中存储一组M个可变长度数据块所需的存储器访问请求的数量,这样可以改善有效压缩率而不改变压缩算法。

然而,以结合图3描述的方式在存储器中存储可变长度数据块可能使读取可变长度数据块效率低下。具体地,将可变长度数据块打包在一起可能使得可变长度数据块分布在存储器的K+1个最大可存取数据大小(例如64字节)的部分之间,即使可变长度数据块可以匹配在存储器的K个最大可存取数据大小(例如64字节)的部分之内,其中K是大于或等于1的整数。这可能意味着可能需要K+1次存储器访问请求而不是仅K次存储器访问请求来从存储器读取可变长度数据块。例如,在图3中,第三可变长度数据块(“块2”)206的总大小小于最大可访问数据大小(例如,小于64字节),表示第三可变长度数据块(“块2”)206可以存储在存储器的单个最大可访问数据大小(例如,64字节)部分中,但是将可变长度数据块打包在一起已导致第三可变长度数据块(“块2”)206分布在存储器的两个最大可访问数据大小(例如64字节)部分之间,这意味着将需要两次存储器访问请求(例如两次读取请求)而不是仅一次以从存储器读取第三可变长度数据块(“块2”)206。

以结合图3描述的打包方式在存储器中存储可变长度数据块还可能使得难以修改任何可变长度数据块。例如,如果除了集合中的最后一个可变长度数据块(例如,图3的示例中的第四可变长度数据块(“块3”)208)以外的任何可变长度数据块以改变其长度或大小的方式被修改,则必须读取集合中的所有后续可变长度数据块并在存储器中重新打包。例如,如果第一可变长度数据块(“块0”)202被修改而导致其长度改变,则需要从存储器读取集合中的所有后续块(“块1”、“块2”和“块3”)204、206、208,重新打包并重新写入到存储器。

因此,本文描述了用于在存储器中存储可变长度数据块的方法和系统,所述方法和系统解决了在存储器中存储可变长度数据块的先前方法的一个或多个缺陷。具体地说,在本文中所描述的方法和系统中,可变长度数据块被分组成M个可变长度数据块的集合(其中M是大于或等于二的整数),且M个可变长度数据块的每个集合被分配存储器的大到至少足以存储M个最大尺寸的可变长度数据块的部分。分配给M个可变长度数据块的该集合的存储器的部分被分割成最大可访问数据单元区段和剩余区段。每个可变长度数据块被分配最大可访问数据单元区段的组块,其中存储该可变长度数据块的最大可访问数据单元(即,最大可访问数据大小部分),且可变长度数据块的任何剩余部分存储在共享剩余区段中。指示或标识该集合中的每个可变长度数据块的大小的信息也存储在存储器中。

如下文将更详细地描述的,以此方式存储可变长度数据块可减少存储可变长度数据块的存储器访问请求的数量,而没有在结合图3所述方法中发生的与读取和/或修改可变长度数据块相关联的问题。具体地,由于只有剩余区段由集合中的可变长度数据块共享,如果可变长度数据块以改变其长度或大小的方式被修改,则只有剩余区段需要读取和重新打包,而不必读取和重新打包所有后续的可变长度数据块。

现在参考图4,其示出了用于在存储器中存储可变长度数据块的示例性存储器系统400。该系统包括用于存储可变长度数据块的存储器402和逻辑404,该逻辑被配置成接收可变长度数据块并确定如何以及在何处将它们存储在存储器402中。

存储器402是被配置成存储数字信息,包括但不限于可变长度数据块的物理装置。存储器402可以是任何合适的形式,例如,但不限于DRAM(动态随机存取存储器)、SRAM(静态随机存取存储器)等。存储器402被分成可寻址的存储器块,其中每个可寻址的存储器块可以由唯一地址访问。

在一些情况下,如图4中所示,逻辑404可以经由存储器控制器406和存储器总线408连接到存储器402。存储器控制器406被配置成从系统中的其它部件(例如,但不限于逻辑404)接收存储器访问请求,并根据存储器访问请求将数据写入存储器402或从该存储器读取数据。每个存储器访问请求可以是读取请求或写入请求。读取请求指定要读取的存储器402的位置(例如地址),而写入请求指定要写入到存储器402的数据和要写入数据的存储器402的位置(例如地址)。在一些情况下,存储器402可以支持突发操作模式,其中存储器的多个连续可寻址块可以通过单个存储器访问请求被读取或写入。例如,在一些情况下,存储器的每个字节可以是可寻址的,并且当存储器402以突发模式操作时,可以通过仅指定第一地址的单个存储器访问请求读取/写入若干字节。

如上所述,本文将可以通过单个存储器访问请求写入存储器的数据的最大量称为最大可访问数据大小,并且本文将最大可访问数据大小的数据单元称为最大可访问数据单元。例如,如果最大可访问数据大小为64字节,则64字节的数据单元是最大可访问数据单元。

逻辑404被配置成接收可变长度数据块并将可变长度数据块按照M个可变长度数据块的集合存储在存储器402中,其中M是大于或等于二的整数。在某些情况下,M可以是4。每个可变长度数据块具有最大大小Y,其中Y是最大可访问数据大小的整数倍。换句话说,Y=N*B,其中,N是大于或等于二的整数,并且B是最大可访问数据大小。可变长度数据块可以代表任何类型的数据。在一些情况下,每个可变长度数据块可以代表帧缓冲数据或图像数据的块。不过,对本领域的技术人员将显而易见的是,这仅是示例。

更具体地说,逻辑404被配置成将每个集合的M个可变长度数据块存储在存储器中分配给该集合的M个可变长度数据块的存储器的部分410中。它可以是为每个集合的M个可变长度数据块分配存储器402的一部分410的逻辑404自身,或者可以是为每个集合的M个可变长度数据块分配存储器402的一部分410的另一部件或设备。

分配给一个集合的M个可变长度数据块的存储器402的部分410至少足够大以存储M个最大尺寸的可变长度数据块。例如,在可变长度数据块的最大大小为Y的情况下,分配给一个集合的M个可变长度数据块的存储器402的部分410大小大于或等于Y*M。图5示出了分配给四个可变长度数据块(即M=4)的集合的存储器的示例性部分500,其中,可变长度数据块的最大大小是256字节(即Y=256)。在此示例中,分配给四个可变长度数据块的集合的存储器的部分500是256*4=1024字节。

分配给M个可变长度数据块的集合的存储器402的部分410被分割或细分成最大可访问数据单元区段和剩余区段。每个区段的大小被设定成存储每个可变长度数据块的预定数量的最大可访问数据单元。具体地,最大可访问数据单元区段的大小被设定成存储每个可变长度数据块的X个最大可访问数据单元,并且剩余区段的大小被设定成存储每个可变长度数据块的Z个最大可访问数据单元,其中X+Z=N。在一些情况下,最大可访问数据单元区段被配置成存储比剩余区段更多的每个可变长度数据块的最大可访问数据单元(例如,在一些情况下,X>Z)。优选地,剩余区段的大小被设定成存储来自该集合中每个可变长度数据块的一个最大可访问数据单元,并且最大可访问数据单元区段的大小被设定成存储来自该集合中每个可变长度数据块的N-1个最大可访问数据单元。

例如,在最大可访问数据大小为B且每一集合中均存在M个可变长度数据块的情况下,剩余区段可具有B*M的大小,且最大可访问数据单元区段可具有B*(N-1)*M的大小。在图5所示的示例中,其中B=64字节,M=4且N=4,分配给该集合的M个可变长度数据块的存储器的1024字节部分500被分割成大小为B*(N-1)*M=64*(4-1)*4=768字节的最大可访问数据单元区段502和大小为B*M=64*4=256字节的剩余区段504。

最大可访问数据单元区段被细分成M个相同大小的组块,并且该集合中的每个可变长度数据块都被分配其中一个组块。每个组块的大小都被设定为存储X个最大可访问数据单元。例如,在图5所示的示例中,其中B=64字节,N=4且M=4,最大可访问数据单元区段被分成四个相等大小的组块(第一组块(“组块0”)506、第二组块(“组块1”)508、第三组块(“组块2”)510和第四组块(“组块3”)512)。第一组块(“组块0”)506可以被分配给该集合中的第一可变大小的数据块,第二组块(“组块1”)508可以被分配给集合中的第二可变长度数据块,第三组块(“组块2”)510可以被分配给集合中的第三可变长度数据块,并且第四组块(“组块3”)512可以被分配给集合中的第四可变长度数据块。尽管在此示例中,最大可访问数据单元区段502的组块506、508、510、512已按顺序分配给该集合中的可变长度数据块,但组块506、508、510、512可以任何方式分配给可变长度数据块。例如,第一组块可以分配给第四可变长度数据块,第二组块可以分配给第一可变长度数据块,等等。

然后,逻辑404被配置成针对集合中的每个可变长度数据块,在分配给该可变长度数据块的最大可访问数据单元区段的该组块中存储可变长度数据块的前P个最大可访问数据单元,其中,P是(i)可变长度数据块中的最大可访问数据单元的数目和(ii)X中的最小值;并将该集合中的可变长度数据块的任何剩余部分存储在共享剩余区段中。结合图6描述一种示例性方法,可以由逻辑404实施该方法以在分配给该集合的M个可变长度数据块的存储器部分的最大可访问数据单元区段和剩余区段中存储M个可变长度数据块的集合。

现在参考图6,其示出了在存储器的一部分中存储可变长度数据块集合的示例性方法600,其中,存储器的该部分被分割成如上所述的最大可访问数据单元区段和剩余区段。该方法可由图4的逻辑404来实施。

方法600开始于步骤602,其中,对于集合中的每个可变长度数据块,逻辑404在分配给该可变长度数据块的最大可访问数据单元区段的组块中存储可变长度数据块的前P个最大可访问数据单元。P是(i)可变长度数据块包括的最大可访问数据单元的数目G和(ii)X中的最小值(即,P=min(G,X))。如上所述,X是表示可存储在分配给特定可变长度数据块的最大可访问数据单元区段的组块中可以存储的最大可访问数据单元的数目的整数。如上所述,X小于N。优选地,X为N-1。

这可以包括对于该集合中的每个可变长度数据块确定可变长度数据块包括的最大可访问数据单元的数目G。可变长度数据块包括的最大可访问数据单元的数目G可被描述为可变长度数据块包括的最大可访问数据大小(即大小为B或B大小)的非重叠单元或部分的数目。可以通过计算可变长度数据块的大小S和最大可访问数据大小B的商(即

如果可变长度数据块包括的最大可访问数据单元的数目G小于或等于X(即,G≤X),则将该可变长度数据块G的所标识的最大可访问数据单元存储在最大可访问数据单元区段的对应组块中。不过,如果可变长度数据块包括的最大可访问数据单元的数目G大于X(即,G>X),则将前X个最大可访问数据单元写入最大可访问数据单元区段的对应组块中。如果确定可变长度数据块不包括任何最大可访问数据单元(即,可变长度数据块的大小小于最大可访问数据大小,使得G=0),则不将可变长度数据块的任何部分存储在存储器的最大可访问数据单元区段的对应组块中。

例如,图7示出了要存储在图5所示的存储器的部分500中的可变长度数据块的示例性集合,其包括第一可变长度数据块(“块0”)702、第二可变长度数据块(“块1”)704、第三可变长度数据块(“块2”)706和第四可变长度数据块(“块3”)708,其中,X=N-1=3。如图8所示,第一可变长度数据块(“块0”)702被分配最大可访问数据单元区段502的第一组块(“组块0”)506,第二可变长度数据块(“块1”)704被分配最大可访问数据单元区段502的第二组块(“组块1”)508,第三可变长度数据块(“块2”)706被分配最大可访问数据单元区段502的第三组块(“组块2”)510,并且第四可变长度数据块(“块3”)708被分配最大可访问数据单元区段502的第四组块(“组块3”)512。

如图7所示,第一可变长度数据块(“块0”)702包括三个最大可访问数据单元710、712和714,因此,如图8所示,这三个最大可访问数据单元710、712和714被写入到最大可访问数据单元区段502的第一组块(“组块0”)506。第二可变长度数据块(“块1”)704包括两个最大可访问数据单元716和718,因此,如图8所示,这两个最大可访问数据单元716和718被写入到最大可访问数据单元区段502的第二组块(“组块1”)508。第三可变长度数据块(“块2”)706不包括任何最大可访问数据单元(即,其小于最大可访问数据大小(例如,64字节)),因此,如图8所示,第三可变长度数据块(“块2”)706未被写入到最大可访问数据单元区段502的第三组块(“组块2”)510。第四可变长度数据块(“块3”)708包括三个最大可访问数据单元720、722和724,因此,如图8所示,这三个最大可访问数据单元720、722和724被写入到最大可访问数据单元区段502的第四组块(“组块3”)512。在图8所示的示例中,每个可变长度数据块的最大可访问数据单元按顺序被写入到最大可访问数据单元区段的对应组块,从该组块的开始或首地址开始。然而,在其它示例中,可变长度数据块的最大可访问数据单元可以以任何适当的方式(例如,从最后地址开始)写入到最大可访问数据单元区段的对应组块。

一旦集合中的每个可变长度数据块的前P个最大可访问数据单元被写入到最大可访问数据单元区段502的对应组块,则方法600进行到步骤604。

在步骤604处,将可变长度数据块的剩余部分写入到剩余区段504。可变长度数据块的其余部分(其也可以被称为剩余部分)可以被描述为未存储在存储器的最大可访问数据单元区段502中的可变长度数据单元的部分,或未形成前P个最大可访问数据单元的一部分的可变长度数据块的部分。

例如,如图7和8所示,第一可变长度数据块(“块0”)702的剩余部分726、第二可变长度数据块(“块1”)704的剩余部分728、第三可变长度数据块(“块2”)706的剩余部分730(在此示例中是整个可变长度数据块),以及第四可变长度数据块(“块3”)708的剩余部分732被存储在分配给该集合的存储器的部分500的剩余区段504中。尽管在此示例中,每个可变长度数据块包括剩余部分,但在其它示例中,可变长度数据块中的一个或多个可以不包括剩余部分。当可变长度数据块小于或等于X*B且其大小是最大可访问数据大小B的整数倍时,可能出现这种情况。例如,如果最大可访问数据大小为64字节且X=3,则如果可变长度数据块为64字节、128字节或192字节,则可能没有剩余部分。

在一些情况下,可变长度数据块的剩余部分可以在剩余区段504中被依次(例如,彼此相邻)打包,使得剩余区段中的剩余部分之间没有实质性间隙。例如,如图8所示,剩余部分726、728、730和732依次被存储在剩余区段504中。具体而言,第一剩余部分726(即,第一可变长度数据块(“块0”)702的剩余部分)存储在剩余区段504的开始或起始(例如,在开始或起始地址)处;第二剩余部分728(即,第二可变长度数据块(“块1”)704的剩余部分与第一剩余部分726相邻存储;第三剩余部分730(即,第三可变长度数据块(“块2”)706的剩余部分)与第二剩余部分728相邻存储;并且第四剩余部分732(即,第四可变长度数据块(“块3”)708的剩余部分)与第三剩余部分730相邻存储。在另一示例中,剩余部分726、728、730和732可以从剩余区段504的结尾(即,在结尾或最后地址处)开始,彼此相邻地存储在剩余区段504中。取决于存储器的配置,与另一剩余部分相邻地存储剩余部分可以在存储器中的两个剩余部分之间实现小间隙。例如,剩余部分可以存储在字边界或双字边界处,使得如果在前剩余部分不在字边界或双字边界处结束,则下一剩余部分可以存储在下一字或双字边界处,从而在它们之间在存储器中形成小间隙。然而,这样的间隙在本文中将被理解为非实质性间隙。

虽然将剩余部分背靠背(或彼此相邻)存储在剩余区段504中允许使用最少数量的存储器访问请求在剩余区段504中存储剩余部分,但这可能导致剩余部分中的一个或多个跨越剩余区段504的多个B大小(例如,最大可访问数据大小)的部分。这意味着尽管剩余部分可能小于最大可访问数据大小,但可能需要多个存储器访问请求(例如读取请求)来从存储器读取该剩余部分。例如,如图8所示,第三剩余部分730(即,第三可变长度数据块(“块2”)706的剩余部分)小于最大可访问数据大小(参见图7)。但第三剩余部分730存储在两个B大小(例如,最大可访问数据大小)部分中,表示其将花费两个读取请求以从存储器读取第三剩余部分730。因此,在其它示例中,如果与在前剩余部分相邻地存储一剩余部分不会使得在剩余区段的多个B大小部分中存储该剩余部分,则可以在剩余区段504中仅与在前剩余部分相邻地存储该剩余部分。下面参考图9和10描述以此方式将剩余部分存储在剩余区段504中的示例性方法。

在一些情况下,如图8和10中所示,可变长度数据块的剩余部分可以按其对应的最大可访问数据单元存储在最大可访问数据单元区段502中的相同次序存储在剩余区段504中。例如,如果第一可变长度数据块的最大可访问数据单元在最大可访问数据单元区段502中存储在第二可变长度数据块的最大可访问数据单元之前,则第一可变长度数据块的剩余部分可以在剩余区段504中存储在第二可变长度数据块的剩余部分之前。在其他情况下,可变长度数据块的剩余部分可以按与其对应的最大可访问数据单元存储在最大可访问数据单元区段502中的不同的次序存储在剩余区段504中。例如,如果第一可变长度数据块的最大可访问数据单元在最大可访问数据单元区段502中存储在第二可变长度数据块的最大可访问数据单元之前,则第二可变长度数据块的剩余部分可以在剩余区段504中存储在第一可变长度数据块的剩余部分之前。

在一些情况下,将剩余部分存储在剩余区段504中可以包括从剩余部分形成一个或多个剩余块,然后在剩余区段504中存储剩余部分。可以根据上述方法中的任一种由剩余部分形成剩余块。例如,可以通过如上所述将剩余部分背靠背打包来形成单个剩余块。然后,该剩余块可以存储在例如剩余区段的开始或剩余区段的结束处。

与基于剩余部分在剩余区段中存储剩余部分相反,形成一个或多个剩余块,并且然后将剩余块存储在剩余区段中可以减少用于将剩余部分存储在剩余区段中使用的存储器访问请求的数量。例如,如果存在四个剩余部分,并且每个部分经由独立的存储器访问请求(例如,写入请求)存储在剩余区段中,那么将花费四个存储器访问请求来将剩余部分存储在存储器中。相比之下,如果四个剩余部分被打包在一起以形成可以跨越两个B大小(即,最大可访问数据大小)的部分存储的剩余块,则可以使用仅两个存储器访问请求将剩余部分写入到剩余区段。

一旦可变长度数据块的剩余部分存储在共享剩余区段504中,方法600进行到步骤606。

在步骤606处,在存储器的标头区段802(图8)中存储指示或标识集合中的每个可变长度数据块的大小的信息。

例如,如图8所示,存储器的标头区段802可包括用于集合中的每个可变长度数据块的标头804、806、808、810。具体而言,在图8中,对于集合中的第一可变长度数据块702,存在第一标头804;对于集合中的第二可变长度数据块704,存在第二标头806;对于集合中的第三可变长度数据块706,存在第三标头808;对于集合中的第四可变长度数据块708,存在第四标头810。在一些情况下,可变长度数据块的标头可能相对较小(例如1字节)。对于本领域技术人员将显而易见的是,这仅是示例,并且在其它情况下,对于可变长度数据块的每个集合可以存在单个标头。每个标头804、806、808、810包括标识可变长度数据块的大小的块大小信息812。如下文更详细所述,在一些情况下,每个标头804、806、808、810还可以包括其它信息814。

块大小信息812可以包括可变长度数据块的大小(例如,以字节为单位)。可使用可变长度数据块的大小来确定:(i)对于该可变长度数据块,有多少B大小的部分存储在最大可访问数据单元区段中;以及(ii)对于该可变长度数据块,剩余部分的大小。

如果剩余区段中的剩余部分的顺序是已知的或预定的,则也可以由剩余部分的大小来确定剩余部分中的每一个的位置。例如,在图8中,剩余部分726、728、730、732被背靠背地存储于剩余区段504中,使得首先存储第一可变长度数据块702的剩余部分726;第二存储第二可变长度数据块704的剩余部分728;第三存储第三可变长度数据块706的剩余部分730;第四存储第四可变长度数据块708的剩余部分732。如果从标头804、806、808、810的块大小信息812已知第一可变长度数据块702的剩余部分726具有x的大小(例如x字节),并且第二可变长度数据块704的剩余部分728具有y的大小(例如y字节),则可以确定第二可变长度数据块704的剩余部分728偏移x开始并且大小为y字节。

在其它情况下,并非在标头区段中存储可变长度数据块的实际大小,块大小信息812可以包括(i)存储在存储器中的B大小部分的数目,以及(ii)剩余部分的大小。

在不能单独从大小信息确定存储器中剩余部分的位置(例如,因为剩余区段中的剩余部分的顺序不是预定的)的情况下,方法600可以进行到步骤608,其中,在存储器的标头区段中存储标识存储器中每个剩余部分的位置的信息。标识剩余区段中的剩余部分的位置的信息可以存储在标头804、806、808、810的其他信息814中。

在一些情况下,标识剩余区段中的剩余部分的位置的信息可以包括指示或标识剩余区段中的每个剩余部分的起始地址的信息。例如,对于每个可变长度数据块,可以在标头804、806、808、810中存储对应剩余部分在存储器中的地址或者可以确定对应剩余部分在存储器中的地址的偏移(例如,从剩余区段的起始地址起的偏移)。

在其他情况下,标识剩余区段中的剩余部分的位置的信息可以包括标识剩余区段中的剩余部分的次序的信息。例如,每个可变长度数据块的标头804、806、808、810可以包括指示剩余区段中对应的剩余部分的次序的次序字段。例如,在集合中存在四个可变长度数据块的情况下,每个可变长度数据块的标头804、806、808、810可以包括指示对应的剩余区段是剩余区段中的第一、第二、第三还是第四剩余部分的次序字段。

一旦在标头区段802中存储了标识剩余区段中的剩余部分的位置的信息,则方法600结束。然后,可以为不同的可变长度数据块集合执行方法600。

现在参考图9,其示出了在剩余区段504中存储一个集合的M个可变长度数据块的剩余部分的示例性方法900。在本示例中,剩余区段504被分成多个B大小(即,最大可访问数据大小)的部分1002、1004、1006、1008,如图10中所示。在这种方法900中,除非与在前剩余部分相邻地放置一剩余部分将使得该剩余部分被存储在剩余区段的多个B大小部分中,则在剩余区段中背靠背地(或彼此相邻地)存储剩余部分。方法900可以用于实施图6的方法600的步骤604。

该方法开始于步骤902,其中,逻辑404接收第一剩余部分(例如,第一可变长度数据块(“块0”)702的剩余部分726)。一旦接收到第一剩余部分,方法900就前进到步骤904,其中,逻辑404使得第一剩余部分存储在剩余区段504的一端(例如剩余区段504的开始或结束)处。例如,如图10所示,第一剩余部分726可以存储在剩余区段504的开始处。使得第一剩余部分存储于剩余部分504的一端处可以包括:(i)将第一剩余部分存储于剩余区段504的一端处;或(ii)产生包括第一剩余部分的剩余块,该剩余块当存储在剩余区段中时,使得第一剩余部分存储于剩余区段504的一端处。接着,方法900前进到步骤906。

在步骤906处,逻辑404确定该集合M个可变长度数据块是否存在任何其它剩余部分。如果对于该集合M个可变长度数据块没有其它剩余部分,则方法900结束。不过,如果对于该集合M个可变长度数据块有至少一个额外剩余部分,则方法900前进至步骤908。

在步骤908,在逻辑404处接收下一剩余部分。方法900然后前进到步骤910,其中,逻辑404确定在剩余区段中与在前剩余部分相邻地存储下一剩余部分是否将使得该剩余部分被存储在剩余区段的两个不同B大小部分1002、1004、1006和1008中/之间。如果确定在剩余区段中与在前剩余部分相邻地存储下一剩余部分不会使得该剩余部分被存储在剩余区段的两个不同的B大小部分1002、1004、1006和1008中,那么方法900前进到步骤912,其中,逻辑404使得该剩余部分在剩余区段中与在前剩余部分相邻地存储。使得下一剩余部分与在前剩余部分相邻地存储于剩余区段504中可以包括:(i)将该剩余部分与在前剩余部分相邻地存储于剩余区段504中;或(ii)产生包括在前剩余部分和下一剩余部分的剩余块,该剩余块当存储在剩余区段中时,使得下一剩余部分与在前剩余部分相邻地存储于剩余区段504中。

不过,如果确定在剩余区段中与在前剩余部分相邻地存储下一剩余部分将使得该下一剩余部分被存储在剩余区段的两个不同的B大小部分1002、1004、1006和1008中,那么方法900前进到步骤914,其中,逻辑404使得该剩余部分被存储在剩余区段的下一B大小(即,最大可访问数据大小)的部分的开始处。使得下一剩余部分存储于剩余区段的下一B大小部分的开始处可以包括:(i)将该剩余部分存储于剩余区段504的下一B大小部分的开始处;或(ii)产生包括在前剩余部分和下一剩余部分的剩余块,该剩余块当存储在剩余区段中时,使得该剩余部分存储于剩余区段504的下一B大小部分的开始处。

在(在步骤912或914中)确定剩余部分在剩余区段504中的位置之后,方法900返回至步骤906,其中,逻辑404确定该集合M个可变长度数据块是否有任何更多剩余部分。如果存在另一剩余部分,则针对该剩余部分重复步骤908至914。如果不存在更多的剩余部分,则方法900结束。

例如,如图10所示,如果第二剩余部分728(即,第二可变长度数据块(“块1”)704的剩余部分)与第一剩余部分726相邻地存储,则第二剩余部分728将仅存储在剩余区段的单个B大小部分(即,部分1002)中。因此,第二剩余部分728与第一剩余部分726相邻地存储于剩余区段504中。不过,如果第三剩余部分730(即,第三可变长度数据块(“块2”)706的剩余部分)与第二剩余部分728相邻地存储,则第三剩余部分730将存储于剩余区段的两个B大小部分(即,部分1002和1004)中/之间(这可以在图8中看出)。因此,第三剩余部分730不与第二剩余部分728相邻地存储于剩余区段504中,而是第三剩余部分730存储在剩余区段504的下一个B大小部分(即,部分1004)的开始处。如果第四剩余部分732(即,第四可变长度数据块(“块3”)708的剩余部分)与第三剩余部分730相邻地存储,则第四剩余部分732将仅存储在剩余区段的单个B大小部分中。因此,第四剩余部分732与第三剩余部分730相邻地存储于剩余区段504中。

现在参考图11,其示出了根据上述方法和系统从存储器读取可变长度数据块的示例性方法1100,其中,可变数据长度数据块已作为M个可变长度数据块的集合的一部分存储在存储器中。从存储器读取(或检索)的该集合的可变长度数据块在本文中称为相关可变长度数据块。方法1100可以由图4的逻辑404或被配置成从存储器402检索可变长度数据块的其它逻辑执行。方法1100开始于步骤1102,其中,从存储器读取与该集合的M个可变长度数据块相关联的一个或多个标头。该一个或多个标头包括指示该集合中的每个可变长度数据块的大小的信息,以及指示该集合中的每个可变长度数据块的剩余部分(如果有的话)在剩余区段中的位置的信息。

例如,如上所述,对于图7的四个可变长度数据块702、704、706、708的集合中的每个可变长度数据块,可以存在标头804、806、808、810。每个标头包括标识对应可变长度数据块的大小的信息。标识对应可变长度数据块的大小的信息可以包括总大小(例如,以字节为单位),或者可以包括最大可访问数据单元的数目和剩余部分的大小。在一些情况下,每个标头可以另外包括标识存储器中剩余部分的位置的信息。

在步骤1104处,根据在步骤1102中读取的标头,确定相关可变长度数据块是否包括至少一个最大可访问数据单元(即,大小B的单元)。可变长度数据块是否包括至少一个最大可访问数据单元的确定可以基于相关可变长度数据块的大小。例如,如果相关可变长度数据块的大小小于最大可访问数据单元的大小,则可变长度数据块不包括至少一个最大可访问数据单元。不过,如果相关数据块的大小大于或等于最大可访问数据单元的大小,则可变长度数据块包括至少一个最大可访问数据单元。

如果确定相关可变长度数据块包括至少一个最大可访问数据单元,则方法1100前进到步骤1106。不过,如果确定相关可变长度数据块不包括任何最大可访问数据单元,则方法1100前进到步骤1108。

在步骤1106处,从分配给该相关可变长度数据块的存储器的最大可访问数据单元区段的组块读取相关可变长度数据块的前P个最大可访问数据单元。

如上所述,每个集合的M个可变长度数据块被分配有存储器的一部分500,该部分被划分成最大可访问数据单元区段502和剩余区段504。该集合中的每个可变长度数据块都被分配以该最大可访问数据单元区段的相等大小的组块。分配给可变长度数据块的最大可访问数据单元区段的组块的大小为X*B,其中X是小于N的整数。因此,每个组块可以存储最多X个最大可访问数据单元。

读取相关可变长度数据块的前P个最大可访问数据单元可以包括标识该相关可变长度数据块包括的最大可访问数据单元的数量G。相关可变长度数据块包括的最大可访问数据单元的数量G可以被计算为(S/B)的下限,其中S是相关可变长度数据块的大小,B是最大可访问数据大小。如果G小于或等于X,则从分配给相关可变长度数据块的存储器的组块读取G个最大可访问数据单元。不过,如果G大于X,则从存储器的组块读取X个最大可访问数据单元。换句话说,P=min(floor(S/B),X),其中“floor”表示返回小于或等于输入值的最接近整数的下取整函数。

可通过单个存储器访问请求来访问每个最大可访问数据单元。因此,从存储器读取相关可变长度数据块的前P个最大可访问数据单元的存储器访问请求的数目等于P。例如,从分配给该可变长度数据块的存储器的组块506读取第一示例性可变长度数据块702的三个最大可访问数据单元710、712、714会花费三个存储器访问请求,而读取第二示例性可变长度数据块704的两个最大可访问数据单元716、718会花费两个存储器访问请求。一旦从分配给该可变长度数据块的组块读取了相关可变长度数据块的前P个最大可访问数据单元,则方法1100前进到步骤1108。

在步骤1108处,从一个或多个标头确定相关可变长度数据块是否包括不在分配到该可变长度数据块的存储器的组块中的剩余部分。相关可变长度数据块是否包括剩余部分的确定可以基于可变长度数据块的大小和分配给可变长度数据块的组块的大小(例如X)。如果确定该相关可变长度数据块有剩余部分,则方法1100前进至步骤1110。不过,如果确定该相关可变长度数据块没有剩余部分,则方法1100结束。

在步骤1110处,从在步骤1102中读取的一个或多个标头针对M个可变长度数据块的集合确定剩余部分在剩余区段中的大小和位置。可以从标识可变长度数据块的大小的信息来确定剩余部分的大小。如上所述,在存储器中的剩余区段的次序是预定的情况下,可以根据该集合中的可变长度数据块的剩余部分的大小确定存储器中的剩余区段的位置。在其它情况下,可以从标头中的附加信息确定剩余部分在剩余区段中的位置,例如,但不限于剩余部分在剩余区段中的次序或剩余部分在剩余区段中的初始地址/偏移。一旦已经确定剩余部分在剩余区段中的大小和位置,方法1100就前进到步骤1112。

在步骤1112处,从剩余区段中的所标识位置读取相关可变长度数据块的剩余部分。从存储器读取剩余部分的存储器访问请求的数目取决于剩余部分的大小和用于将剩余部分存储在剩余区段中的方法。例如,即使在剩余部分的最大大小是最大可访问数据大小的情况下,可能还需要多个访问请求才能从存储器检索剩余部分。例如,如图8所示,如果剩余部分726、728、730、732在剩余区段中背靠背(或彼此相邻)存储,则剩余部分中的一个或多个可以存储在剩余区段的多个B大小部分中/之间。具体地,如图8所示,第三剩余部分730存储在剩余区段的多个B大小的部分中,因此将需要两个存储器访问请求来从存储器读取第三剩余部分730。一旦已从存储器读取相关可变长度数据块的剩余部分,则方法结束。

尽管图4中未示出,但存储器系统400可以包括(例如片上)高速缓存,其存储例如剩余区段(例如B大小的单元)的最新读取的最大可访问数据单元/部分。在将多个剩余部分存储在同一最大可访问数据单元中的情况下,这可以减少从存储器读取可变长度数据块所需的存储器访问请求的数量。例如,如图8所示,第一可变长度数据块702的剩余部分726和第二可变长度数据块704的剩余部分728都存储在剩余区段504的第一最大可访问数据单元/部分中。如果读取该最大可访问数据单元/部分以检索第一个可变长度数据块,则它将存储在高速缓存中。如果随后从存储器读取第二可变长度数据块,那么可从高速缓存,而不是经由存储器访问请求获得第二可变长度数据块的剩余部分。

现在参考图12,其示出了在更新或修改可变长度数据块之后将可变长度数据块(其形成一起存储在存储器中的可变长度数据块集合的一部分)写入存储器的示例性方法1200。被修改和写入的该集合的可变长度数据块在本文中称为相关可变长度数据块。可以在从存储器(例如,根据图11的方法1100)读取相关可变长度数据块之后,执行方法1200。

方法1200可以由图4的逻辑404或被配置成向存储器写入可变长度数据块的其它逻辑来实施。方法1200开始于步骤1202,其中,接收集合的更新或修改的可变长度数据块。例如,可以根据图6的方法600在存储器中存储图7中所示的可变长度数据块702、704、706、708的集合,如图8所示。如果相关可变长度数据块是第一可变长度数据块702,则接下来可以从存储器(例如,根据图11的方法1100)读取第一可变长度数据块702,随后修改它以生成图13中所示的修改的可变长度数据块1302。一旦已经接收到修改的可变长度数据块,方法1200就前进到步骤1204。

在步骤1204处,将修改的可变长度数据块的前P个最大可访问数据单元存储在分配给相关可变长度数据块的存储器的组块中(即,分配给相关可变长度数据块的最大可访问数据单元区段的组块),其中X(X

例如,图13的修改的可变长度数据块1302包括三个最大可访问数据单元1304、1306和1308。由于分配给相关可变长度数据块的示例性组块506可以保存多达三个最大可访问数据单元,因此将那三个最大可访问数据单元1304、1306、1308写入分配给该可变长度数据块的组块506,如图14所示。一旦在分配给该相关可变长度数据块的存储器的组块中存储了修改的可变长度数据块的前P个最大可访问数据单元,则方法1200前进到步骤1206。

在步骤1206,确定修改的可变长度数据块的剩余部分的大小是否与修改之前的可变长度数据块的剩余部分的大小不同。具体地,确定修改是否使可变长度数据块的剩余部分更小或更大。如果确定修改的可变长度数据的剩余部分的大小与修改之前可变长度数据块的剩余部分的大小没有区别,则方法1200前进到步骤1208,其中,修改的可变长度数据块的剩余部分(即,修改的可变长度数据块的该部分不落在前P个最大可访问数据单元之内)(如果有的话)与原始/在前可变长度数据块的剩余部分存储在剩余区段的相同位置处的剩余区段中。不过,如果确定修改的可变长度数据块的剩余部分的大小与修改之前的可变长度数据块的剩余部分的大小不同,则方法1200前进到步骤1210。在图13所示的示例中,修改的可变长度数据块1302的剩余部分1310大于图7所示的原始可变长度数据块702的剩余部分726,因此,在此示例中,方法1200前进到步骤1210。

在步骤1210,确定修改的可变长度数据块的剩余部分的大小变化是否影响剩余区段中存储的任何其他剩余部分。受修改的可变长度数据块的剩余部分的大小变化影响的剩余部分是必须重新打包或重新存储在剩余区段中以适应修改的可变长度数据块的剩余部分的大小变化的那些部分。受可变长度数据块的大小变化影响的剩余部分可以取决于用于将剩余部分存储在剩余区段中的方法和/或修改的可变长度数据块的剩余部分的大小。

例如,在如图8所示剩余部分背靠背(或彼此相邻)地存储于剩余区段中的情况下,则受可变长度数据块的大小变化影响的剩余部分是在相关可变长度数据块的剩余部分之后存储于剩余区段中的那些剩余部分。因此,在这些情况下,如果修改的可变长度数据块的剩余部分是剩余区段中的最后剩余部分,则不存在受该可变长度数据块的大小变化影响的剩余部分。不过,如果修改的可变长度数据块的剩余部分不是剩余区段中的最后剩余部分,则将有至少一个受修改的可变长度数据块的大小变化影响的剩余部分。

例如,如图13的示例中那样,第一可变长度数据块702被修改,并且剩余部分被按顺序存储(例如,第一、第二、第三和第四可变长度数据块以所述次序存储在剩余区段中),接着第二、第三和第四可变长度数据块的剩余部分在第一可变长度数据块的剩余部分之后被存储在剩余区段中,且因此是受第一可变长度数据块的剩余部分的大小变化影响的剩余部分。因此,在此示例中,第二、第三和第四可变长度数据块的剩余部分728、730和732是受修改的可变长度数据块的剩余部分的大小变化影响的剩余部分。

不过,在如图10所示将剩余部分背靠背(或彼此相邻)地存储于剩余区段中(除非这会使得剩余部分跨越B大小边界)的情况下,则基于剩余部分的大小,受可变长度数据块的大小变化影响的剩余部分可以是(i)剩余区段中在相关可变长度数据块的剩余部分之后的剩余部分;或者(ii)没有任何剩余部分。例如,参考图10,如果第二可变长度数据块704被修改以使得其剩余部分大于原始剩余部分728,只要修改的第二可变长度数据块的剩余部分可配合在第一B大小部分1002中,则剩余区段中其之后的剩余部分730、732不受剩余部分的大小变化的影响。不过,如果修改的第二可变长度数据块的剩余部分不再能完全配合在第一B大小部分1002中,则剩余区段中在其之后的剩余部分730、732将受到该剩余部分的大小变化的影响。类似地,参考图10,如果第二可变长度数据块704被修改以使得其剩余部分小于原始剩余部分728,只要修改的第二可变长度数据块的剩余部分未缩小过大而使得第三可变长度数据块的剩余部分730也能够存储于第一B大小部分中,则其之后的剩余部分730、732不受该剩余部分的大小变化的影响。不过,如果修改的第二可变长度数据块的剩余部分已经缩小,使得第三可变长度数据块的剩余部分730现在可以存储在剩余区段的第一B大小部分1002中,那么第三和第四可变长度数据块的剩余部分730、732将受到修改的可变长度数据块的剩余部分的大小变化的影响。

如果确定不存在受修改的可变长度数据块的剩余部分的大小变化影响的其它剩余部分,则方法1200前进到步骤1208,其中,修改的可变长度数据块的剩余部分被写入到存储器中与相关可变长度数据块的在前剩余部分相同的位置。不过,如果确定存在受修改的可变长度数据块的剩余部分的大小变化影响的至少一个其它剩余部分,则方法1200前进到步骤1212。

在步骤1212处,从剩余区段读取在步骤1210中标识的其它剩余部分(即,受修改的可变长度数据块的剩余部分的大小变化影响的那些)。一旦从剩余区段读取了其它剩余部分,方法1200就前进到步骤1214。

在步骤1214,根据上文所描述的用于将剩余部分存储在剩余区段中的任何方法,对修改的可变长度数据块的剩余部分和在步骤1212中读取的剩余部分重新打包。一旦已生成重新打包的剩余块,方法1200就前进到步骤1216,其中,在剩余区段中存储重新打包的剩余块。例如,可以将图13的修改的可变长度数据块1302的剩余部分1310与第二、第三和第四可变长度数据块的剩余部分728、730和732背靠背(例如,彼此相邻)地重新打包,以形成要写入剩余区段504的重新打包的剩余块,如图14所示。一旦重新打包的剩余块已经存储在存储器中,方法1200就前进到步骤1218。

在步骤1218,更新与一个或多个可变长度数据块相关联的标头以反映可变长度数据块的当前大小和/或剩余部分的位置。至少更新与修改的可变长度数据块1302相关联的标头以反映该可变长度数据块的大小。例如,在图13和14的示例中,更新第一可变长度数据块的标头以反映该可变长度数据块的当前大小。取决于在标头中存储什么附加信息,还可以更新集合中的其它可变长度数据块中的一个或多个的标头。例如,如上所述,在一些情况下,附加信息可以存储在每个可变长度数据块的标头中,其指示每个剩余部分在剩余区段中的位置。如果附加信息包括指示剩余区段中对应的剩余部分的次序的信息,则如果剩余部分的次序未改变,则可以不更新其它可变长度数据块的标头。不过,如果附加信息包括对应的剩余部分的开始地址,则可以更新其剩余部分已被移动的每个可变长度数据块的标头,以反映剩余部分的新开始地址。

尽管在结合图12所述的示例性方法1200中,只有当确定修改可变长度数据块已经改变了可变长度数据块的剩余部分的大小时,才会执行从存储器读取其它剩余部分及其重新打包,但在其它示例中,可能更高效的是针对每个修改的可变长度数据块都执行步骤1212到1218,而不管修改是否改变了剩余部分的大小。

如上所述,与结合图3所述的方法相比,以上文描述的方式存储可变长度数据块的集合(例如,在分配给该集合中的每个可变长度数据块的组块中存储其最大可访问数据单元,并且在共享剩余区段中存储其任何剩余部分(未落在最大可访问数据单元中的可变长度数据块的部分))允许以效率高得多的方式在存储器中存储块的修改版本,因为仅需要对相关剩余部分而不是整个可变长度数据块进行读取、重新打包和重新存储。

如上所述,所描述的系统、逻辑和方法可用于图形处理系统中以将数据块(例如,但不限于压缩帧缓冲数据)存储到图形处理系统的存储器中和/或从图形处理系统的存储器读取数据块(例如,但不限于压缩帧缓冲数据)。例如,图形处理系统可以生成对应于像素块的像素数据,并且可以压缩每个像素数据块以形成可变长度数据块。

图形处理系统被配置成例如从在计算机系统上运行的应用程序(例如游戏应用程序)接收图形数据,并对来自图形数据的图像进行渲染以提供渲染输出。举例来说,应用程序可以生成场景的3D模型并输出表示场景中的对象的几何结构数据。特定来说,应用程序可以使用一个或多个基元(即,简单的几何形状,例如但不限于可以被应用纹理的矩形、三角形、线和点)来表示每个对象,所述多个基元由一个或多个顶点的位置限定。在这些状况下,由应用程序输出的几何结构数据可以包含标识每个顶点的信息(例如顶点在世界空间中的坐标)和指示由顶点形成的基元的信息。然后,图形处理系统将接收到的几何结构数据转换成可以在屏幕上显示的图像。

图形处理系统可以例如实施即时模式渲染(IMR)或基于平铺块的渲染(TBR)。在IMR中,将整个场景作为整体进行渲染。与此对比,在TBR中,使用被划分成被称为平铺块的子区段的渲染空间对场景进行渲染,其中可针对每个平铺块独立地执行渲染过程的至少一部分。平铺块可以具有任何合适形状,但通常为矩形(其中术语“矩形”包含正方形)。TBR的优点为,可以在渲染期间使用快速、片上存储器以用于颜色、深度和模板缓冲区操作,这与IMR相比允许显著减少系统存储器带宽,而不需要足够大以同时存储用于整个场景的数据的片上存储器。

TBR涉及两个关键阶段:几何处理阶段;以及光栅化阶段。在几何处理阶段期间,将从应用程序(例如游戏应用程序)接收的几何结构数据(例如限定基元的顶点)从世界空间坐标变换成屏幕空间坐标。然后创建至少部分地落在平铺块的边界内的经过变换的基元(例如三角形)的每平铺块列表。在光栅化阶段期间,对每个平铺块单独地渲染(即,将经过变换的基元映射到像素并且针对平铺块中的每个像素标识颜色)。这可以包括标识哪个(哪些)基元在每个像素处是可见的。接着可以由每个像素处的可见基元的外观确定所述像素的颜色,所述可见基元可以由应用于所述像素处的纹理和/或在所述像素上运行的像素着色器程序限定。像素着色器程序描述将针对给定像素执行的操作。对每个平铺块单独地渲染会使图形处理系统能够在光栅化阶段中对特定平铺块进行渲染时仅检索与所述平铺块相关的经过变换的基元数据,这会使针对存储器(例如中间缓冲区)的带宽要求保持为低。一旦已经针对平铺块中的每个像素标识出颜色值,就将平铺块的颜色值写出到存储器(例如帧缓冲区)。一旦已经渲染整个场景(即,一旦已经针对所有平铺块的像素确定了颜色值),场景就可以例如显示在屏幕上。

图15示出示例性TBR图形处理系统1500。系统1500包括存储器1502

几何处理逻辑1504实施TBR的几何处理阶段。几何处理逻辑1504包括变换逻辑1508和平铺引擎1510。变换逻辑1508从应用程序(例如游戏应用程序)接收几何结构数据(例如顶点、基元和/或补片)并将几何结构数据变换到渲染空间(例如屏幕空间)中。变换逻辑1508还可以执行例如裁剪和剔除的功能以移除落在视锥外的几何结构数据(例如基元或补片),和/或应用所属领域的技术人员所知的照明/属性处理。经过变换的几何结构数据(例如顶点、基元和/或补片)(i)被存储在存储器1502

光栅化逻辑1506实施TBR的光栅化阶段。具体而言,光栅化逻辑1506通过从存储器1502

在一些情况下,光栅化逻辑1506可包括光栅化器1512、隐藏表面移除(HSR)逻辑1514和纹理化/着色逻辑1516。在这些情况下,光栅化器1512从存储器1502

然后将特定平铺块的基元片段提供到HSR逻辑1514,所述HSR逻辑通过对基元片段执行深度测试而移除隐藏(例如,被其他基元片段隐藏)的基元片段。接着将其余片段(在隐藏表面移除之后)传递到纹理化/着色逻辑1516,所述纹理化/着色逻辑对基元片段执行纹理化和/或着色以确定被渲染图像的像素值。接着,将平铺块的被渲染像素值存储在存储器1502

光栅化逻辑1506处理每个平铺块,并且当整个图像已经被渲染并存储在存储器1502

图16示出了其中可实施本文所描述的逻辑404或本文描述的图形处理系统1500的计算机系统。计算机系统包括CPU 1602、GPU1604、存储器1606和其他装置1614,例如显示器1616、扬声器1618及相机1620。处理块1610(其可对应于本文中所描述的逻辑404和/或图形处理系统1500)实施在GPU 1604上。在其他示例中,处理块1610可以在CPU 1602上实现。计算机系统的部件可通过通信总线1622彼此通信。

图4和15的存储器系统(或其逻辑)和图形处理系统被示为包括多个功能块。这仅是示意性的,并不旨在限定此类实体的不同逻辑元件之间的严格划分。每个功能块可以任何合适的方式提供。应当理解,本文中被描述为由存储器系统(或其逻辑)或图形处理系统形成的中间值不需要由存储器系统(或其逻辑)或图形处理系统在任何点物理上生成,并且可以仅表示逻辑值,所述逻辑值方便地描述了由存储器系统(或其逻辑)或图形处理系统在其输入和输出之间执行的处理。

本文所描述的存储器系统(或其逻辑)和图形处理系统可以包含在集成电路上的硬件中。本文中所描述的存储器系统(或其逻辑)和图形处理单元可配置成执行本文所描述的任一种方法。一般来说,上文所述的功能、方法、技术或部件中的任一个可以在软件、固件、硬件(例如,固定逻辑电路系统)或其任何组合中实施。本文可以使用术语“模块”、“功能”、“部件”、“元件”、“单元”、“块”和“逻辑”来概括地表示软件、固件、硬件或其任何组合。在软件实施方式的情况下,模块、功能、部件、元件、单元、块或逻辑表示程序代码,所述程序代码在处理器上执行时执行指定任务。本文中所描述的算法和方法可以由执行代码的一个或多个处理器执行,所述代码使处理器执行算法/方法。计算机可读存储介质的示例包含随机存取存储器(RAM)、只读存储器(ROM)、光盘、闪存、硬盘存储器以及可以使用磁性、光学和其他技术来存储指令或其他数据并可以由机器存取的其他存储器设备。

如本文中所使用的术语计算机程序代码和计算机可读指令是指供处理器执行的任何种类的可执行代码,包含以机器语言、解释语言或脚本语言表达的代码。可执行代码包含二进制代码、机器代码、字节代码、定义集成电路的代码(例如硬件描述语言或网表),以及用例如C、Java或OpenCL等编程语言代码表达的代码。可执行代码可以是例如任何种类的软件、固件、脚本、模块或库,当在虚拟机或其他软件环境中被适当地执行、处理、解释、编译、运行时,这些软件、固件、脚本、模块或库使支持可执行代码的计算机系统的处理器执行由所述代码指定的任务。

处理器、计算机或计算机系统可以是任何种类的设备、机器或专用电路,或其集合或一部分,它具有处理能力使得可以执行指令。处理器可以是任何种类的通用或专用处理器,例如CPU、GPU、片上系统、状态机、媒体处理器、专用集成电路(ASIC)、可编程逻辑阵列、现场可编程门阵列(FPGA)等。计算机或计算机系统可以包括一个或多个处理器。

本发明还意图涵盖限定如本文中所描述的硬件的配置的软件,例如硬件描述语言(HDL)软件,用于设计集成电路或用于配置可编程芯片以执行所要功能。也就是说,可以提供一种计算机可读存储介质,其上编码有集成电路定义数据集形式的计算机可读程序代码,当被在集成电路制造系统中处理(即运行)时,这种集成电路定义数据集将该系统配置为制造被配置为执行如本文所述的任何方法的存储器系统(或其逻辑)或图形处理系统,或者制造包括如本文所述的任何装置的存储器系统(或其逻辑)或图形处理系统。集成电路定义数据集可以是例如集成电路描述。

因此,可以提供一种在集成电路制造系统中制造如本文所述的存储器系统(或其逻辑)或图形处理系统的方法。此外,可以提供一种集成电路定义数据集,当在集成电路制造系统中被处理时,该集成电路定义数据集使得制造存储器系统(或其逻辑)或图形处理系统的方法被执行。

集成电路定义数据集可以是计算机代码的形式,例如作为网表,用于配置可编程芯片的代码,作为定义适合于在集成电路中以任何级别制造的硬件描述语言,包括作为寄存器传输级(RTL)代码,作为高级电路表示法(诸如Verilog或VHDL),以及作为低级电路表示法(诸如OASIS(RTM)和GDSII)。在逻辑上定义适合于在集成电路中制造的硬件的更高级表示法(诸如RTL)可以在计算机系统上处理,该计算机系统被配置用于在软件环境的上下文中生成集成电路的制造定义,该软件环境包括电路元件的定义和用于组合这些元件以生成由该表示法定义的集成电路的制造定义的规则。如通常软件在计算机系统处执行以便定义机器的情况一样,可能需要一个或多个中间用户步骤(例如,提供命令、变量等),以便将计算机系统配置成生成集成电路的制造定义,以执行定义集成电路以便生成所述集成电路的制造定义的代码。

现在将参考图17描述在集成电路制造系统处处理集成电路定义数据集以便将该系统配置为制造存储器系统(或其逻辑)或图形处理系统的示例。

图17示出了集成电路(IC)制造系统1702的示例,其被配置为制造如本文任一示例中所描述的存储器系统(或其逻辑)或图形处理系统。具体地说,IC制造系统1702包括布局处理系统1704和集成电路生成系统1706。IC制造系统1702被配置为接收IC定义数据集(例如,定义如本文的任何示例中描述的存储器系统(或其逻辑)或图形处理系统),处理IC定义数据集,并根据IC定义数据集来生成IC(例如,其包含如本文任何示例中所述的存储器系统(或其逻辑)或图形处理系统)。IC定义数据集的处理配置IC制造系统1702以制造包含如本文任一示例中所描述的存储器系统(或其逻辑)或图形处理系统的集成电路。

布局处理系统1704被配置成接收和处理IC定义数据集以确定电路布局。根据IC定义数据集确定电路布局的方法在本领域中是已知的,并且例如可以涉及合成RTL代码以确定要生成的电路的门级表示,例如就逻辑部件(例如NAND、NOR、AND、OR、MUX和FLIP-FLOP部件)而言。通过确定逻辑部件的位置信息,可以根据电路的门级表示来确定电路布局。这可以自动完成或者在用户参与下完成,以便优化电路布局。当布局处理系统1704已经确定电路布局时,其可将电路布局定义输出到IC生成系统1706。电路布局定义可以是例如电路布局描述。

如所属领域中已知,IC生成系统1706根据电路布局定义来生成IC。举例来说,IC生成系统1706可实施生成IC的半导体装置制造工艺,其可涉及光刻和化学处理步骤的多步骤序列,在此期间,在由半导体材料制成的晶片上逐渐形成电子电路。电路布局定义可呈掩模的形式,其可以在光刻工艺中用于根据电路定义来生成IC。替代地,提供给IC生成系统1706的电路布局定义可呈计算机可读代码的形式,IC生成系统1706可使用所述计算机可读代码来形成用于生成IC的合适掩码。

由IC制造系统1702执行的不同过程可全部在一个位置例如由一方来实施。替代地,IC制造系统1702可以是分布式系统,使得一些过程可在不同位置执行,并且可由不同方来执行。例如,以下阶段中的一些可以在不同位置和/或由不同方来执行:(i)合成表示IC定义数据集的RTL代码,以形成要生成的电路的门级表示;(ii)基于门级表示来生成电路布局;(iii)根据电路布局来形成掩模;以及(iv)使用掩模来制造集成电路。

在其他示例中,通过在集成电路制造系统处对集成电路定义数据集的处理,可以将系统配置为制造存储器系统(或其逻辑)或图形处理系统,而无需处理IC定义数据集以确定电路布局。举例来说,集成电路定义数据集可以定义例如FPGA的可重新配置的处理器的配置,并且对所述数据集进行的处理可以将IC制造系统配置成(例如,通过将配置数据加载到FPGA)生成具有所述定义的配置的可重新配置的处理器。

在一些实施方案中,当在集成电路制造系统中处理时,集成电路制造定义数据集可以使集成电路制造系统生成如本文中描述的设备。举例来说,通过集成电路制造定义数据集,以上文关于图17描述的方式对集成电路制造系统的配置,可制造出如本文中所描述的装置。

在一些示例中,集成电路定义数据集可以包含在数据集处定义的硬件上运行的软件,或者与在数据集处定义的硬件组合运行的软件。在图17中展示的示例中,IC生成系统可由集成电路定义数据集进一步被配置成在制造集成电路时根据在集成电路定义数据集处定义的程序代码将固件加载到所述集成电路上,或者以其他方式向集成电路提供与集成电路一起使用的程序代码。

与已知的实施方式相比,在本申请中阐述的概念在设备、装置、模块和/或系统中(以及在本文中实施的方法中)的实施方式可以引起性能改进。性能改进可以包含计算性能提高、等待时间缩短、处理量增大和/或功耗降低中的一个或多个。在制造此类设备、装置、模块和系统(例如在集成电路中)期间,可以在性能改进与物理实施方案之间进行权衡,从而改进制造方法。例如,可以在性能改进与布局面积之间进行权衡,从而匹配已知实施方式的性能,但使用更少的硅。例如,这可以通过以串行方式重复使用功能块或在设备、装置、模块和/或系统的元件之间共享功能块来完成。相反,在本申请中阐述的引起设备、装置、模块和系统的物理实施方式的改进(例如硅面积减小)的概念可以针对性能提高进行权衡。例如,这可以通过在预定义面积预算内制造模块的多个示例来完成。

申请人据此独立地公开了本文中所描述的每个单独的特征以及两个或更多个此类特征的任意组合,到达的程度使得此类特征或组合能够根据本领域的技术人员的普通常识基于本说明书整体来实行,而不管此类特征或特征的组合是否解决本文中所公开的任何问题。鉴于前文描述,本领域的技术人员将清楚,可以在本发明的范围内进行各种修改。

相关技术
  • 用于在存储器中存储可变长度数据块的方法和系统
  • 一种高速缓冲存储器的数据块长度自适应读取方法及装置
技术分类

06120113006704