CN114328592B - 聚合计算方法和装置 - Google Patents

聚合计算方法和装置 Download PDF

Info

Publication number
CN114328592B
CN114328592B CN202210257969.1A CN202210257969A CN114328592B CN 114328592 B CN114328592 B CN 114328592B CN 202210257969 A CN202210257969 A CN 202210257969A CN 114328592 B CN114328592 B CN 114328592B
Authority
CN
China
Prior art keywords
data
vector
packet
aggregation
bitmap
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.)
Active
Application number
CN202210257969.1A
Other languages
English (en)
Other versions
CN114328592A (zh
Inventor
曲斌
潘毅
刘彬
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Oceanbase Technology Co Ltd
Original Assignee
Beijing Oceanbase Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing Oceanbase Technology Co Ltd filed Critical Beijing Oceanbase Technology Co Ltd
Priority to CN202210257969.1A priority Critical patent/CN114328592B/zh
Publication of CN114328592A publication Critical patent/CN114328592A/zh
Application granted granted Critical
Publication of CN114328592B publication Critical patent/CN114328592B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Data Exchanges In Wide-Area Networks (AREA)

Abstract

提供一种聚合计算方法和装置。所述聚合计算方法包括:从数据库中获取第一向量数据;利用所述数据库的分组算子对所述第一向量数据进行分组,得到第一分组数据和第一位图数据,所述第一分组数据的地址非连续分布,所述第一位图数据用于记录所述第一分组数据在所述第一向量数据中的向量位置;将所述第一位图数据和所述第一向量数据装载至SIMD寄存器,使得所述第一向量数据中的所述第一分组数据的取值保持不变,并使得所述第一向量数据中的除所述第一分组数据之外的剩余数据的取值为零;利用SIMD指令对所述SIMD寄存器中的向量数据进行向量化聚合计算。

Description

聚合计算方法和装置
技术领域
本公开涉及数据库领域,并且更为具体地,涉及一种聚合计算方法和装置。
背景技术
聚合(aggregation)操作是数据库分析中的常用操作。随着数据库系统处理的数据越来越多,以及用户对数据库计算速度的要求越来越高,数据库聚合性能的好坏已经成为评价数据库分析能力好坏的重要指标。因此,对聚合操作的性能提升,一直是数据库领域的工作者不断追求的目标。
随着向量化技术的不断发展,越来越多的数据库系统把向量化计算应用到了数据库计算中,从而实现向量化聚合计算。例如,数据库在数据库的哈希聚合(hashaggregation)方法中,把相同分组的数据拷贝分配在一个哈希桶(hash bucket)中。哈希桶内的数据可以按照一定长度连续排列对齐。其它列式数据库或大数据计算引擎,则直接把一个分组内的数据拷贝的一个数据连续排列的数组中,并将该数组传递给聚合计算函数,从而实现向量化计算。
由此可见,相关技术中,对数据进行预处理(如对数据进行拷贝和搬移)是采用向量化聚合计算的前置条件。但是数据预处理往往会带来额外的物化开销。在处理海量数据时,这种物化开销对处理器的消耗非常大。
发明内容
本公开提供一种聚合计算方法和装置,以避免数据预处理带来的额外开销。
第一方面,提供一种聚合计算方法,包括:从数据库中获取第一向量数据;利用所述数据库的分组算子对所述第一向量数据进行分组,得到第一分组数据和第一位图数据,所述第一分组数据的地址非连续分布,所述第一位图数据用于记录所述第一分组数据在所述第一向量数据中的向量位置;根据所述第一位图数据将所述第一向量数据装载至SIMD寄存器,使得所述第一向量数据中的所述第一分组数据的取值保持不变,并使得所述第一向量数据中的除所述第一分组数据之外的剩余数据的取值为零;利用SIMD指令对所述SIMD寄存器中的向量数据进行向量化聚合计算。
可选地,作为一种可能的实现方式,所述第一分组数据在所述第一向量数据中的向量位置包括向量起始位置和向量结束位置,在所述根据所述第一位图数据将所述第一向量数据装载至SIMD寄存器之前,所述方法还包括:如果所述向量起始位置和所述向量结束位置之间的数据个数不等于所述向量化聚合计算的步长的整数倍,则调整所述向量起始位置和/或所述向量结束位置,使得调整后的所述向量起始位置和所述向量结束位置之间的数据个数等于所述向量化聚合计算的步长的整数倍。
可选地,作为一种可能的实现方式,所述根据所述第一位图数据将所述第一向量数据装载至SIMD寄存器,包括:如果所述第一分组数据中的数据个数大于第一阈值,则将所述第一位图数据和所述第一向量数据装载至所述SIMD寄存器;所述方法还包括:如果所述第一分组数据的数据个数小于或等于所述第一阈值,则对所述第一分组数据进行标量聚合计算。
可选地,作为一种可能的实现方式,所述第一阈值小于或等于所述SIMD指令一次能够操作的数据的个数。
可选地,作为一种可能的实现方式,所述第一向量数据存储在一段连续的地址空间中。
可选地,作为一种可能的实现方式,所述第一位图数据和所述第一向量数据的数据大小相同。
第二方面,提供一种聚合计算装置,包括:获取模块,用于从数据库中获取第一向量数据;分组模块,用于利用所述数据库的分组算子对所述第一向量数据进行分组,得到第一分组数据和第一位图数据,所述第一分组数据的地址非连续分布,所述第一位图数据用于记录所述第一分组数据在所述第一向量数据中的向量位置;装载模块,用于根据所述第一位图数据将所述第一向量数据装载至SIMD寄存器,使得所述第一向量数据中的所述第一分组数据的取值保持不变,并使得所述第一向量数据中的除所述第一分组数据之外的剩余数据的取值为零;第一聚合计算模块,用于利用SIMD指令对所述SIMD寄存器中的向量数据进行向量化聚合计算。
可选地,作为一种可能的实现方式,所述第一分组数据在所述第一向量数据中的向量位置包括向量起始位置和向量结束位置,所述聚合计算装置还包括:调整模块,用于在所述将所述第一位图数据和所述第一向量数据装载至SIMD寄存器之前,如果所述向量起始位置和所述向量结束位置之间的数据个数不等于所述向量化聚合计算的步长的整数倍,则调整所述向量起始位置和/或所述向量结束位置,使得调整后的所述向量起始位置和所述向量结束位置之间的数据个数等于所述向量化聚合计算的步长的整数倍。
可选地,作为一种可能的实现方式,所述装载模块用于如果所述第一分组数据中的数据个数大于第一阈值,则将所述第一位图数据和所述第一向量数据装载至所述SIMD寄存器;所述聚合计算装置还包括:第二聚合计算模块,用于如果所述第一分组数据的数据个数小于或等于所述第一阈值,则对所述第一分组数据进行标量聚合计算。
可选地,作为一种可能的实现方式,所述第一阈值小于或等于所述SIMD指令一次能够操作的数据的个数。
可选地,作为一种可能的实现方式,所述第一向量数据存储在一段连续的地址空间中。
可选地,作为一种可能的实现方式,所述第一位图数据和所述第一向量数据的数据大小相同。
第三方面,提供一种聚合计算装置,包括:存储器,用于存储指令;处理器,用于执行所述存储器中存储的指令,以执行如第一方面或第一方面中的任意一种可能实现方式所述的方法。
第四方面,提供一种计算机可读存储介质,其上存储有用于执行第一方面或第一方面中的任意一种可能的实现方式所述的方法的指令。
第五方面,提供一种计算机程序产品,包括用于执行第一方面或第一方面中的任意一种可能的实现方式所述的方法的指令。
本公开实施例是通过维护了一个独立的位图数据,使得即使分组内的数据稀疏排列,也能基于SIMD指令实现向量化聚合计算的目的。区别于相关技术中提到的方案,本申请实施例不需要分配额外的内存,也不需要将数据搬移至一段连续的地址空间,因此这种向量化聚合计算实现起来更轻量,能够显著提升数据库中的数据的聚合效率。
附图说明
为了更清楚地说明本公开实施例或背景技术中的技术方案,下面将对本公开实施例或背景技术中所需要使用的附图进行说明。
图1是哈希桶的数据结构示例图。
图2是本公开实施例提供的聚合计算方法的流程示意图。
图3是本公开实施例提供的稀疏分布的分组数据的示例图。
图4是本公开实施例提供的位图数据的示例图。
图5是图2的方法的一种具体的实现方式的流程示意图。
图6是本公开实施例提供的聚合向量的示例图。
图7是本公开实施例提供的向量位置调整方案的示例图。
图8是本公开实施例提供的向量装载方案的示例图。
图9是本公开一个实施例提供的聚合计算装置的结构示意图。
图10是本公开另一实施例提供的聚合计算装置的结构示意图。
具体实施方式
下面结合本公开实施例中的附图对本公开实施例进行描述。以下描述中,参考形成本公开一部分并以说明之方式示出本公开实施例的具体方面或可使用本公开实施例的具体方面的附图。应理解,本公开实施例可在其它方面中使用,并可包括附图中未描绘的结构或逻辑变化。因此,以下详细描述不应以限制性的意义来理解,且本公开的范围由所附权利要求书界定。例如,应理解,结合所描述方法的揭示内容可以同样适用于用于执行所述方法的对应设备或系统,且反之亦然。例如,如果描述一个或多个具体方法步骤,则对应的设备可以包含如功能单元等一个或多个单元,来执行所描述的一个或多个方法步骤(例如,一个单元执行一个或多个步骤,或多个单元,其中每个都执行多个步骤中的一个或多个),即使附图中未明确描述或说明这种一个或多个单元。另一方面,例如,如果基于如功能单元等一个或多个单元描述具体装置,则对应的方法可以包含一个步骤来执行一个或多个单元的功能性(例如,一个步骤执行一个或多个单元的功能性,或多个步骤,其中每个执行多个单元中一个或多个单元的功能性),即使附图中未明确描述或说明这种一个或多个步骤。进一步,应理解的是,除非另外明确提出,本文中所描述的各示例性实施例和/或方面的特征可以相互组合。
聚合操作是数据库分析中的常用操作。聚合操作也可称为聚合计算。聚合操作是一类操作的总称。聚合操作例如可以包括以下操作中的一种或多种:计数(count),求和(sum),求平均(avg)、求最小值(min)、求最大值(max)等。聚合操作中使用到的算子可以称为聚合算子或聚合函数,如count算子、sum算子、avg算子、min算子、max算子等。
随着数据库系统处理的数据越来越多,以及用户对数据库计算速度的要求越来越高,数据库聚合性能的好坏已经成为评价数据库分析能力好坏的重要指标。因此,对聚合操作的性能提升,一直是数据库领域的工作者不断追求的目标。
随着向量化计算(vectorization execution)技术的不断发展,越来越多的数据库系统把向量化计算应用到了数据库计算中。例如数据库把向量化计算技术使用到了数据库中的基于Hash分组的聚合方法中。列式数据库和大数据计算引擎也通过向量化技术一次传递一个数组(一批数据)到聚合函数中,从而提升了计算效率。
为了加快计算速度,单指令多数据(single instruction multiple data,SIMD)指令也被应用到数据库的计算中。SIMD是随着计算机硬件的发展而出现的一种高效的计算机执行指令。SIMD指令针对连续地址的一批数据(batch)进行批量操作,一次计算指令(如加减乘除等)可以操作多个数据。以SIMD指令为AVX512提供的SIMD指令为例,该SIMD指令一次可以处理512比特的数据。目前,主流CPU(skylake)之后版本都已经支持一次处理512比特数据的SIMD指令。
基于SIMD指令可以方便地实现向量化聚合计算,从而可以降低数据在数据库中不同算子间的迭代和流转次数,同时降低函数的调用次数,提升数据库的计算速度。
使用SIMD指令的一个前提条件是数据的地址是连续排列的(即数据位于一段连续的地址空间中)。为满足这一要求,在执行向量化聚合计算前,往往需要通过数据预处理方法,把需要聚合的数据紧密分布在一段连续的地址上,然后调用SIMD指令完成该向量化聚合计算。
例如,在数据库的哈希聚合(hash aggregation)方案中,把相同分组的数据拷贝分配在一个哈希桶(hash bucket)中。哈希桶内的数据可以按照一定长度(如128字节)连续排列对齐。其它列式数据库或大数据计算引擎,则直接把一个分组内的数据拷贝的一个数据连续排列的数组中,并将该数组传递给聚合计算函数,从而实现向量化聚合计算。
为了便于理解,下面简单介绍向量化聚合计算方案。
在基于哈希分组的聚合实现中使用了一种向量化的聚合方案。该方案是一种与哈希分组紧密耦合的向量化聚合实现。
首先,在创建哈希表(HashTable)时,数据库根据SIMD 寄存器的大小分配哈希表中每个哈希桶的大小。数据库将每个哈希桶的大小设置成SIMD寄存器长度的2倍。例如__mm128i寄存器的大小是128字节,则哈希桶的大小为256字节。哈希桶的前128字节可以存放哈希键(HashKey),后128字节可以存放哈希值(HashValue),具体参见图1。
在对数据进行分组时,具有相同哈希值的数据被分到一个哈希桶中。每个哈希桶内,哈希键之间连续排列,哈希值之间也连续排列。在执行分组比较时,可以通过SIMD指令实现1次比较4个哈希键。在执行聚合计算时,可以通过SIMD指令实现一次聚合4个哈希值。
但是,为构造地址连续的数据(即构造上文提到的哈希桶)需要进行额外的数据预处理。如果数据的存储地址不连续,则无法进行上述计算。也就是说,必须把数据归集到一个地址连续的哈希桶中才能执行向量化聚合计算。
由此可见,相关技术中,数据预处理操作是SIMD运算的前置条件。但是数据预处理往往会带来额外的物化开销。在处理海量数据时,这种物化开销对CPU等处理器的消耗非常大。
为了避免数据预处理带来的额外开销,本公开实施例提出了一种新的向量化聚合计算方案。区别于相关技术中提到的方案,本公开实施例不需要额外分配连续内存,也不需要拷贝分组数据到连续数组。本公开实施例是通过维护了一个独立的位图数据,使得即使分组内的数据稀疏排列,也能基于SIMD指令实现向量化聚合计算的目的。由于不需要分配额外的内存,也不需要将数据搬移至一段连续的地址空间,这种向量化聚合计算实现起来更轻量,能够显著提升数据库中的数据的聚合效率。
下面结合图2,对本公开实施例提供的聚合计算方法进行详细说明。图2的方法200可应用于数据库中,例如可用于对数据库中的数据进行聚合计算。本公开实施例对数据库的类型不作具体限定。该数据库可以是普通的数据库,也可以是分布式数据库。作为一个示例,该数据库可以是OceanBase数据库。
参见图2,在步骤S210,从数据库获取第一向量数据。该第一向量数据可以理解为待执行聚合计算的一批数据。由于执行聚合计算之前,通常需要先利用数据库的分组算子(groupby)进行分组,因此,第一向量数据也可理解为未分组的一批数据或待分组的一批数据。该第一向量数据可以存储在一段连续的地址空间(内存地址空间)中。第一向量数据例如可以是从下层的数据库算子传递上来的一批数据。该下层的数据库算子例如可以是表扫描(TableScan)算子,当然也可以是其他类型的算子。
在步骤S220,利用数据库的分组算子对第一向量数据进行分组。例如,可以先按照数据的取值(value)对第一向量数据进行分组,从而将第一向量数据中取值相同的数据归属至同一分组。
由于下层的数据库算子传递的数据往往不保序。因此,在大多数情况下,同一分组的数据会稀疏排列在第一向量数据中。这样会导致同一分组的数据在内存中的地址也是不连续的,因此无法直接使用SIMD指令进行向量化聚合计算。
下面以图3为例进行说明。参见图3,第一向量数据可以是表扫描算子返回的一批地址连续的数据。该第一向量数据包括4个向量位置,从上至下依次为:第1向量位置,第2向量位置,第3向量位置以及第4向量位置。以聚合计算为求和计算为例,在对第一向量数据进行求和之前,需要按照第一向量数据中的各个数据的取值先对第一向量数据内的数据进行分组处理,然后才能执行求和计算。第一向量数据包括分组1的数据(即图3中的取值为“1.0”的数据)和分组2的数据(即图3中的取值为“2.0”的数据)。对分组1中的数据执行求和计算,得到的聚合结果为“2.0”;对分组2中的数据执行求和计算,得到的聚合结果为“4.0”。
从图3可以看出,分组1中的数据位于第1向量位置和第3向量位置;分组2中的数据位于第2向量位置和第4向量位置。无论是分组1中的数据,还是分组2中的数据,其在第一向量数据中的向量位置均是不连续的。而第一向量数据通常是一段地址连续的数据。因此,分组1中的数据和分组2中的数据的地址是非连续的。因此,无论是分组1中的数据,还是分组2中的数据,均无法直接使用SIMD指令进行向量化聚合计算。重新回到图2,通过执行步骤S220,可以得到一个或多个分组数据。为了便于描述,后文以第一分组数据为例进行举例说明,如果第一向量数据中存在多个分组数据,则该第一分组数据可以是该多个分组数据中的任意一个分组数据。该多个分组数据中的其他分组数据也可以按照第一分组数据的处理方式进行相同或类似的处理。
此外,在执行步骤S220的过程中,即在利用数据库的分组算子对第一向量数据进行分组的过程中,可以维护第一分组数据对应的位图(bitmap)数据。本申请实施例将第一分组数据对应的位图数据称为第一位图数据。该第一位图数据可用于记录第一分组的数据在第一向量数据中的向量位置。或者说,该第一位图数据可用于指示第一向量数据中的每个向量位置的数据是否属于该第一分组。
第一位图数据和第一向量数据的数据大小可以相同。例如,第一向量数据包括256个数据,则第一位图数据也可以是256个元素。第一位图数据中的256个元素可以与第一向量数据中的256个数据一一对应。如果第一向量数据中的某个数据属于第一分组,则第一位图数据中的与该数据对应的元素的取值可以设置为0;如果第一向量数据中的某个数据不属于第一分组,则第一位图数据中的与该数据对应的元素的取值可以设置为1。第一位图数据中的某个元素的取值设置为“1”,可以理解为需要“跳过”该元素对应的数据。因此,在一些实施例中,可以将该第一位图数据对应的bitmap称为skipmap。当然,在另一些实施例中,元素0和元素1的含义也可以互换。例如,如果第一向量数据中的某个数据属于第一分组,则第一位图数据中的与该数据对应的元素的取值可以设置为1;如果第一向量数据中的某个数据不属于第一分组,则第一位图数据中的与该数据对应的元素的取值可以设置为0。上文两种位图规则均可应用于本申请实施例,后文主要以第一种位图规则为例进行说明。
以图4为例,分组1中的数据位于第1向量位置和第3向量位置;分组2中的数据位于第2向量位置和第4向量位置。因此,在执行分组算子的过程中,可以独立的维护分组1对应的位图数据和分组2对应的位图数据。如图4所示,分组1对应的位图数据从上到下依次为“0、1、0、1”,从而指示第一向量数据中的第1向量位置和第3向量位置中的数据属于分组1,第2向量位置和第4向量位置中的数据不属于分组1。类似地,分组2对应的位图数据从上到下依次为“1、0、1、0”,从而指示第一向量数据中的第2向量位置和第4向量位置中的数据属于分组2,第1向量位置和第3向量位置中的数据不属于分组2。
从图4所示的分组方式可以看出,无论是分组1还是分组2,分组中的数据并没有被移动(即并没有被移动至一段连续的地址空间中),而是通过维护不同分组对应的位图数据,区分了第一向量数据内的数据的分组情况,实现了数据的逻辑分组。该分组方式可以避免对分组数据的物化拷贝。此外,位图数据本身内存占用很小,操作和维护成本很低。
前文提到,SIMD使用的一个前提是数据稠密分布在一段连续地址中。在一些数据库中,下层算子(如前文提到的表扫描算子)返回的同一批数据的存储地址本身是连续分配的,但是完成分组后,参与聚合计算的同一分组数据的地址变成稀疏的(即地址不连续)。这为使用SIMD加速执行聚合计算带来了新的挑战。面对该挑战,一种可能的解决方式是遍历第一向量数据中的各个数据,并通过检查第一位图数据,跳过第一向量数据中的不属于第一分组的数据,从而依次完成第一分组数据的聚合计算。但是,上述方案在聚合计算时没有使用向量化的聚合方式,一次只计算了一个数据,无法最大化SIMD向量化计算的性能收益。
因此,为提升聚合计算的性能,本公开实施例提出一种可适用于稀疏数据的向量化聚合算法。该聚合算法使得即使第一分组数据地址不连续,也可以使用SIMD 向量化指令,一次性聚合一个SIMD 向量(SIMD向量的大小与SIMD寄存器的数量有关,以AVX512为例,SIMD向量的大小为512比特)上的多个数据(参与计算的数据个数可以根据SIMD 向量的大小和数据类型变化)。
下面结合图2中的步骤S230和步骤S240,对该算法进行详细描述。
在步骤S230,根据第一位图数据将第一向量数据装载至SIMD寄存器,使得第一向量数据中的第一分组数据的取值保持不变,并使得第一向量数据中的除第一分组数据之外的剩余数据的取值为零。
步骤S230中的装载操作可以通过SIMD的向量装载指令(SIMDLoad)实现。通过上述装载方式,可以得到一个新的向量(或向量数据)。该新的向量满足如下条件:当第一位图数据的某个元素的取值为1时,该新的向量中的与该元素对应的向量位置的取值(value)是0;当第一位图数据的某个元素的取值为0时,该新的向量中的与该元素对应的向量位置的取值(value)为第一分组中的数据。
第一分组数据在第一向量数据中的向量位置可以包括向量起始位置和向量结束位置。在将第一向量数据装载至SIMD寄存器之前,可能需要根据向量化聚合计算的步长对该向量起始位置和/或该向量结束位置进行调整。例如,如果该向量起始位置和该向量结束位置之间的数据个数不等于向量化聚合计算的步长的整数倍,则调整向量起始位置和/或向量结束位置,使得调整后的向量起始位置和向量结束位置之间的数据个数等于向量化聚合计算的步长的整数倍。
向量化聚合计算的步长取决于SIMD指令一次能够操作的数据的个数以及被操作的数据的数据类型。以AVX512 指令集为例,一个SIMD 指令可以同时操作512比特的数据,如果参与运算的数据类型是double或int64_t类型,一个数据占64个比特,则向量化聚合计算的步长为512/64 = 8,即SIMD指令一次能够处理8个double或int64_t类型的数据。如果参与运算的数据类型是float或者int32_t 类型,则向量化聚合计算的步长为512/64 =16,即SIMD指令一次能够处理16个float或者int32_t类型的数据。
在步骤S240,利用SIMD指令对SIMD寄存器中的向量数据进行向量化聚合计算。应理解,该SIMD寄存器中的向量数据即按照步骤S230的装载规则得到的新的向量的数据。
为了便于理解,下文结合图5-图8,以SIMD指令为AVX512中的SIMD指令、聚合计算为求和计算为例,给出步骤S230和S240的实现方式的一个具体示例。应注意,图5-图8的例子仅仅是为了帮助本领域技术人员理解本公开实施例,而非要将本公开实施例限于所例示的具体取值或具体场景。本领域技术人员根据所给出的图5-图8的例子,显然可以进行各种等价的修改或变化,这样的修改或变化也落入本公开实施例的范围内。
图5的方法500包括步骤S510~步骤S550。图5方法中提到的未分组数据对应于前文提到的第一向量数据。
步骤S510:初始化聚合向量。如图6所示,该聚合向量可以为一个长度为512比特的向量。该聚合向量可以包括8个数据,也可以包括16个数据。在初始化过程中,可以将该聚合向量中的数据的取值均设置为0。该聚合向量可用于在聚合计算过程中,对各个步骤得到的聚合结果进行汇总。
步骤S520:确定向量化计算的步长。向量化计算的步长等于一次SIMD指令操作数据的个数。以AVX512 指令集为例,一个SIMD 指令可以同时运算512比特数据,如果参与运算的数据类型是double或int64_t类型,一个数据占64个比特,则向量化计算的步长为512/64 = 8,即SIMD指令一次能够处理8个double或int64_t类型的数据。如果参与运算的数据类型是float或者int32_t类型,则向量化计算的步长为512/64 = 16,即SIMD指令一次能够处理16个float或者int32_t类型的数据。
步骤S530:对分组数据在未分组数据中的向量位置(包括向量起始位置和向量结束位置)进行计算前调整。也就是说,在进行后续的聚合计算之前,对分组数据在未分组数据中的向量起始位置和向量结束位置进行重新标记。
由于分组数据往往是离散分布的,分组数据在未分组数据中的向量起始位置(或称开始下标)和向量结束位置(或称结束下标)之间包含的数据个数大多无法被向量化计算的步长整除。因此需要调整分组数据在未分组数据中的向量起始位置和向量结束位置,使该向量起始位置和向量结束位置之间包含的数据个数能够被向量化计算的步长整除,从而实现SIMD计算迭代次数和向量化计算的步长匹配(即合拍)。
图7给出了分组数据在未分组数据中的向量起始位置和向量结束位置的调整过程的一个示例。以向量化计算的步长等于8为例,分组1(该示例中,分组1指的是取值为“1”的数据所形成的一组数据)的数据的开始下标是3,结束下标是7。SIMD计算迭代次数和步长不匹配(不合拍)。为满足合拍要求,可以把分组1的开始下标标记为0,结束下标标记为7。SIMD一次处理8个数据,2次SIMD迭代即完成求和计算。移动下标后,位图数据中的下标小于3的元素0,1,2的取值可以被标记为0(即无效数据)。这样一来,求和计算的结果和下标移动前保持一致,最终结果的正确性不受影响。
步骤S540:分组向量的装载。首先按照向量化计算的步长,准备向量。例如当输入数据类型为double时,准备一个__m512d向量,并通过AVX512 提供的指令把一个分组数据装载到__m512d向量中,形成装载后的分组向量。由于分组数据本身是稀疏的,其地址无法保证连续,故无法直接通过SIMD指令得到该分组向量。因此可以通过装载未分组数据和分组数据的位图数据,间接得到一个分组向量。装载规则如下:当位图数据中的元素的取值为1时,则装载后的分组向量在该元素对应的向量位置的取值是0,当位图数据中的元素的取值为0时,则装载后的分组向量在该元素对应的向量位置的取值与分组数据在该向量位置的取值相同。
图8示出了分组1(该示例中,分组1指的是取值为“1”的数据所形成的一组数据)的数据的装载过程。如图8所示,利用AVX512的SIMD装载指令,将分组1的数据和位图数据装载至SIMD寄存器,形成分组向量。在该分组向量中,未分组数据中的取值为2的元素均被替换成了0,未分组数据中的取值为1的元素保持不变。
步骤S550:向量化聚合计算。生成分组向量后,把步骤S510中初始化的聚合向量和上一步生成的分组向量按照SIMD指令数据相加,并把结果累加存入聚合向量进行汇总。迭代下一个步长,直到完成整个分组的迭代。在最后一次迭代完成后,可以得到一个包含8个元素的向量。通过遍历这个向量,把该向量中的元素的取值均累加到一个标量中,也就完成了整个向量化聚合计算的过程。
在AVX512指令下,一次计算可以同时处理8个数据,因此执行效率大大提升。同时相比标量聚合计算,向量化聚合计算一次迭代的步长是8到16,而标量聚合计算一次迭代的步长是1。在未分组的一批数据包含256个数据的场景下,为了执行聚合计算所需的循环迭代的次数降低为原来的1/8 或1/16。如果未分组的一批数据所包含的分组的数量较少,即唯一取值(number distinct value,NDV)较小的场景下,向量化聚合计算的性能可以达到标量聚合计算的8倍以上性能。
本公开实施例设计了自适应步长计算方法和独特的向量化装载方法。通过维护分组的位图数据标记未分组数据是否属于当前分组,并利用SIMD 指令对位图数据的支持和独特的数据装载规则,屏蔽了分组数据不连续对利用SIMD指令进行聚合计算的影响,从而实现了稀疏的非连续排列分组数据的向量化聚合计算,大大提升了数据库的聚合计算速度。
前文提到,在传统的数据库中向量化方案与哈希分组紧密耦合。不同于传统的数据库支持的方案,本公开实施例提供的方案与分组算法的类型解耦,适用于hash分组、merge 分组等多种分组方案下的聚合计算。同时,本公开实施例由于对参与聚合计算的分组数据是否连续没有要求,不需要单独把相同分组的数据拷贝到连续的地址空间,节省了数据的物化开销,同时减少了内存占用。
虽然面向稀疏数据的向量化聚合计算可以和稠密数据一样使用SIMD指令实现聚合加速。但是在某些极端场景,使用本公开实施例进行向量化聚合计算可能不能实现计算加速。例如,在极端场景下:一批未分组数据包括256个数据,如果该256个数据有256个分组,即一个分组中只有1个有效数据,这种场景下在一个分组内使用SIMD 向量化聚合计算相对于使用标量聚合计算没有任何收益。
因此,在一些实施例中,如果一个分组中的数据的个数大于第一阈值,则可以利用SIMD指令执行前文描述的装载操作;如果一个分组中的数据的个数小于或等于第一阈值,则可以对第一分组中的数据进行标量聚合计算(即以单个数据为单位进行聚合计算,而非以向量数据(一批数据)为单位进行聚合计算)。该第一阈值例如可以小于或等于SIMD指令一次能够操作的数据的个数。
上文结合图1至图8,详细描述了本公开的方法实施例,下面结合图9至图10,详细描述本公开的装置实施例。应理解,方法实施例的描述与装置实施例的描述相互对应,因此,未详细描述的部分可以参见前面方法实施例。
图8是本公开一个实施例提供的一种聚合计算装置的结构示意图。图8的聚合计算装置800可以包括获取模块810、分组模块820、装载模块830以及第一聚合计算模块840。
获取模块810可用于从数据库中获取第一向量数据。
分组模块820可用于利用所述数据库的分组算子对所述第一向量数据进行分组,得到第一分组数据和第一位图数据,所述第一分组数据的地址非连续分布,所述第一位图数据用于记录所述第一分组数据在所述第一向量数据中的向量位置;
装载模块830可用于根据所述第一位图数据将所述第一向量数据装载至SIMD寄存器,使得所述第一向量数据中的所述第一分组数据的取值保持不变,并使得所述第一向量数据中的除所述第一分组数据之外的剩余数据的取值为零;
第一聚合计算模块840可用于利用SIMD指令对所述SIMD寄存器中的向量数据进行向量化聚合计算。
可选地,所述第一分组数据在所述第一向量数据中的向量位置包括向量起始位置和向量结束位置,所述聚合计算装置还包括:调整模块,用于在所述将所述第一位图数据和所述第一向量数据装载至SIMD寄存器之前,如果所述向量起始位置和所述向量结束位置之间的数据个数不等于所述向量化聚合计算的步长的整数倍,则调整所述向量起始位置和/或所述向量结束位置,使得调整后的所述向量起始位置和所述向量结束位置之间的数据个数等于所述向量化聚合计算的步长的整数倍。
可选地,所述装载模块用于如果所述第一分组数据中的数据个数大于第一阈值,则将所述第一位图数据和所述第一向量数据装载至所述SIMD寄存器;所述聚合计算装置还包括:第二聚合计算模块,用于如果所述第一分组数据的数据个数小于或等于所述第一阈值,则对所述第一分组数据进行标量聚合计算。
可选地,所述第一阈值小于或等于所述SIMD指令一次能够操作的数据的个数。
可选地,所述第一向量数据存储在一段连续的地址空间中。
可选地,所述第一位图数据和所述第一向量数据的数据大小相同。
图10是本公开另一实施例提供的管理数据库的装置的结构示意图。图10所述的聚合计算装置1000可以包括存储器1010和处理器1020,存储器1010可以用于存储指令。处理器1020可以用于执行存储器1010中存储的指令,以实现前文描述的各个方法中的步骤。在一些实施例中,该装置1000还可以包括网络接口1030,处理器1020与外部设备的数据交换可以通过该网络接口1030实现。
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其他任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本公开实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(digital subscriber line,DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质(例如,软盘、硬盘、磁带)、光介质(例如数字视频光盘(digital video disc,DVD))、或者半导体介质(例如固态硬盘(solid state disk,SSD))等。
本领域普通技术人员可以意识到,结合本公开实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本公开的范围。
在本公开所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
以上所述,仅为本公开的具体实施方式,但本公开的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应以所述权利要求的保护范围为准。

Claims (13)

1.一种聚合计算方法,包括:
从数据库中获取第一向量数据;
利用所述数据库的分组算子对所述第一向量数据进行分组,得到第一分组数据和第一位图数据,所述第一分组数据的地址非连续分布,所述第一位图数据用于记录所述第一分组数据在所述第一向量数据中的向量位置;
根据所述第一位图数据将所述第一向量数据装载至SIMD寄存器,使得所述第一向量数据中的所述第一分组数据的取值保持不变,并使得所述第一向量数据中的除所述第一分组数据之外的剩余数据的取值为零;
利用SIMD指令对所述SIMD寄存器中的向量数据进行向量化聚合计算。
2.根据权利要求1所述的方法,所述第一分组数据在所述第一向量数据中的向量位置包括向量起始位置和向量结束位置,
在所述根据所述第一位图数据将所述第一向量数据装载至SIMD寄存器之前,所述方法还包括:
如果所述向量起始位置和所述向量结束位置之间的数据个数不等于所述向量化聚合计算的步长的整数倍,则调整所述向量起始位置和/或所述向量结束位置,使得调整后的所述向量起始位置和所述向量结束位置之间的数据个数等于所述向量化聚合计算的步长的整数倍。
3.根据权利要求1所述的方法,所述根据所述第一位图数据将所述第一向量数据装载至SIMD寄存器,包括:
如果所述第一分组数据中的数据个数大于第一阈值,则根据所述第一位图数据将所述第一向量数据装载至所述SIMD寄存器;
所述方法还包括:
如果所述第一分组数据的数据个数小于或等于所述第一阈值,则对所述第一分组数据进行标量聚合计算。
4.根据权利要求3所述的方法,所述第一阈值小于或等于所述SIMD指令一次能够操作的数据的个数。
5.根据权利要求1所述的方法,所述第一向量数据存储在一段连续的地址空间中。
6.根据权利要求1所述的方法,所述第一位图数据和所述第一向量数据的数据大小相同。
7.一种聚合计算装置,包括:
获取模块,用于从数据库中获取第一向量数据;
分组模块,用于利用所述数据库的分组算子对所述第一向量数据进行分组,得到第一分组数据和第一位图数据,所述第一分组数据的地址非连续分布,所述第一位图数据用于记录所述第一分组数据在所述第一向量数据中的向量位置;
装载模块,用于根据所述第一位图数据将所述第一向量数据装载至SIMD寄存器,使得所述第一向量数据中的所述第一分组数据的取值保持不变,并使得所述第一向量数据中的除所述第一分组数据之外的剩余数据的取值为零;
第一聚合计算模块,用于利用SIMD指令对所述SIMD寄存器中的向量数据进行向量化聚合计算。
8.根据权利要求7所述的聚合计算装置,所述第一分组数据在所述第一向量数据中的向量位置包括向量起始位置和向量结束位置,
所述聚合计算装置还包括:
调整模块,用于在所述将所述第一位图数据和所述第一向量数据装载至SIMD寄存器之前,如果所述向量起始位置和所述向量结束位置之间的数据个数不等于所述向量化聚合计算的步长的整数倍,则调整所述向量起始位置和/或所述向量结束位置,使得调整后的所述向量起始位置和所述向量结束位置之间的数据个数等于所述向量化聚合计算的步长的整数倍。
9.根据权利要求7所述的聚合计算装置,所述装载模块用于如果所述第一分组数据中的数据个数大于第一阈值,则将所述第一位图数据和所述第一向量数据装载至所述SIMD寄存器;
所述聚合计算装置还包括:
第二聚合计算模块,用于如果所述第一分组数据的数据个数小于或等于所述第一阈值,则对所述第一分组数据进行标量聚合计算。
10.根据权利要求9所述的聚合计算装置,所述第一阈值小于或等于所述SIMD指令一次能够操作的数据的个数。
11.根据权利要求7所述的聚合计算装置,所述第一向量数据存储在一段连续的地址空间中。
12.根据权利要求7所述的聚合计算装置,所述第一位图数据和所述第一向量数据的数据大小相同。
13.一种聚合计算装置,包括:
存储器,用于存储指令;
处理器,用于执行所述存储器中存储的指令,以执行如权利要求1-6中任一项所述的方法。
CN202210257969.1A 2022-03-16 2022-03-16 聚合计算方法和装置 Active CN114328592B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210257969.1A CN114328592B (zh) 2022-03-16 2022-03-16 聚合计算方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210257969.1A CN114328592B (zh) 2022-03-16 2022-03-16 聚合计算方法和装置

Publications (2)

Publication Number Publication Date
CN114328592A CN114328592A (zh) 2022-04-12
CN114328592B true CN114328592B (zh) 2022-05-06

Family

ID=81033778

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210257969.1A Active CN114328592B (zh) 2022-03-16 2022-03-16 聚合计算方法和装置

Country Status (1)

Country Link
CN (1) CN114328592B (zh)

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7793084B1 (en) * 2002-07-22 2010-09-07 Mimar Tibet Efficient handling of vector high-level language conditional constructs in a SIMD processor
CN105893319A (zh) * 2014-12-12 2016-08-24 上海芯豪微电子有限公司 一种多车道/多核系统和方法

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8972697B2 (en) * 2012-06-02 2015-03-03 Intel Corporation Gather using index array and finite state machine
US20170177363A1 (en) * 2015-12-22 2017-06-22 Intel Corporation Instructions and Logic for Load-Indices-and-Gather Operations
KR20220090588A (ko) * 2016-12-31 2022-06-29 인텔 코포레이션 이종 컴퓨팅을 위한 시스템들, 방법들, 및 장치들
JP7124608B2 (ja) * 2018-09-28 2022-08-24 日本電気株式会社 計算機および計算方法
US11016778B2 (en) * 2019-03-12 2021-05-25 Oracle International Corporation Method for vectorizing Heapsort using horizontal aggregation SIMD instructions
US11429604B2 (en) * 2019-09-10 2022-08-30 Oracle International Corporation Techniques of heterogeneous hardware execution for SQL analytic queries for high volume data processing
US11573793B2 (en) * 2020-03-18 2023-02-07 Oracle International Corporation Lazy push strategies for vectorized D-Heaps

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7793084B1 (en) * 2002-07-22 2010-09-07 Mimar Tibet Efficient handling of vector high-level language conditional constructs in a SIMD processor
CN105893319A (zh) * 2014-12-12 2016-08-24 上海芯豪微电子有限公司 一种多车道/多核系统和方法

Also Published As

Publication number Publication date
CN114328592A (zh) 2022-04-12

Similar Documents

Publication Publication Date Title
Lin et al. Pagraph: Scaling gnn training on large graphs via computation-aware caching
Zhou et al. Cold filter: A meta-framework for faster and more accurate stream processing
Marcus et al. Bao: Making learned query optimization practical
US20200065303A1 (en) Addressing memory limits for partition tracking among worker nodes
Wang et al. Oblivious data structures
US10169715B2 (en) Feature processing tradeoff management
Zhang et al. Unboundedness and efficiency of truss maintenance in evolving graphs
Simmen et al. Large-scale graph analytics in aster 6: bringing context to big data discovery
CN106202548A (zh) 数据存储方法、查找方法及装置
Bai et al. Efficient data loader for fast sampling-based gnn training on large graphs
Park et al. EvoGraph: An effective and efficient graph upscaling method for preserving graph properties
Wang et al. Parallelizing approximate single-source personalized pagerank queries on shared memory
US11645281B1 (en) Caching query plans in database systems
CN114416310A (zh) 一种多处理器负载均衡方法、计算设备及存储介质
Song et al. Rethinking graph data placement for graph neural network training on multiple GPUs
Pan et al. Dissecting the communication latency in distributed deep sparse learning
Knorr et al. Proteus: A self-designing range filter
CN109947667B (zh) 数据访问预测方法和装置
CN114328592B (zh) 聚合计算方法和装置
Ding et al. Bitsense: Universal and nearly zero-error optimization for sketch counters with compressive sensing
CN104778088A (zh) 一种基于减少进程间通信开销的并行i/o优化方法与系统
Shi et al. HEM: A hardware-aware event matching algorithm for content-based pub/sub systems
CA3089293C (en) Systems and methods for hash chain migration
Sun et al. GraphMP: I/O-efficient big graph analytics on a single commodity machine
Cui et al. Scalable deep learning on distributed GPUs with a GPU-specialized parameter server

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