使用水平聚合SIMD指令对d-堆进行向量化的方法技术

技术编号:28767220 阅读:47 留言:0更新日期:2021-06-09 10:52
通过对d

【技术实现步骤摘要】
【国外来华专利技术】使用水平聚合SIMD指令对d

堆进行向量化的方法


[0001]本公开涉及维护数据结构,并且更具体地,涉及对数据结构中的数据进行聚合、存储和移除。

技术介绍

[0002]堆(heap)是包含节点的优先级队列数据结构,这些节点具有两个保存单个值的子节点,通常经由树结构反映。这种数据结构的关键特征是在对数时间(logarithmic time)内添加/移除单个元素,以及在常数时间(constant time)内找到其索引元素中的最小/最大元素的能力。最常见的堆类型是始终返回堆中最小的索引元素的最小堆(min

heap)和始终返回堆中最大的索引元素的最大堆(max

heap)。
[0003]许多堆是如此之大,以至于使用堆的算法(例如,图算法(graph algorithm))的运行时间的很大一部分都花在堆操作上。因此,需要高效的堆实现方式。
[0004]d

堆(d

heap)是二叉堆(binary heap)的泛化(generalization),d

堆具有与由d的值所定义的一样多的子节点,这些子节点包含由d的值定义的多个值。d

堆使用树对其元素进行索引。d

堆是用于快速插入操作的最佳数据结构,因为附加的子节点减少了基础树的深度(depth)并且使得当新值被插入到堆中时需要较少的比较来恢复堆属性。
[0005]但是,d

堆中诸如top(取顶)和pop(弹出)之类的取回(retrieval)操作需要附加的比较以便在单个节点内找到最大或最小键值。这些比较的运行时间不仅很高,而且需要附加的计算资源,从而导致与常规的二叉堆相比,执行比较的花销更高。
[0006]因此,期望维持d

堆属性并减轻与d

堆的维护和取回操作所需的附加比较相关联的成本和时间的技术。
[0007]本文所讨论的是通过对d

堆进行向量化以及跨多个d

堆取回函数而利用水平聚合SIMD指令,从而高效地维持d

堆属性、加速d

堆的取回操作的方法。
[0008]本部分中描述的方法是可以采用的方法,但不一定是先前已经设想或采用的方法。因此,除非另有说明,否则不应仅由于将本部分中所述的任何方法包括在本部分中而认为其有资格作为现有技术。
附图说明
[0009]在附图中:
[0010]图1是描绘根据本专利技术的实施例的d

堆的图。
[0011]图2是描绘根据本专利技术的实施例的线性化(linearized)的向量化d

堆的图。
[0012]图3A至图3B是描绘用于在d

堆上执行pop操作的处理的流程图。
[0013]图4是描绘可以在本专利技术的实施例中使用的计算机系统的图。
[0014]图5是描绘可以在其上实现本专利技术的实施例的软件系统的图。
具体实施方式
[0015]在下面的描述中,出于解释的目的,阐述了许多具体细节以便提供对本专利技术的透彻理解。但是,将清楚的是,可以在没有这些具体细节的情况下实践本专利技术。在其它情况下,以框图形式示出了众所周知的结构和设备,以避免不必要地使本专利技术模糊。
[0016]总体概述
[0017]提供了用于通过对d

堆进行向量化并跨多个取回操作利用水平聚合SIMD指令来维持d

堆属性并加快取回操作(诸如top或pop)的技术。如本文所述,存储器是(在地址空间内)连续的,并且包含槽(slot)的阵列,这些槽形成阵列中最开始的空间和最末端的空间。d

堆包含多个节点,这些节点包括D个槽,其中该D个槽中的每个槽存储D个键值中的键值,其中每个槽是阵列的元素。该多个节点包括根节点和多个父节点,每个父节点包含D个子节点,并且每个子节点是每个父节点中的相应父槽的孩子,并且存储比存储在相应父槽中的键值更大的键值。
[0018]在一个实施例中,堆的该多个节点包括多个级别,该多个级别包括根级别和非根级别。存储器中的槽阵列跨D个槽来存储d

