一种利用向量指令并行处理文件索引的方法及装置制造方法

文档序号:6634795
一种利用向量指令并行处理文件索引的方法及装置制造方法
【专利摘要】本发明公开了一种并行处理文件索引数据的方法及装置。所述方法包括计算数据表中数据的索引键值并排序;分配所有叶子节点所需的存储空间;使用SIMD指令一次加载多个索引键值,将数据依次填充到所有叶子节点;分配上一层内部节点所需的存储空间;建立内部节点;继续构建上一层内部节点,直到上一层的节点数为1,此节点为根节点,索引树建立完成;在内存中建立缓存池,用一个查询队列暂时保存所收到的所有查询请求;当查询队列的长度达到预定阈值,将其从缓存池取出,并做排序,形成有序的待查询队列;从有序查询队列中依次取得待查询项,从所建立索引树的根节点开始,依次查找,在内部节点和叶子节点内利用SIMD方法并行查找待查询项。
【专利说明】-种利用向量指令并行处理文件索引的方法及装置

【技术领域】
[0001] 本发明属于计算机应用【技术领域】,具体涉及一种利用向量指令并行处理文件索引 的方法,与文件系统构造、处理器指令体系密切相关。

【背景技术】
[0002] 进入云计算时代,信息爆炸式增长,面对海量数据,存储系统需要满足高性能、大 容量、高可靠性与高可扩展性等方面的需求。分布式文件存储系统是获取大容量存储的有 效方式,将存储容量布置在大量分布式计算机节点上,对每一份数据存储多个副本,通过并 发访问提高数据访问速度,通过数据兀余提高了数据的可靠性。
[0003] 当前的分布式文件系统主要采取将文件的数据与其索引数据(元数据)分开存储 的方式进行管理,中也服务器(性能要求高)维护元数据信息,真实数据分散存储在数据节 点。由于文件数据和索引数据分开存储,实现了文件数据传输通道和索引数据传输通道分 离,利用索引数据和文件数据不同的数据特征分别优化数据访问算法,同时分散了文件I/O 访问请求,提高存储系统的并行访问效率。
[0004] 采用中也节点服务器管理索引数据的存储系统架构设计和实现简单,能够有效提 高文件管理效率。但随着数据访问量急剧增大,索引数据服务器将成为系统的性能瓶颈,一 旦索引服务器出现故障,整个系统都将陷入痛疾。采用配置多台索引服务器的方式能增强 系统的可用性,但同时也增加了系统的复杂性,因此提升单台服务器的索引处理能力存在 极大的应用价值。
[0005] 并行化计算是提升单机计算能力的主要途径,现代CPU架构在指令级、数据级、任 务级多个层次提供了将计算并行化处理的方式,将索引处理并行化是提升单台服务器处理 能力的最好选择。B+树是应用最广泛的索引结构,为了解决B+树索引插入操作效率低下的 问题,研究人员已提出了多种批量插入算法来处理B+树的大规模键值插入过程,然而,由 于插入过程中数据依赖性较高,该些算法都需要采用加锁的方式保证键值插入的正确性, 其并行性能大打折扣。B+树索引的查询能力通常是索引数据服务的瓶颈,传统的查询方法 主要通过二分查找的方式,从根节点开始搜索,直至叶子节点。但二分查找的方法不适合并 行处理,无法利用现代超标量处理器的并行计算能力提升效率。


【发明内容】