堆的节点,其中根级别被存储在阵列的最开始D槽处的D槽中,并且非根级别连续地跨D个槽被存储,直到阵列的最末端的D槽。作为结果,d

堆被向量化,从而允许将节点内的键值被连续地存储在阵列中。从这里开始,向量化的d

堆采用水平聚合SIMD指令来最小化取回操作所需的比较次数。
[0019]在实施例中,堆以完整的二叉树的形式表示,其中该树的所有级别都完全用节点填充,并且在树的最后一个级别没有被填充的情况下,那么最后一个级别的节点填充树的最开始一侧。在另一个实施例中,堆被表示为基于指针的树(pointer

based tree)或没有任何指针的隐式数据结构,其中根节点被存储在存储器的阵列的第一个位置,该根节点的子节点被存储在存储器的阵列的第二个和第三个位置,并且每个后续级别的节点紧接在形成这些节点的上一级的父节点的后面而被存储在存储器的阵列内。
[0020]在实施例中,隐式二叉堆被配置为被存储在存储器中的阵列中,其中所有键值被存储在该阵列中,并且键值在堆内的位置被用于计算包含该键值的节点的位置以及该节点的父节点和子节点的位置。阵列的第一个位置表示根节点,阵列的第二个位置和第三个位置表示根节点的子节点,依此类推。
[0021]d

堆概述
[0022]如本文所述,d

堆是优先级队列数据结构,其包含可以被视为完整d

元树中的节点的项的阵列。与二叉堆相反,对于超过计算机高速缓存存储器尺寸的堆尺寸,d

堆通常运行更快,因为与二叉堆相比,它们导致更少的高速缓存未命中(cache miss)和虚拟存储器页面错误。
[0023]通过利用包括JAVA、C++、OBJECTIVE

C或任何其它合适的编程环境的容器数据结构的任何编程语言来实现d

堆。
[0024]如本文所述,d

堆是优先级队列数据结构,其在树结构中包含多个节点,其中每个节点包含d个值并且具有多达d个后继/子节点。该多个节点包括包含D个槽的父节点和子节点,其中该D个槽中的每个槽存储D的键值。
[0025]在一个实施例中,d

堆被连续存储在存储器阵列中,该阵列具有槽元素,这些槽元素包含最开始的空间和最末端的空间。d

堆的多个节点包括D个槽,D是大于1的整数,其中D
个槽中的每个槽存储键值,其中D个槽被连续存储在存储器的存储器地址空间内。每个父节点具有D个子节点,并且每个子节点是相应父槽的孩子本文档来自技高网
...

【技术保护点】