[0006] 为解决现有技术存在的不足,本发明提出了一种并行处理文件索引数据的方法, 其特别适用于现代超标量处理器,利用SIMD指令处理文件索引,在处理器每个时钟周期同 时处理多个索引操作,提高了存储系统访问的并行性,缩短了索引的平均处理时间,有效提 升了存储系统的性能。本发明提出的并行处理文件索引数据的方法,主要用于处理树型索 弓I,采用了如下的策略:
[0007] 1)本发明所述方法通过对待处理索引项排序后再批量建立,首先建立所有的叶子 节点,再建立上一层的内部节点,从底向上建立索引树,利用了索引树本身是个有序数据集 的特点,避免了锁的使用,较大提升了操作的并行性。
[0008] 2)通过将查询请求缓存在内存中,排序后批量处理,在大规模数据集的环境下,每 个批量查询的索引组都能较好的分布在一个或多个相邻的叶子节点,按照有序查询队列依 次处理,查询过程中能获得较好的局部缓存命中率,有效提升查询索引的速度。
[0009] 3)在叶子节点内部搜索数据时,传统的二分查找方法存在大量的分支指令,且不 容易并行化处理,本发明使用的方法利用SIMD指令的执行宽度,将大量分支指令转化为算 术逻辑操作,减少了了流水线分支预测失败时带来的性能损失。
[0010] 本发明提出的并行处理文件索引数据的方法,包括批量建立文件索引和并行查询 文件索引,其中:
[0011] 所述批量建立文件索引的方法,步骤如下:
[0012] 步骤1 ;计算数据表中数据的索引键值,对全部数据按其索引键值升序排序;
[0013] 步骤2 ;分配所有叶子节点所需的存储空间,假定索引树高度为h,度数为g,叶子 节点填充因子为a,叶子节点数的计算公式表示为:
[0014] 叶子节点数= 公)/(a*")
[0015] 步骤3 ;从数值最小的索引键值开始,使用SIMD指令一次加载多个索引键值,将数 据填充到叶子节点;按此方式,依次构建完所有叶子节点
[0016] 步骤4 ;分配上一层内部节点所需的存储空间,假定B+树高度为h,度数为g,内部 节点数的计算公式表示为;
[0017] 内部节点数=(下層节点数)/ g
[0018] 步骤5 ;按步骤3的方法建立内部节点,每个节点的键值为其对应的下一层节点的 最大值;
[0019] 步骤6 ;按照步骤4和步骤5的方法继续构建上一层内部节点,直到上一层的节点 数为1,此节点为根节点,就此完成整个索引构造。
[0020] 所述并行查询索引的方法,步骤如下:
[0021] 步骤1 ;在内存中建立缓存池,用一个查询队列暂时保存所收到的所有查询请求。
[0022] 步骤2;当查询队列的长度达到某个阔值,将其从缓存池取出,并做排序,形成有 序的待查询队列,此时相邻的多个查询索引项通常分布在一个叶子节点或相邻的多个叶子 节点。
[0023] 步骤3 ;从有序查询队列中依次取得待查询项,从索引树的根节点开始,依次查 找,根据基于SIMD操作的并行查询方法,从内部节点直至找到目标叶子节点。
[0024] 文件系统的索引数据的结构通常采用树型结构的索引,其索引结构具有尺寸小和 结构固定的特征,适用于数据按块存取的策略。本发明利用了处理器向量处理单元的并行 处理能力,针对文件系统中索引数据结构固定的特点,向量化的处理索引数据,单次计算多 个索引数据,有效利用数据并行性,能够大幅提升处理器处理索引的峰值计算能力,提高了 文件系统的效率。同时,本发明采用的方法很容易在任务级(task level)进行扩展,在多 核处理器环境中能够得到有效应用。

【专利附图】

【附图说明】
[0025] 图1示出了索引数据并行处理系统结构框图
[0026] 图2示出了 SIMD指令执行模型
[0027] 图3示出了采用批量方法建立索引的方法流程图
[002引图4示出了 W-棵4阶B+树为例的批量构建索引过程
[0029] 图5示出了并行查询B+树索引的操作流程示图
[0030] 图6示出了在节点内部利用SIMD指令并行查询索引项的步骤
[0031] 图7示出了查找表的构造和掩码值计算过程
[0032] 图8示出了查询索引的任务级并行解决方法

【具体实施方式】
[0033] 为使本发明的目的、技术方案和优点更加清楚明白,W下结合具体实施例,并参照 附图,对本发明作进一步的详细说明。
[0034] 描述过程约定W下符号:
[003引 N ;待处理索引项的数量B ;索引项的数据宽度R ;向量寄存器数据宽度n ;B+树叶 子节点容量a :叶子节点的填充因子(初次构建叶子节点时,索引数据占叶子节点容量的 比例)
[003引 g ;B+树的度数
[0037] h ;B+树的高度
[0038] W下【具体实施方式】中均W B+树为例阐述,本发明中所述方法也能用于文件索引 中常采用的其他树型索引。
[0039] 图1是本发明提出的文件索引数据并行处理系统的结构框图,如图1所示,该并行 处理系统包括:
[0040] 外部存储器,其包括磁盘、SSD等,用于存放完整的索引数据;
[0041] 内存子系统,其用于存放热点数据和索引的更新;
[0042] CPU,其包括片内存储器和计算核也。其中计算核也包括一个标量处理单元和多个 向量处理单元,所述计算核也对加载到所述片内存储器的索引数据进行并行处理,所述处 理包括解压缩、索引建立、查询等计算。
[0043] 高性能索引处理函数库,基于SIMD指令设计,结合CPU计算核也的架构,专口为索 引并行处理中关键的算法优化。
[0044] 图2示出了 SIMD指令执行模型示意图。如图2所示,X。,Ym, Zm是H个向量寄存器, 每个寄存器包含8个32位数据,在单指令多数据流(SIMD)执行模式下,每一个操作数Xi和 Yi,同时进行计算,并将结果写入相应的马,即对i = 0 - 7,狂i〇P Yi) - Zi。SIMD指令支 持包括算术、逻辑、比较、shuffle等在内的多种操作类型,最新的处理器中还支持gather/ scather类的并行离散存取指令。
[0045] 本发明提出的并行处理文件索引数据的方法,包括批量建立索引和并行查询树索 引,其中:
[0046] 批量建立索引的方法,通过对待处理索引项排序后再根据有序数据批量建立索引 树,首先建立所有的叶子节点,再建立上一层的内部节点,从底向上建立索引树。本方法利 用了索引树本身是个有序数据集的特点,避免了锁的使用,较大提升了操作的并行性,而自 底向上的构建方法,可一次性为所有节点分配存储空间,避免了从根节点向下的传统处理 方法中频繁的叶子节点分裂操作带来的性能损失。
[0047] 并行查询索引的方法,对一定时间内收到的索引请求的键值预先排序,内容相关 的键值在查询队列中相互临近,在查询过程中容易落在同一个子树,利用空间局部性和高 速缓存的特性,使用SIMD指令并行处理索引相关的计算。
[0048] 图3示出了本发明所述批量建立文件索引的流程图。如图3所示,批量建立文件 索引的方法包括:
[0049] 步骤1 ;计算数据表中数据的索引键值,对全部数据按其索引键值升序排序;
[0050] 步骤2 ;分配所有叶子节点所需的存储空间,假定B+树高度为h,度数为g,即内部 节点的容量,叶子节点填充因子为a,叶子节点数的计算公式表示为:
[00川 叶子节点数=(N地)/( a *n)
[0052] 步骤3 ;从数值最小的索引键值开始,使用SIMD指令一次加载多个索引键值,将数 据填充到叶子节点;按此方式,依次构建完所有叶子节点;
[005引步骤4;分配上一层内部节点所需的存储空间,假定B+树高度为h,度数为g,即内 部节点的容量为g,内部节点数的计算公式表示为;
[0054] 内部节点数=(下一层节点数)/g
[005引步骤5 ;按步骤3的方法建立内部节点,每个节点的键值为其对应的下一层节点的 最大值;
[0056] 步骤6 ;按照步骤4和步骤5的方法继续构建上一层内部节点,直到上一层的节点 数为1,此节点为根节点,就此完成整个索引构造。其中,内部节点的索引项由其每个孩子节 点最大的索引值组成,遍历一次孩子节点,即完成上一层内部节点的更新。自底向上,直到 根节点,完成整个B+树的建立。
[0057] 由于索引数据结构固定,且是按顺序存储的,在计算完索引键值后对全部索引数 据进行排序,产生的键值排列顺序和实际物理存储地址次序一致,加载和存储索引过程中 不需要交换索引键值的顺序,因而可W利用SIMD指令并行操作。假定单个索引项数据占8 个字节的空间,256位向量寄存器支持一次加载和写入4个索引,每组数据需数据加载、地 址计算、写入共3个操作。给定一个已完成排序的长度为N的数据表,共需要NX3/4条指 令写完叶子节点。内部节点的索引项由其每个孩子节点最大的索引值组成,遍历一次孩子 节点,即完成上一层内部节点的更新。自底向上,直到根节点,完成整个B+树的建立。
[005引图4示出了批量建立B+树索引的过程。该里W 4阶的B+树为例,若向量寄存器 宽度为256bit,每个索引项大小为64bit,向量寄存器每次正好放下4个索引,实际系统中 叶子节点的容量设计为向量寄存器宽度的整数倍,可W获得最好的数据存取效率。图4右 表中数据已按升序排列,遍历整表,每次存取4个索引指针,依次建立好索引叶子节点;接 着则十子节点为基础建立内部索引节点,例如,图中B+树根节点的左子节点,分别由其子 节点的最大值索引17,45,61组成,在一次遍历完叶子节点后,构建完上一层内部节点;最 后完成根节点。
[0059] 图5示出了并行查询B+树索引的流程图。如图5所示,所述并行查询B+树索引 方法的步骤如下:
[0060] 步骤1 ;在内存中建立缓存池,用一个查询队列暂时保存所收到的所有查询请求。
[0061] 步骤2;当查询队列的长度达到某个阔值,将其从缓存池取出,并根据待查询索引 项的键值升序排序,形成有序的待查询队列,此时相邻的多个查询索引项通常分布在一个 叶子节点或相邻的多个叶子节点。
[0062] 步骤3 ;从有序查询队列中依次取得待查询项,从索引树的根节点开始,依次查 找,从内部节点直至找到目标叶子节点,在内部节点和叶子节点内利用SIMD方法并行查找 索引项的方法在图6中描述。
[006引图6示出了在节点内部利用SIMD指令并行查询索引项的步骤。如图6所示,所示 在节点内部利用SIMD指令并行查询索引项的步骤如下:
[0064] 假定要查找的索引项键值是k,索引项的数据宽度为B,向量寄存器数据宽度为R, SIMD指令每次同时处理m = R/B个索引项。
[0065] 步骤1 ;根据查找的索引项键值k构造查询向量:
[0066] Ms =化…k (m 个 k)
[0067] 计算节点初始地址A。,地址增量AiM初始化为0 ;
[006引步骤2 ;更新当前地址A。= Au+Ai。。,并从当前地址A。开始,加载索引数据向量,并:
[0069] M〇 = k〇lv..km_i
[0070] 步骤3 ;利用SIMD比较指令,计算查找表掩码值:
[0071] Mmask 二 SIMD-Greater (Ms, M〇)
[0072] 由于节点内数据是升序排列的,Mma,k的值由如下公式决定:
[0073]

【权利要求】
1. 一种并行处理文件索引数据的方法,包括批量建立文件索引和并行查询文件索引, 其中: 所述批量建立文件索引的方法,步骤如下: 步骤101 :计算数据表中数据的索引键值,对全部数据按其索引键值升序排序; 步骤102 :分配所有叶子节点所需的存储空间,所述叶子节点数量根据所述数据的大 小确定; 步骤103 :从数值最小的索引键值开始,使用SIMD指令一次加载多个索引键值,将数据 依次填充到所有叶子节点; 步骤104 :分配上一层内部节点所需的存储空间,所述内部节点的个数与下一层节点 数和索引树的度数有关; 步骤105 :按步骤3的方法建立内部节点,每个节点的键值为其对应的下一层节点的最 大值; 步骤106 :按照步骤4和步骤5的方法继续构建上一层内部节点,直到上一层的节点数 为1,此节点为根节点,索引树建立完成; 所述并行查询索引的方法,步骤如下: 步骤201 :在内存中建立缓存池,用一个查询队列暂时保存所收到的所有查询请求; 步骤202 :当查询队列的长度达到预定阈值,将其从缓存池取出,并做排序,形成有序 的待查询队列; 步骤203 :从有序查询队列中依次取得待查询项,从所建立索引树的根节点开始,依次 查找,在内部节点和叶子节点内利用SIMD方法并行查找待查询项。
2. 如权利要求1所述的方法,其中,步骤102中叶子节点数如下计算: 叶子节点数=(N*B) / ( a *n) 其中,N为待处理索引项的数量,B为所以那些的数据宽度,a为叶子节点的填充因子, n为叶子节点的容量。
3. 如权利要求1所述的方法,其中,步骤104中,内部节点的数量如下计算: 内部节点数=(下一层节点数)/g 其中,g为索引树的度数。
4. 如权利要求1所述的方法,其中,步骤202中排序后的查询队列中,相邻的待查询项 分布在所述索引树的一个或相邻的多个叶子节点中。
5. 如权利要求1所述的方法,其中,步骤203中,在内部节点和叶子节点内利用SIMD方 法并行查找待查询项具体包括:步骤301 :根据待查询项的键值构造查询向量Ms = kk…k, m个k,m为SMD指令能同时处理的索引项个数; 步骤302 :更新当前地址Atl = AQ+Ain。,并从当前地址Atl开始,加载索引数据向量,所述 Atl的初始值为节点的初始地址,Ain。为地址增量,初始值为0,所加载的索引向量为: M0 =心..、_1 步骤303 :利用SIMD比较指令,计算查找表掩码值: Mmask = SIMD_Greater (Ms, M0) 由于节点内数据是升序排列的,Mniask的值由如下公式决定:
步骤304 :判定Mmask的值,若为全I,计算地址增量Ain。= R/8,并转步骤2重新查询;若 为全0,则所述索引项在前一个索引向量中,计算地址增量Ain。= -R/8 ;若Mmask的值非全0 或全1,根据查找表获取索引项所在位置,进而返回查询结果;其中,R为向量寄存器的数据 览度。
6. -种并行处理文件索引数据的装置,包括批量建立文件索引模块和并行查询文件索 引模块,其中: 所述批量建立文件索引模块包括: 索引键值计算模块,用于计算数据表中数据的索引键值,对全部数据按其索引键值升 序排序; 叶子节点空间分配模块,用于分配所有叶子节点所需的存储空间,所述叶子节点数量 根据所述数据的大小确定; 叶子节点建立模块,用于从数值最小的索引键值开始,使用SMD指令一次加载多个索 引键值,将数据依次填充到所有叶子节点; 内部节点空间分配模块,用于分配上一层内部节点所需的存储空间,所述内部节点的 个数与下一层节点数和索引树的度数有关; 内部节点建立模块,用于按叶子节点的方法建立内部节点,每个节点的键值为其对应 的下一层节点的最大值; 上一次内部节点建立模块,按照所述内部节点空间分配模块和内部节点建立模块的 方法继续构建上一层内部节点,直到上一层的节点数为1,此节点为根节点,索引树建立完 成; 所述并行查询索引的模块包括: 缓存模块,用于在内存中建立缓存池,用一个查询队列暂时保存所收到的所有查询请 求; 队列形成模块,用于当查询队列的长度达到预定阈值,将其从缓存池取出,并做排序, 形成有序的待查询队列; 查询模块,用于从有序查询队列中依次取得待查询项,从所建立索引树的根节点开始, 依次查找,在内部节点和叶子节点内利用SIMD方法并行查找待查询项。
7. 如权利要求6所述的装置,其中,所述叶子节点数量如下计算: 叶子节点数=(N*B) / ( a *n) 其中,N为待处理索引项的数量,B为所以那些的数据宽度,a为叶子节点的填充因子, n为叶子节点的容量。
8. 如权利要求6所述的装置,其中,所述内部节点的数量如下计算: 内部节点数=(下一层节点数)/g 其中,g为索引树的度数。
9. 如权利要求6所述的装置,其中,排序后的查询队列中,相邻的待查询项分布在所述 索引树的一个或相邻的多个叶子节点中。
10.如权利要求6所述的装置,其中,所述查询模块具体包括: 构造模块:根据待查询项的键值构造查询向量Ms = kk…k,m个k,m为SMD指令能同 时处理的索引项个数; 更新模块:更新当前地址Atl = AfAin。,并从当前地址Atl开始,加载索引数据向量,所述 Atl的初始值为节点的初始地址,Ain。为地址增量,初始值为0,所加载的索引向量为: M0 =心..、_1 查找模块:利用SMD比较指令,计算查找表掩码值: Mmask = SIMD_Greater (Ms, M0) 由于节点内数据是升序排列的,Mniask的值由如下公式决定:
结构输出模块:判定Mmask的值,若为全1,计算地址增量Ain。= R/8,并转步骤2重新查 询;若为全0,则所述索引项在前一个索引向量中,计算地址增量Ain。= -R/8 ;若Mmask的值 非全0或全1,根据查找表获取索引项所在位置,进而返回查询结果;其中,R为向量寄存器 的数据宽度。
【文档编号】G06F17/30GK104331497SQ201410662785
【公开日】2015年2月4日 申请日期:2014年11月19日 优先权日:2014年11月19日
【发明者】王东琳, 陈易龙, 蒿杰, 林建海, 舒琳, 宋亚芳, 穆敬彬, 梁小龙 申请人:中国科学院自动化研究所
再多了解一些
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1