【技术特征摘要】
【国外来华专利技术】1.一种方法,包括:对存储在存储器中的堆执行pop操作;其中,所述堆包括多个节点;其中,所述多个节点中的每个节点包括D个槽,D为大于1的整数,其中所述D个槽中的每个槽存储D个键值中的键值,其中所述每个节点的D个槽被连续地存储在所述存储器的存储器地址空间内;其中,所述多个节点包括根节点和多个父节点,所述多个节点中的每个父节点具有D个子节点,所述D个子节点中的每个子节点是所述每个父节点中的相应父槽的孩子并且存储比存储在所述相应父槽中的键值更大的键值;其中,在堆上执行pop操作包括:在所述根节点上执行SIMD操作,以生成第一最小键值以及所述根节点中保持所述第一最小键值的第一槽的第一索引;将堆中的值复制到所述第一槽中。2.如权利要求1所述的方法,其中,将堆中的值复制到所述第一槽中包括将堆中的最末端的值复制到所述第一槽中;其中,所述第一槽是第一子槽的父槽;其中,所述方法还包括:在第一子节点上执行SIMD操作,以生成第二最小键值以及所述第一子节点中包含所述第二最小键值的第二槽的第二索引;确定所述第二最小键值小于存储在所述第一槽中的所述第一最小键值;以及响应于确定所述第二最小键值小于所述第一最小键值,在所述第一槽和所述第二槽之间交换所述第一最小键值和所述第二最小键值。3.如权利要求2所述的方法,还包括:在所述第一子节点的第二子节点上执行SIMD操作,以生成第三最小键值以及所述第二子节点的所述第二子节点中包含所述第三最小键值的第三槽的第三索引;确定所述第三最小键值是否小于存储在所述第二槽中的所述第二最小键值;以及当所述第三最小键值小于存储在所述第二槽中的所述第二最小键值时,在所述第二槽和所述第三槽之间交换所述第二最小键值和所述第三最小键值。4.如权利要求1所述的方法,还包括:通过至少执行以下各项操作来执行返回存储在所述堆中的最小键值的特定操作:在所述根节点上执行SIMD操作以生成特定最小键值;以及返回所述特定最小键值,作为存储在所述堆中的所述最小键值。5.如权利要求1所述的方法,还包括:通过至少以下各项操作来执行返回存储在所述堆中的最大键值的特定操作:在所述根节点上执行SIMD操作以生成特定最小键值;生成所述特定最小键值的补码;以及返回所述补码,作为存储在所述堆中的所述最大值。6.如权利要求1所述的方法,还包括:
通过至少以下各项操作来执行返回存储在所述堆中的最小键值的特定操作:在所述根节点上执行SIMD操作以生成特定最小键值;通过改变所述特定最小键值的符号来生成特定值;以及返回所述特定值,作为存储在所述堆中的所述最小键值。7.如权利要求1所述的方法,还包括:其中,所述堆被存储在第一阵列中,其中,所述第一阵列包括多个堆级别,其中所述多个堆级别中的第一堆级别存储所述根节点,其中所述多个堆级别中的在所述第一堆级别之后的每个特定堆级别利用所述存储器的地址空间来连续地存储所述多个堆级别中在所述每个特定堆级别之前的堆级别的所有子节点。8.如权利要求7所述的方法,其中所述第一阵列的每个元素对应于所述多个节点中的一个相应槽;有效载荷阵列的每个有效载荷元素对应于所述第一阵列的一个元素并且对应于所述多个节点中与所述第一阵列的所述一个元素对应的一个相应槽;并且其中,所述方法还包括:响应于确定所述第二最小键值小于所述第一最小键值,在所述有效载荷阵列元素中分别与所述第一槽和所述第二槽对应的一对元素之间交换值。9.如权利要求6所述的方法,还包括:为所述第一阵列分配附加的存储器以向所述堆添加键值,以及将所述键值存储在所述附加存储器中。10.如权利要求1所述的方法,其中:一组指针中的每个指针指向存储所述多个节点中的相应节点的存储器地址;并且其中,在对所述根节点执行SIMD操作之前,所述一组指针中的相应指针指向所述根节点,以将所述根节点加载到由所述根节点上的所述SIMD操作使用的寄存器中。11.如权利要求1所述的方法,还包括:通过至少以下各项操作来执行返回存储在所述堆中的最大键值的特定操作:在所述根节点上执行SIMD操作以生成第一最大键值以及根节点中保持所述第一最大键值的第一槽的第一索引;以及返回所述第一最大键值,作为存储在所述堆中的所述最大键值。12.如权利要求1所述的方法,还包括一个或多个非暂态存储介质,所述一个或多个非暂态存储介质存储指令序列,所述指令序列在由一个或多个处理器执行时使得:对存储在存储器中的堆执行pop操作;其中,所述堆包括多个节点;其中,所述多个节点中的每个节点包括D个槽,D为大于1的整数,其中所述D个槽中的每个槽存储D个键值中的键值,其中所述每个节点的D个槽被连续地存储在所述存储器的存储器地址空间内;其中,所述多个节点包括根节点和多个父节点,所述多个节点中的每...

【专利技术属性】
技术研发人员:B
申请(专利权)人:甲骨文国际公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1