Processing math: 36%
  • 中国精品科技期刊
  • CCF推荐A类中文期刊
  • 计算领域高质量科技期刊T1类
高级检索

基于多种同构化变换的SLP向量化方法

冯竞舸, 贺也平, 陶秋铭, 马恒太

冯竞舸, 贺也平, 陶秋铭, 马恒太. 基于多种同构化变换的SLP向量化方法[J]. 计算机研究与发展, 2023, 60(12): 2907-2927. DOI: 10.7544/issn1000-1239.202220354
引用本文: 冯竞舸, 贺也平, 陶秋铭, 马恒太. 基于多种同构化变换的SLP向量化方法[J]. 计算机研究与发展, 2023, 60(12): 2907-2927. DOI: 10.7544/issn1000-1239.202220354
Feng Jingge, He Yeping, Tao Qiuming, Ma Hengtai. SLP Vectorization Method Based on Multiple Isomorphic Transformations[J]. Journal of Computer Research and Development, 2023, 60(12): 2907-2927. DOI: 10.7544/issn1000-1239.202220354
Citation: Feng Jingge, He Yeping, Tao Qiuming, Ma Hengtai. SLP Vectorization Method Based on Multiple Isomorphic Transformations[J]. Journal of Computer Research and Development, 2023, 60(12): 2907-2927. DOI: 10.7544/issn1000-1239.202220354
冯竞舸, 贺也平, 陶秋铭, 马恒太. 基于多种同构化变换的SLP向量化方法[J]. 计算机研究与发展, 2023, 60(12): 2907-2927. CSTR: 32373.14.issn1000-1239.202220354
引用本文: 冯竞舸, 贺也平, 陶秋铭, 马恒太. 基于多种同构化变换的SLP向量化方法[J]. 计算机研究与发展, 2023, 60(12): 2907-2927. CSTR: 32373.14.issn1000-1239.202220354
Feng Jingge, He Yeping, Tao Qiuming, Ma Hengtai. SLP Vectorization Method Based on Multiple Isomorphic Transformations[J]. Journal of Computer Research and Development, 2023, 60(12): 2907-2927. CSTR: 32373.14.issn1000-1239.202220354
Citation: Feng Jingge, He Yeping, Tao Qiuming, Ma Hengtai. SLP Vectorization Method Based on Multiple Isomorphic Transformations[J]. Journal of Computer Research and Development, 2023, 60(12): 2907-2927. CSTR: 32373.14.issn1000-1239.202220354

基于多种同构化变换的SLP向量化方法

基金项目: 中国科学院战略性先导科技专项(XDA-Y01-01,XDC02010600)
详细信息
    作者简介:

    冯竞舸: 1988年生. 博士, 高级工程师. 主要研究方向为编译优化和性能优化

    贺也平: 1962年生. 博士,研究员. 主要研究方向为系统安全、隐私保护

    陶秋铭: 1979年生. 博士,副研究员. 主要研究方向为操作系统、编译技术、软件工程

    马恒太: 1970年生. 博士,副研究员. 主要研究方向为软件安全分析、操作系统安全

    通讯作者:

    冯竞舸(jingge815@gmail.com

  • 中图分类号: TP312

SLP Vectorization Method Based on Multiple Isomorphic Transformations

Funds: This work was supported by the Strategic Priority Research Program of Chinese Academy of Sciences (XDA-Y01-01, XDC02010600)
More Information
    Author Bio:

    Feng Jingge: born in 1988. PhD, senior engineer. His main research interests include compiler optimization and performance optimization

    He Yeping: born in 1962. PhD, professor. His main research interests include system security and privacy protection

    Tao Qiuming: born in 1979. PhD, associate professor. His main research interests include operating system, compiler, and software engineering

    Ma Hengtai: born in 1970. PhD, associate professor. His main research interests include software security analysis and operating system security

  • 摘要:

    超字级并行(superword level parallelism,SLP)是一种面向处理器单指令多数据(single instruction multiple data,SIMD)扩展部件实现程序自动向量化的方法,这种方法被广泛应用于主流编译器中.SLP方法有赖于先找到同构指令序列再对之进行自动向量化. 将非同构指令序列等价转为同构指令序列以扩展SLP方法的适用范围是当前研究趋势之一. 提出SLP的一种扩展方法──SLP-M向量化方法,引入二元表达式替换同构转换方式,基于条件判断和收益计算的选择,利用多种指令序列同构化转换,将满足特定条件的非同构指令序列转换为同构指令序列,再进一步实施自动向量化,从而提升SLP的适用范围和收益. 在LLVM中实现了SLP-M方法,并利用SPEC CPU 2017等标准测试集进行了测试评估. 实验结果表明,SLP-M方法相比于已有方法在核心函数测试中性能提升了21.8%,在基准测试程序整体测试中性能提升了4.1%.

    Abstract:

    SLP (superword level parallelism) is an efficient auto-vectorization method to exploit the data level parallelism for basic block, oriented to SIMD (single instruction multiple data), and SLP has been widely used in the mainstream compilers. SLP performs vectorization by finding multiple sequences of isomorphic instructions in the same basic block. Recently there is a research trend that the compilers translate the sequences of non-isomorphisic instructions into the sequences of isomorphisic instructions to extend application scope of the SLP vectorization method. In this paper, we introduce SLP-M, a novel auto-vectorization method that can effectively vectorize the code containing sequences of non-isomorphic instructions in the same basic block, translatting the code into isomorphic form by selection and conduction of multiple transformation methods based on condition judgment and benefit evaluation. A new transformation method for binary expression replacement is also proposed. SLP-M improves application scope and performance benefit for SLP. We implement SLP-M in LLVM. A set of applications are taken from some benchmarks such as SPEC CPU 2017 to compare our approach and prior techniques. The experiments show that, compared with the existing methods, the performance of SLP-M improves by 21.8% on kernel functions, and improves by 4.1% in the overall tests of the benchmarks.

  • 集合相似度自连接是大数据分析的重要操作,它是从一个集合集中找出相似度大于给定阈值的集合对,有着广泛的应用,如协同过滤[1]、检测近似重复的网页[2]、社交网络分析[3]等. 其中,度量2个集合的相似度可根据应用选择合适的度量函数,如Jaccard函数.

    集合相似度自连接需要度量集合集中所有集合对的相似度,时间复杂度为O(kn2),其中n为集合集的大小,k为任意2个集合相似度的平均计算时间. 当集合规模较大时,如2019年第3季度知名社交网络平台Facebook的月活跃用户人数为24.5亿[4],每个用户都有好友集合. Facebook用户好友集合的自连接计算中n=2.45×109,这样的大规模数据集给时间复杂度高的集合相似度自连接计算带来挑战. 基于要处理的数据是静态数据还是动态数据(流数据),现有集合相似度自连接计算方法可以划分为2类:批处理式计算和流处理式计算.

    首先,批处理式集合相似度自连接计算要处理的是静态数据,运行过程中没有新增数据. 现有提高运行效率的批处理式集合相似度自连接计算方法可以划分为2类:近似计算方法和基于过滤-验证框架的准确计算方法. 近似计算方法通过设计合适的集合相似度快速估算方法来加速计算,如基于位置敏感哈希函数的MSJL[5]、基于局部敏感过滤的LSF-Join[6]、基于高维数据速写和索引的CPSJoin[7]等,但因估算降低了精度导致不能找出所有相似度超过阈值的集合对. 本文将关注准确计算方法.

    基于过滤-验证框架的准确计算方法包括all-pair[8], PPJoin[2], MPJoin[9], AdaptJoin[10], GroupJoin[11]等,其计算采用先过滤后验证的2阶段计算方法. 第1阶段使用合适的过滤策略将检测发现的相似度低于阈值的集合对删除,获得较小的候选集;第2阶段基于规模减小后的候选集验证并输出相似度大于给定阈值的集合对,提高了效率. 有效的过滤策略是提高这类算法的重要支撑技术,常用策略包含长度过滤[12]、前缀过滤[8]、位置过滤[2]等. 最近提出的位图过滤[13]采用哈希函数创建表达集合特征为固定长度的位图,然 后通过位操作推断集合对相似的上界,实现相对使用其他策略最高达4.50倍的性能提升.

    同时,并行分布式计算方法通过将大规模计算或数据划分为一系列较小的分片,每个分片被分发到不同计算节点上并行运行以提高计算效率. 根据计算节点的体系结构,并行分布式集合相似度自连接计算可以划分为基于GPU的计算和基于CPU的计算. 基于GPU的系列算法有效提升了集合相似度连接的计算性能[14],但是,基于GPU的实现需要对硬件有深入的了解,这往往需要编程者付出很高的学习成本. 而基于CPU的集群计算是更为普及的并行分布式计算,现有的基于CPU的并行分布式集合相似度连接算法大部分基于MapReduce[15]框架. 根据处理过程是否将集合切分为多段,基于MapReduce框架和过滤-验证框架的集合相似度连接算法可划分为2大类:1)集合整体过滤与验证,这类算法包括RIDPairsPPJoin(下文简称为RP-PPJoin, 有些文献也称为VernicaJoin)[16], MGJoin[17],SSJ-2R[18]等;2)集合数据分段过滤与验证,如FS-Join[19] . 第1类算法将集合切分为多段,分段过滤,然后合并验证. 这类算法容易被理解,但存在同一集合多次重复验证的现象. 第2算法避免了重复验证. 但当阈值较低时,这2类算法产生的候选集规模都比较大,运行效率并不理想[20] .

    其次,流处理式集合相似度自连接计算处理的是动态数据,该数据指的是随时间依次产生的数据,如网络监控数据、气象测控等. 其数据量随着时间增长,显著特征是数据有时间戳,能快速生成. 集合流处理计算通常基于批处理计算方法,引入集合相似度时间衰减因子、采样降低数据量从而提高计算效率,如串行式计算的基于PPJoin设计的流处理计算算法SSTR[21]、基于更新日志的递增式流处理计算算法ALJoin[22]等,分布式计算的流处理计算算法BundleJoin[23]和KNN Join[24]等.

    综上所述,面向静态数据基于MapReduce的并行分布式集合相似度自连接计算效率无论对批处理式计算还是流处理式计算都很重要,本文拟采用频繁模式树(frequent pattern tree, FP-tree)[25],通过用更紧凑的扩展前缀树结构表示数据并压缩到内存中处理,减小生成的候选集的规模,同时减少I/O操作,降低后续计算复杂度. 本文将系统地研究FP-tree及其派生结构FP-tree*,设计针对集合相似度自连接计算更有效的FP-tree*,并设计相应的基于MapReduce框架的并行分布式集合相似度自连接算法. 本文的主要贡献有3点:

    1)提出面向集合相似度自连接的遍历效率更高的线性频繁模式树 TELP-tree(traversal efficient linear prefix tree)结构模型及基于它的集合相似度自连接算法TELP-SJ,该算法包括2阶段过滤算法,减小树的规模和减少对树结点的遍历,降低集合对相似度计算和验证的时空复杂度;

    2)设计基于TELP-tree和MapReduce的并行分布式集合相似度自连接算法FastTELP-SJ;

    3)基于4组真实应用数据集进行3组性能比较实验,分别进行TELP-SJ算法与其他基于FP-tree*的算法,如FastTELP-SJ,TELP-SJ,FastTELP-SJ等和现有其他基于 MapReduce算法的比较,本文实验结果展现了FastTELP-SJ算法在处理高维大规模集合相似度自连接计算时的性能优于其他算法.

    给定集合集x={x1,x2,,xn},任意xi, xjxxixj都是集合,集合相似度度量函数sim(xi,xj),阈值tx的集合相似度自连接是找出所有满足sim(xi,xj)t的集合对(xi,xj).

    为方便讨论,本文以Facebook开放的大规模应用数据集Facebook applications dataset II[26]的部分数据为例,演示基于其构建的FP-tree派生结构,面向集合相似度自连接计算存在的问题及后续算法的处理过程. 示例数据如图1X所示,其中uid代表用户标识号,aid代表应用标识号. 在示例数据的应用场景中,uidaid可以分别被理解为集合标识号和元素标识号. 对任一用户ui,其使用的应用可表示为集合A(ui),如A(u1)={a1,a2,a3,a4,a5}. 如式(1)所示,当集合A(ui)A(uj)的相似度sim(A(ui),A(uj))Jaccard(A(ui),A(uj))来计算时,sim(A(u1),A(u3))=3/(5+33)=0.6.

    图  1  示例数据转置
    Figure  1.  Transpose of sample data
    sim(A(ui),A(uj))=|A(ui)A(uj)||A(ui)|+|A(uj)||A(ui)A(uj)|. (1)

    FP-tree数据结构最初用于挖掘频繁模式,为使用它来计算集合相似度自连接,我们首先要将其中集合交集大小的计算转化为基于频繁二项模式挖掘的计算. 为此,转置X的行与列得到X的数据,X中任意2个集合A(ui)A(uj)的交集大小|A(ui)A(uj)|的计算就转换成X中二项集(ui,uj)出现的频次fi,j[27]的计算. 如X中二项集(u1,u3)出现的频次f1,3=3,示例数据中|A(u1)A(u3)|=|{a1,a2,a3}|=3f1,3=|A(u1)A(u3)|. 另外,X中一项集ui出现的频次与X中的|A(ui)|出现的频次也相等.

    FP-tree是一种扩展前缀树结构,该树保留了所有项集的关联信息,基于FP-tree可以递归地挖掘出所有的频繁项集[25]. FP-tree数据结构模型由2部分组成:头表和树结构. 头表由三元组表示(元素,频次,头指针),其中“头指针”指向树结构中元素相同的第1个结点,头表中的三元组按照频次递减排序. 树结构结点由六元组表示(元素,频次,计数,父结点指针,子结点指针,下一个元素相同结点的指针),其中“计数”指的是共同前缀出现频次的计数,“下一个元素相同结点的指针”用于构建索引链,把树中具有相同元素的结点链接起来.

    构建FP-tree包括构建头表H和树结构. X中任一应用ai的用户集合标记为U(ai)U(ai)元素按照频次降序排序的序列标记为S(ai). 首先初始化头表和树结构,将数据集中所有ui及其一项频次fi按照频次倒序加入头表中,相应头指针L(ui)初始化为空指针,即索引链为空;而树结构则初始化为元素为空的根结点. 然后将X中任一应用ai相应的序列S(ai)插入头表和树结构中. 对任一序列S(ai),假设当前始于根且与S(ai)有最长共同前缀的路径为P,则给共同前缀上所有结点的计数都加1,将S(ai)中不在共同前缀中的元素依序插入树中,同时结点ui链接到对应元素的索引链的末尾. 基于图1示例数据构建的FP-tree见图2 (a). 为了简化图2表示,树结点信息仅展示其中的3项,并以三元组格式展示(元素, 频次, 计数).

    图  2  基于示例数据构建的FP-tree, N-lists, LP-tree, TELP-tree
    Figure  2.  Construction of the FP-tree, N-lists, LP-tree, and TELP-tree over the sample data

    构建好FP-tree后,简单的集合相似度自连接可以通过以下流程完成:首先根据头表结点索引链遍历树并统计所有包含这些结点元素的二项集出现频次,即相应集合交集大小;然后验证2个集合相似度是否大于阈值;最后输出大于阈值的集合对. 其中统计树二项集的频次时取二项计数值中较小者累加. 例如,从头表的u3开始,索引项的第1个树结点是(u3,3,3),沿分支向根结点方向遍历并统计包含u3的二项集的频次. 其中(u3,3,3;u1,5,5)的二项计数值较小者为3,(u3,3,3;u1,5,5)的计算值为3,则f3,1暂时记为3. 向上扫描完第1个分支后,发现u3索引链只有1个结点,则f3,1=3. 即|A(u3)A(u1)|=3. 而|A(u3)|=3|A(u1)|=5,根据式(1)得sim(A(u3),A(u1))=0.6,满足阈值要求,输出集合对(u1,u3). 而从u4开始,索引项的第1个树结点是(u4,2,1),沿分支向根结点方向遍历得到(u4,2,1;u1,5,5)的计算值为1,则f4,1暂时记为1. 向上扫描完第1个分支后,沿着u4索引链找到FP-tree的下一个结点(u4,2,1),同理得到(u4,2,1;u1,5,5)的计算值为1,则f4,1=f4,1+1=2,即|A(u4)A(u1)|=2. 而A(u4)=2A(u1)=5,根据式(1)得sim(A(u4),A(u1))=0.4<0.6,不输出集合对(u1,u4).

    由于基于FP-tree的多项集频次计算或频繁多项集挖掘需要递归建树,运行期开销大. 为减少这一开销,N-lists[28]采用垂直数据结构表示FP-tree树结点,FP-tree树结点的构建过程包含2步:1)构建一种类似FP-tree的树结构-前序后序编码树(pre-order post-order code tree, PPC-tree);2)构建PPC-tree结点列表N-list. 如图2(b)所示,PPC-tree 基本与FP-tree结构相似,不同之处在于PPC-tree不包含索引链,同时每个树结点增加了标识结点在先序树遍历和后序树遍历中位置的先序编码和后序编码. PPC-tree结点旁边括号中的数字,左边是先序编码,右边是后序编码. 结合2个结点的先序编码、后序编码可快速判断2个结点之间的祖先后代关系:祖先结点的先序编码大且后序编码小. 为此,PPC-tree的建树过程增加了2次树的遍历:先序遍历和后序遍历. N-lists是由PPC-tree中元素相同的结点按先序编码升序排序的列表,其数据结构包含头表和元素的结点列表N-list. 头表结构及内容与图2(a)类似,只是头指针指向相应元素的N-list首地址. 本文的图2(b)中只画出头表中的元素信息部分. N-lists的结点数据结构为三元组:(计数,(先序编码,后序编码)). 头表元素ui的N-list的第1个结点表项记为Ni,0,第2个结点表项记为Ni,1,依此类推. 如u5的第1个结点N5,0=(2,(4,1)). 特别地,头表元素的N-list各项计数之和为元素的单项频次,例如,u5的N-list中2项元组的计数之和为N5,0.+N5,1.=2+1=3=f5.

    假定二项集(ui,uj)都是排序的二项集,ui的先序编码小于uj,则(ui,uj)的N-list也是按先序编码升序排序的列表,可通过将uiuj的N-lists按规则相交合并而成:分别取uiuj的N-lists上的任意一个结点 Ni,kNj,l,如果结点之间存在祖先后代关系,则将(Nj,l.,(Ni,k.,Ni,k.))插入(ui,uj)的N-list中. 例如,u3u5对应的N-lists相交合并可生成(u3,u5)的N-list,首先u3的N-list只包含1个结点N3,0=(3,(3,2))u5的N-list包含2个三元组N5,0=(2,(4,1)),N5,1=(1,(7,5)). 当比较N3,0N5,0时,由于3<42>1N3,0N5,0的祖先,即它们间有祖先后代关系,则向(u3,u5)的N-list中插入1个结点N(3,5),0=(N5,0.,(N3,0.,N3,0.))=(2,(3,2));当比较N3,0N5,1时,由于3<72<5,它们之间没有祖先后代关系,因此不必向(u3,u5)的N-list插入新的结点. 同理,频次fi,j的计算可以通过对(ui,uj)的N-list各项计数求和得到,如f3,5=2,即|A(u3)A(u5)|=2,而|A(u3)|=3|A(u5)|=3,根据式(1)得sim(A(u3),A(u5))=0.5,不满足阈值要求,不输出集合对(u3,u5).

    基于N-lists的多项集频次计算是基于N-lists进行交叉合并的,不需要递归建树,提升了计算性能,但在只计算二项频次时转变为2个N-lists的所有元素两两对比的计算,性能反而不理想. 而面向大规模集合构建的FP-tree的树结点数量多,指针结点的寻址时间长,缓存访问命中率低,降低了遍历树的效率. 线性前缀树(linear prefix tree, LP-tree)[29],在FP-tree结构的基础上将其结点的元素字段改用数组表示,存储多个元素信息,减少内存使用并加快寻址. 如图2 (c)所示,LP-tree的头表结构及内容与图2 (a)完全一样,所以本文只画出头表中的元素信息部分. 而结点信息改为2项内容:一个是存储元素信息的数组,另一个是父结点. 该数组每一项的数据域用五元组表示(元素, 频次, 计数, 下一个元素相同结点的指针, 分支标志). 其中,“下一个元素相同结点的指针”用于构建索引链,指向下一个元素相同的项在另一个结点的数组中的位置. 父结点指向其前缀最后一个元素所在的结点及其在数组的位置. 其中,当一个元素没有下一个元素相同的结点时,相应指针为Null. 分支标志为t时表示有大于等于2个以上的序列片段的最长共同前缀止于该元素,f表示不存在分支. LP-tree结点结构合并了多个元素结点的信息,减少了FP-tree树结点数量,图2(a)中的FP-tree有9个结点,而图2(c)中的LP-tree只有4个结点. LP-tree通过连续存储元素信息提高了计算的效率,但结点内部存在的分支、复杂的遍历流程带来运行期开销.

    为进一步提高基于FP-tree*的集合相似度自连接的计算效率,我们提出了一种遍历效率更高的线性前缀树TELP-tree(traversal efficient LP-tree)的数据结构. 与线性前缀树LP-tree相似,TELP-tree的树结点也采用线性数组存储多个元素信息以减少树结点数量,提高树的遍历效率;而不同的是,TELP-tree树结点内部没有分支,避免结点内分支带来复杂的运行期遍历流程管理,从而减少相应的运行期开销.

    定义1. TELP-tree. TELP-tree,数据结构包含头表H和树结构,头表H与FP-tree一样结构. TELP-tree树结点(TELP-tree node)N包含建树和遍历树所需的3项内容:父结点P、子结点C和存储元素信息的数组E,即一个包含k个元素的Ni表示为Ni={P,C,E={E1,E2,,Ek}}. 而数组元素Ej可用三元组(元素, 频次, 计数)表示. 一个由c个树结点组成的TELP-tree可以表示为{H,N1,N2,,Nc}.

    TELP-tree的头表与FP-tree一样,因此,构建TELP-tree头表与构建FP-tree的方式是一样的. 而树结点间存在差异,因此TELP-tree树结构的构建与FP-tree, LP-tree的构建也存在差别. 对任一序列S(ai),与FP-tree, LP-tree相似,始于根结点,找到TELP-tree中与S(ai)有最长共同前缀的路径P,将P相应共同前缀上结点中所有元素的计数加1,然后将这些元素从S(ai)中移去,形成S(ai). 如果|S(ai)|=0,对该序列的处理完成. 否则,设P上最后1个结点中与S(ai)有最长公共前缀的后继结点为Nsucc,根据该公共前缀长度是否为0,树结点的构建和树结点插入到树结构有所不同:1)长度为0时,构建一个新的结点,将S(ai)中的元素依序存进其数组中,并将该结点插入树结构和链接到对应元素的索引链的末尾,这种情况与LP-tree的树结构构建是一致的;2)长度不为0时,将Nsucc所有公共前缀上的元素计数加1. 然后将S(ai)中在公共前缀上的元素移除,形成S(ai), 如果\left|S{\left({a}_{i}\right)}''\right|=0,对该序列的处理完成,这种情况与LP-tree的树结构构建是一致的. 如果\left|S{\left({a}_{i}\right)}''\right|=0,将构建一个新的结点{N}',将S{\left({a}_{i}\right)}''中的元素都依序存进其数组中. 同时将 {N}_{\mathrm{s}\mathrm{u}\mathrm{c}\mathrm{c}} 中不是公共前缀的元素都移出,重构一个新的结点{N}''. 最后将新构建的结点{N}'{N}''插入树中,即 {N}_{\mathrm{s}\mathrm{u}\mathrm{c}\mathrm{c}} {N}'{N}''的父结点,并将N'N''分别链接到对应元素的索引链的末尾. 这一步是TELP-tree与LP-tree因为树结点结构不同带来的树结构构建的不同之处,结点内部没有分支,简化了树结点的同时也简化了树结构的构建.

    基于图1数据构建的TELP-tree如图2(d)所示,其中 {(u}_{1},5 ; {u}_{2},5) 是所有输入序列的公共前缀,基于构建树的规则, {(u}_{1},5) ({u}_{2},5) 将分别成为TELP-tree的1个结点里的2个数组元素. 而序列 ({u}_{1},5;{u}_{2},5;{u}_{3},3;{u}_{5},3; {u}_{4},2) 移去公共前缀 ({u}_{1},5;{u}_{2},5) 之后的后续片段为 ({u}_{3},3;{u}_{5},3;{u}_{4},2) ({u}_{1},5;{u}_{2},5;{u}_{3},3;{u}_{5},3) 移除公共前缀 ({u}_{1},5;{u}_{2},5) 后是 ({u}_{3},3;{u}_{5},3) ({u}_{1},5;{u}_{2},5;{u}_{3},3) 移除公共前缀 ({u}_{1},5;{u}_{2},5) 后是 ({u}_{3},3) ,(u3,3; u5,3)是 ({u}_{3},3; {u}_{5},3;{u}_{4},2) 的子序列,而(u5,3)和( u4,2)没有公共前缀,所以(u1,5), (u2,5), (u3,3)这3个数组元素组成1个结点,计数值分别是3, 2, 1,且结点内部没有分支. 最终构建的TELP-tree有5个结点.

    相比图2(a)中9个结点的FP-tree,图2(d)中5个结点的TELP-tree结点少4个,结点内数组元素寻址快. 相比图2(c)的4个结点的LP-tree,TELP-tree的结点多了1个,但结点数组中存储的信息少,且前缀所在结点直接指向后续片段所在结点,避免了结点内部分支,简化并加速树的遍历.

    1.1节描述了简单的基于FP-tree*的集合相似度自连接计算流程,但该计算过程没有采用过滤-验证框架. 为进一步提高基于FP-tree*的集合相似度自连接计算效率,本节设计基于过滤-验证框架和TELP-tree的集合相似度自连接算法TELP-SJ.

    TELP-SJ使用长度过滤策略来设计其过滤算法. 长度过滤策略被应用于多个集合相似度自连接算法中,如FS-Join. 当集合相似度函数为Jaccard()时,长度过滤策略如定理1[19]所示.

    定理1. 给定2个集合 A B , \left|A\right| < \left|B\right| ,阈值 t ,如果 \left|A\right| < t\times \left|B\right| ,那么 sim\left(A,B\right) < t .

    文献[19]给出定理1的数学证明,基于定理1,2个相似的集合应有相似的大小,反之,集合大小不相似的集合对的相似度低. 与集合 A 的相似度大于等于 t 的所有集合,其集合大小一定小于等于 \left|A\right|/t . 因此,可提前过滤集合大小大于 \left|A\right|/t 的集合. 根据1.1节和1.2节的建树过程可知,序列的长度将影响树的深度,长度越大,深度越深,树的遍历代价就越高. 为减小构建的树的规模,根据定理1,我们首先设计面向构建树的过滤算法,该算法检测、发现并删除序列中不会与其他集合形成相似度高于阈值的集合对的集合. 给定至少有2个元组的序列 S\left({a}_{i}\right) ,在将它插入到TELP-tree时前先应用算法1描述的面向构建树的过滤算法对其进行预处理:从右向左扫描 S\left({a}_{i}\right) 中的元素,假设最右边的2个相邻元素分别是 {u}_{k} {u}_{j} ,如果 \left|A\left({u}_{k}\right)\right| > t\times \left|A\right({u}_{j}\left)\right| ,将 S\left({a}_{i}\right) 按照2.2节描述的建树过程插入TELP-tree. 如果 \left|A\left({u}_{k}\right)\right| < t\times \left|A\right({u}_{j}\left)\right| ,根据定理1,我们有 sim(A({u}_{k}),A({u}_{j})) < t ,即 {u}_{k} {u}_{j} 的相似度低于阈值 t . 序列片段按元素频次降序排列,此时, {u}_{k} 对应的元组 ({u}_{k},A\left({u}_{k}\right)) 将从序列 S\left({a}_{i}\right) 中删除. 删除后如果 \left|S\right({a}_{i}\left)\right| ≤1,意味着 {a}_{i} 对应原序列中所有元素相似度都低于阈值t,原序列被舍弃,否则继续如上述过程迭代处理 S\left({a}_{i}\right) . 面向构建树的过滤算法如算法1所示. 函数 getrightmost\left(S\right({a}_{i}\left)\right) 表示获取 S\left({a}_{i}\right) 的最右边元素.

    算法1. 面向构建树的过滤算法.

    输入:序列 S\left({a}_{i}\right)

    输出:过滤后序列{S}'\left({a}_{i}\right).

    S'\left({a}_{i}\right)\leftarrow S\left({a}_{i}\right)

    ② while {|S}'\left({a}_{i}\right)| > 1 do

    \left({u}_{k},A\left({u}_{k}\right)\right)\leftarrow getrightmost\left({S}'\right({a}_{i}\left)\right)

    {S}''\left({a}_{i}\right)\leftarrow {S}'\left({a}_{i}\right)-\left({u}_{k},A\left({u}_{k}\right)\right)

    ({u}_{j},A({u}_{j}))\leftarrow getrightmost\left({S}''\left({a}_{i}\right)\right)

    ⑥ if \left|A\left({u}_{k}\right)\right|\ge t\times \left|A({u}_{j})\right|

    ⑦ break;

    ⑧ else

    {S}'\left({a}_{i}\right)\leftarrow {S}''\left({a}_{i}\right)

    ⑩ end if

    ⑪ end while

    ⑫ return {S}'\left({a}_{i}\right).

    例如,针对图1的示例数据,S\left({a}_{5}\right)=({u}_{1},5;{u}_{2}, 5;{u}_{5},3; {u}_{6},1),从右向左扫描 S\left({a}_{5}\right) ,最右边的 \left|A\left({u}_{6}\right)\right|=1 ,而过滤算法根据构建树(算法1),构建树的过程就是逐步插入树节点的过程 \left|A\left({u}_{5}\right)\right|=3 1/3 < 0.6 ,根据面向构建树的过滤算法删除元组 ({u}_{6},1) ,得到 {S}'\left({a}_{5}\right)= ({u}_{1},5;{u}_{2},5;{u}_{5},3) . 此时最右边的 \left|A\left({u}_{5}\right)\right|=3 ,而 \left|A\left({u}_{2}\right)\right|=5 3/5=0.6 ,将{S}'\left({a}_{5}\right)插入到 TELP-tree. 应用面向构建树的过滤算法构建的TELP-tree如图3所示,与图2(d)中没有应用该过滤算法构建的TELP-tree相比,图3中的TELP-tree减少了1个树结点 {N}_{4} ,树的结点 {N}_{3} 的数组元素减少了1个,头表元素 \left|H\right| 也减少了1个,即少了 {u}_{6} 相应的信息.

    图  3  基于过滤算法构建的TELP-tree
    Figure  3.  A TELP-tree is constructed based on filtering algorithm

    构建好TELP-tree后,通过沿着头表结点索引链遍历树并统计所有以这些结点为后缀的二项集频次,根据树的特征,树结点元素频次越高越靠近根结点. 树结点内数组元素按频次倒序排序. 树的遍历代价跟遍历的结点数和结点内数据元素的个数有关. 沿着索引链从远离根结点的树结点向着根结点的方向遍历树,统计索引链结点元素与其他元素的二项频次. 同样,根据定理1,非根结点元素 {u}_{i} 及其祖先结点元素 {u}_{j} 如果满足\left|A\left({u}_{i}\right)\right| < t\times |A({u}_{j})|,可得sim(A({u}_{i}), A({u}_{j})) < t,即这2个元素相似度低于阈值,此时,可以停止沿着这条分支向着根结点方向统计,即过滤对应的集合对以减少遍历. 面向遍历树的过滤算法见算法2,其中, Ancestor\left(N\right) 表示树中 N 的祖先结点; N.x 中的“ . ” 表示取结点 N 的相应数据域 x ,如 N.{E}[{l}] 表示取结点 N 的元素数组E的第 l 个元素.

    算法2. 面向遍历树的过滤算法.

    输入:元素 {u}_{i} , 树结点 N , 频次统计 f

    输出:频次统计 f .

    ① while N 不为根结点 do

    l\leftarrow |N.E|-1

    ③ while l\ge 0 do

    ④ if \left|A({u}_{i})\right| < t\times \left|A\left(N.E\left[l\right]\right)\right|

    ⑤ goto ⑫;

    ⑥ else

    {f}_{i,N.E\left[l\right]}+=N.E\left[l\right]. \mathrm{计}\mathrm{数}

    ⑧ endif

    ⑨ end while

    N\leftarrow Ancestor\left(N\right)

    ⑪ end while

    ⑫ return f.

    基于面向构建树的过滤算法构建TELP-tree,按规则遍历树并计算集合相似度自连接:1)遍历头表 H 中所有元素 {u}_{i} ,并初始化 f ;2)通过 {u}_{i} 的索引链,遍历其所有树结点,对每个树结点调用面向遍历树的过滤算法,并更新 f ;3)根据 f 计算出集合相似性,并输出相似性大于阈值的集合对. 例如从图3的头表的 ({u}_{4},2) 开始,顺着索引项第1个树结点 {N}_{2} 的数组元素 ({u}_{4},\mathrm{2,1}) 开始统计包含 {u}_{4} 的二项集的频次. 如 ({u}_{4},\mathrm{2,1};{u}_{5},\mathrm{3,2}) 的二项计数值较小者为1,则 {f}_{\mathrm{4,5}}= 0+1=1 . 同时注意到 |A\left({u}_{4}\right)| =2 \left|A\left({u}_{2}\right)\right|=5 2 < 0.6\times 5,因此,针对 ({u}_{4},\mathrm{2,1}) ,从 {N}_{2} 向着根结点的方向遍历树时,只需要遍历 {N}_{2} 的元素信息数组,不需要遍历 {N}_{1} . 因此 {f}_{\mathrm{4,5}}=1 ,即 \left|A\left({u}_{4}\right)\cap A\left({u}_{5}\right)\right|=1 . 而 \left|A\left({u}_{4}\right)\right|=2 \left|A\left({u}_{5}\right)\right|=3 ,根据式(1)得 sim\left(A\left({u}_{4}\right),A\left({u}_{5}\right)\right)=0.25 < 0.6 ,不输出集合对 ({u}_{4},{u}_{5}) . 图2图3中灰色框的元素表示统计包含 {u}_{4} 的二项集频次时要遍历的元素,没有填充灰色的框的结点和数组元素表示没有遍历的点或元素. 由此,针对TELP-tree,统计包含 {u}_{4} 的二项集的频次要遍历的结点数和数组元素分别是1和2,而在使用过滤算法的情况下,要遍历的结点数和数组元素的分别是3和6,遍历次数大大减少,提高了遍历效率.

    以上面向构建树和树遍历的2个过滤算法同样可以使用于其他基于FP-tree*的集合相似度自连接算法. 综上,TELP-SJ的算法的伪代码见算法3. 基于FP-tree的集合相似度自连接算法FP-SJ、基于LP-tree的 LP-SJ均与 TELP-SJ的计算思路基本一致,不同之处在于算法3中行⑪,即:如果是FP-SJ,则构建FP-tree;如果是LP-SJ,则构建LP-tree. 遍历树的一些细节有稍许区别,如 Ancestor\left({n}_{k}\right) 的实现和结点的定位等操作,这里不赘述. 而基于N-lists的集合相似度自连接算法PPC-SJ,则是构建PPC-tree后,构造N-lists,然后对任意2个N-lists的所有元素两两对比验证完成计算. FP-SJ,LP-SJ, TELP-SJ,PPC-SJ这4种基于FP-tree*的集合相似度自连接算法统称为FP-tree*-SJ.

    算法3. TELP-SJ算法.

    输入:数据集D=\{ 〈 {u}_{i},\left\{{a}_{i1},{a}_{i2},… ,{a}_{ik}\right\} 〉 \},阈值 t

    输出:满足阈值的集合对集合 P .

    U\leftarrow \varnothing ,S\leftarrow \varnothing ,{S}'\leftarrow \varnothing ,P\leftarrow \varnothing

    ② for each {u}_{i} A\left({u}_{i}\right) in D

    ③ for each {a}_{ij}\in A\left({u}_{i}\right)

    U({a}_{ij})\leftarrow U({a}_{ij})+\left({u}_{i}:\left|A\left({u}_{i}\right)\right|\right)

    ⑤ end for

    ⑥ end for

    ⑦ for U\left({a}_{i}\right) in U

    ⑧ 对 U\left({a}_{i}\right) 按频次降序排序得到 S\left({a}_{i}\right)

    ⑨ 对 S\left({a}_{i}\right) 调用算法1得到{S}'\left({a}_{i}\right)

    ⑩ end for

    ⑪ 根据S'建树 tree

    ⑫ for each {u}_{i}\in tree.H

    ⑬ 初始化频次 f

    ⑭ for each {N}_{k} in {u}_{i} 的索引链

    ⑮ 对 {u}_{i} {N}_{k} f 调用算法2;

    ⑯ end for

    ⑰ 根据 f 计算出 sim({u}_{i},{u}_{j})

    P\leftarrow P+\{({u}_{i},{u}_{j})\mathrm{s}. \mathrm{t}.sim({u}_{i},{u}_{j}) > t\}

    ⑲ end for

    ⑳ return P .

    MapReduce是一种高效的并行分布式集群计算框架. 一个MapReduce任务的运行主要包含2个阶段:映射(Map)阶段和规约(Reduce)阶段. Map阶段首先将存储在分布式文件系统HDFS上的输入数据划分为多个分片;然后就近分发至集群多个计算节点独立并行运行函数map,处理数据并以〈Key,Value〉对的形式输出中间结果. 之后中间结果按照Key值进行合并(combine)、重新分配(shuffle)、排序(sort)后再分发至1个或多个节点进行Reduce阶段运算,独立并行运行函数reduce进行汇总. 最终各个函数reduce的结果仍以〈Key,Value〉对的方式输出并保存在HDFS上.

    第1节设计了系列基于FP-tree及其扩展结构的集合相似度自连接算法FP-tree*-SJ,这些算法的特征是建树后,整棵树需要保留在内存中进行计算,当集合规模增大时,树的规模增大,对内存的要求增大,树的遍历计算代价也增大. 为进一步提高计算性能,本节设计基于TELP-tree和MapReduce的集合相似度自连接算法FastTELP-SJ. 图4展示了FastTELP-SJ的计算过程. FastTELP-SJ包含2个MapReduce任务,分别完成数据集转置、建树和集合相似度自连接的计算. 1.3节设计的2阶段过滤算法,分别应用于任务1和任务2.

    图  4  基于MapReduce的并行分布式集合相似度自连接FastTELP-SJ的计算流程示意图
    Figure  4.  An illustration of the computation process of the parallel and distributed set similarity self-join of FastTELP-SJ with MapReduce

    任务1的函数map计算每个 {u}_{i} 的频次 \left|A\right({u}_{i}\left)\right| 、输出〈Key=aid,Value=\left({u}_{i}:\left|A\left({u}_{i}\right)\right|\right)〉对, 实现了原数据集的转置. 与 Key 值相同的 Value 将被合并和发送到同一个函数reduce. 任一应用 {a}_{i} Value 集合标记为 U\left({a}_{i}\right) . 函数reduce将 U\left({a}_{i}\right) 元素按照频次降序排序得到序列 S\left({a}_{i}\right) ,调用算法1得到{S}'\left({a}_{i}\right),输出键值对〈Key={a}_{i}, Value={S}'\left({a}_{i}\right)〉. 例如,图4任务1的Reduce阶段中 S\left({a}_{5}\right)= ({u}_{1},5;{u}_{2},5;{u}_{5},3;{u}_{6},1) , 函数reduce S\left({a}_{5}\right) 应用算法1,从右向左扫描 S\left({a}_{5}\right) ,最右边的 \left|A\left({u}_{6}\right)\right|=1 ,而 \left|A\left({u}_{5}\right)\right|=3 1/3 < 0.6 ,删除数据 ({u}_{6},1) . 同时 \left|A\left({u}_{2}\right)\right|=5 3/5\ge 0.6 ,因此输出结果〈{a}_{5},\left({u}_{1},5;{u}_{2},5;{u}_{5},3\right)〉. 任务1的函数mapreduce的功能分别与算法3中行②~⑥和行⑦~⑩类似,故不再赘述.

    当所有reduce函数完成计算后,节点master将启动一个独立进程对元素分组,按照频次将元素排序,函数 seq\left({u}_{i}\right) 表示 {u}_{i} 的序号. 假设 gNum 表示组数, {g}_{i} 表示 {u}_{i} 的组标识号 gid . 基于FP-tree树的并行分布式计算有多种分组策略[30],这里采用基于均衡预估遍历负载的策略,即 {g}_{i}=seq\left({u}_{i}\right)\mathrm{m}\mathrm{o}\mathrm{d}\;gNum .

    FastTELP-SJ采用集合数据分段过滤与验证的设计思路,为此,任务2首先切分序列,按分段划分数据集,然后根据数据集分片并行独立构建TELP-tree计算集合相似度自连接. 其中函数map完成数据集划分工作. 对任一 S\left({a}_{i}\right) ,函数map的工作流程为:1)根据 S\left({a}_{i}\right) 最右边元素 gid 输出键值对〈 Key=gid,Value= S({a}_{i}) 〉;2)从右向左遍历 S\left({a}_{i}\right) 中的元素 {u}_{k} ,如果与 gid {g}_{k} 相等的键值对已输出,则将该 {u}_{k} S\left({a}_{i}\right) 中删去;如果 S\left({a}_{i}\right) 不为空,跳回1)继续迭代执行. 例如,图4任务2的函数map对序列 S\left({a}_{5}\right)=({u}_{1},5;{u}_{2},5;{u}_{5},3) 将输出2个结果:〈1,({u}_{1},5;{u}_{2},5)〉和〈0,({u}_{1},5;{u}_{2},5;{u}_{5}, 3)〉. 任务2中切分序列的伪代码如算法4所示.

    算法4. 序列切分算法.

    输入:已排序序列 S\left({a}_{i}\right) ,元素分组 gid

    输出:划分结果R=\{ 〈gid,S 〉 \}.

    R\leftarrow \varnothing , G\leftarrow \varnothing ;

    ② while \left|S\left({a}_{i}\right)\right| > 0

    \left({u}_{ik},\left|A\left({u}_{ik}\right)\right|\right)\leftarrow getrightmost\left(S\left({a}_{i}\right)\right);

    ④ if {g}_{ik}\in G

    R\leftarrow R\cup \left\{ 〈 {g}_{ik},S\left({a}_{i}\right) 〉 \right\}

    G\leftarrow G\cup \left\{{g}_{ik}\right\}

    ⑦ end if

    S\left({a}_{i}\right)\leftarrow S\left({a}_{i}\right)-\left({u}_{ik},\left|A\left({u}_{ik}\right)\right|\right)

    ⑨ end while

    ⑩ return R .

    所有Key gid 相同的序列片段将被分配给同一个节点的函数reduce. 因为集合相似度自连接仅需要计算单项频次和二项频次,结合面向MapReduce计算而设计的精简FP-tree(reduced FP-tree)[29]的结构特征,函数reduce在构建TELP-tree时,仅为 gid Key值相同的元素构建头表和索引链,减少内存空间并减少建树时间,相应的TELP-tree称为精简TELP-tree. 除此之外,树的构建过程与1.2节相同.

    构建好精简TELP-tree后,通过对头表结点索引链应用面向遍历树的过滤规则遍历树,并统计所有以这些结点为后缀的二项集出现频次. 其中树遍历过程与1.3节描述的相同,而二项集频次统计仅对 gid reduceKey值相同的结点进行统计. 任务2的函数reduce与算法4的行⑪~⑳类似,故不再赘述.

    综上,FastTELP-SJ算法的计算流程示例见图4. 其他FP-tree*-SJ的MapReduce计算可采用类似的设计,相应地,基于MapReduce的FP-tree*-SJ算法被命名为FastFP-tree*-SJ.

    基于FP-tree*的算法通过将数据压缩在内存中进行计算,减少I/O操作,减小候选集,提高验证两两集合相似度是否大于阈值的运行效率. 但这些算法也增加了动态构建树等运行期开销,同时,整棵树需被保留在内存中进行计算,对内存需求比较大. 我们将从运行时间、内存占用率、磁盘使用量这3类指标通过3组比较实验评估FastTELP-SJ算法的性能:1)TELP-SJ算法与基于其他FP-tree*-SJ算法的比较;2)FastTELP-SJ算法与TELP-SJ算法的比较;3)FastTELP-SJ与现有经典算法的比较.

    Apache Hadoop[31]和 Apache Spark[32]是2个最知名和最广泛使用的MapReduce编程模型的开源实现. 两者最大的区别是:Apache Hadoop的中间计算结果保存在Apache Hadoop分布式文件系统中,而Apache Spark可将中间数据结果缓存在内存中. 因此,对多次数据依赖的迭代算法、多数据依赖的计算任务,使用Apache Spark可以减少I/O从而提高运行效率. 从第2节的描述可见,集合相似度自连接计算不包含多次数据依赖的迭代计算. 另外,还有些特定面向多核或众核优化的MapReduce实现,如Phoenix[33], Mars[34]等. 考虑到现有经典算法都是基于Apache Hadoop实现,因此,本文的对比实验首先在Apache Hadoop上复现经典算法,然后实现本文设计的算法.

    实验使用一个包含17个曙光TC4600刀片节点搭建的Apache Hadoop集群,其中1个作为主节点,其他作为从节点. 每个刀片都有2个10核的Intel® Xeon® E5-2680 v2 2.8 GHz的处理器、2个1 TB的磁盘、64 GB的内存和1 Gbps的以太网. 刀片上安装CentOS 6.5操作系统,OpenJDK 1.8.0和Apache Hadoop 2.7.1. 相关Apache Hadoop参数配置见表1,其他均采用缺省配置.

    表  1  Apache Hadoop 参数配置
    Table  1.  Apache Hadoop Parameter Configuration
    参数取值描述
    mapreduce.map.java.opts/MB4096Java虚拟机启动参数,为函数map设置最大堆内存大小
    mapreduce.reduce.java.opts/MB20240Java虚拟机启动参数,为函数reduce设置最大堆内存大小
    yarn.scheduler.maximum-allocation-mb/MB40000单个任务可申请的最大物理内存量
    yarn.scheduler.minimum-allocation-mb/MB5120单个任务可申请的最小物理内存量
    yarn.nodemanager.resource.memory-mb/MB41440节点最大可用物理内存总量
    yarn.nodemanager.resource.cpu-vcores20该节点上 YARN 可使用的虚拟 CPU 个数
    下载: 导出CSV 
    | 显示表格

    实验数据来自4组真实的应用数据集:Facebook 应用数据集 II(简记为facebook)[35]、匈牙利在线新闻门户点击流数据集kosarak[36]、2015年Enron电子邮件数据集Enron[37]和交通事故数据集accidents[38]. 我们将从各组数据集中提取一定量的数据分别进行实验,相应数据子集命名为数据集名称后加提取的数量,如从facebook数据集中提取10万条数据,记为facebook10w. 4组数据集为各取近30万条数据组成的子集,其相应数据特征总结在表2中,其中,子集{x}'= \{{x}_{1}',{x}_{2}',… ,{x}_{n'}'\},子集大小即\left|{x}'\right|={n}'为数据子集元素总数,A\left({x}'\right)=A\left({\bigcup }_{i=1}^{{n}'}{x}_{i}'\right)=\{{a}_{1}',{a}_{2}',… ,{a}_{m'}^{{'}}\}表示数据集所有元素属性合集,X({a}_{i}')表示拥有属性{a}_{i}'的元素,\underset{1\le i\le {m}'}{\mathrm{max}} (|X ({a}_{i}')|)表示拥有该属性的元素的最大个数,\underset{1\le i\le {m}'}{\mathit{avg}}(\left|X({a}_{i}')\right|)表示所有属性元素的平均个数,\underset{1\le i\le {n}'}{\mathrm{max}}\left(\right|A({x}_{i}')\left|\right)表示元素拥有属性的最大个数,\underset{1\le i\le {n}'}{\mathit{avg}}\left(\right|A({x}_{i}')\left|\right)表示元素拥有属性的平均个数,\underset{1\le i\le {n'}}{\mathit{dev}}\left(\right|A({x}_{i}')\left|\right)表示元素拥有属性个数的方差. 每次计算都将运行3次,采用平均运行时间、内存占用率峰值和磁盘使用量用于展示实验结果和分析.

    表  2  实验数据集特征
    Table  2.  Characteristics of Experimental Datasets
    数据集|{x}'||(A{x}')|\underset{1\le i\le {m}' }{\mathrm{max} }\left(\right|X({a}_{i}')\left|\right)\underset{1\le i\le {m}' }{\mathit{avg} }\left(\right|X({a}_{i}')\left|\right)\underset{1\le i\le {n}' }{\mathrm{max} }\left(\right|A({x}_{i}')\left|\right)\underset{1\le i\le {n}' }{\mathit{avg} }\left(\right|A({x}_{i}')\left|\right)\underset{1\le i\le {n}'}{\mathit{dev} }\left(\right|A({x}_{i}')\left|\right)
    facebook30w29747413604253963428.877419.6591
    kosarak30w3000003197618210776.024988.1556
    Enron30w30000079116523911953.43162140.834588
    accidents30w30000045829996922131.35133.79.2
    下载: 导出CSV 
    | 显示表格

    本文分别实现FP-SJ, PPC-SJ, LP-SJ, TELP-SJ这4种基于 FP-tree及其派生结构的集合相似度自连接算法,并将这些算法分别运行在facebook30w, kosarak30w, Enron30w, accidents30w这4组数据上,阈值t的取值范围为0.6\sim 0.9. 基于FP-tree*-SJ的集合相似度自连接计算没有产生中间结果,最后输出结果是一样的,因此这4种算法的磁盘使用量没有差异. 这4组算法的区别在于树结构的差异及因此带来的建树和遍历树流程的差异,我们将比较这4种算法的运行时间和内存占用率峰值.

    1) 运行时间

    根据第1节的描述,基于FP-tree*的集合相似度计算的第1步是转置数据集. 数据子集{x}'转置后的数据集{x}''的大小\left|{x}''\right|{x}'所有元素属性合集大小\left|A\right({x}'\left)\right|,即\left|{x}''\right|=\left|A\right({x}'\left)\right|. FP-SJ, LP-SJ, TELP-SJ等算法的计算复杂度即树遍历的复杂度O\left(T\right)=\left|A({x}')\right|\times \underset{1\le i\le {m}'}{\mathrm{max}}\left(\right|X({a}_{i}')\left|\right)\times \underset{1\le i\le {n}'}{\mathrm{max}}\left(\right|A({x}_{i}')\left|\right). 而对 PPC-SJ来说,基于构建好N-lists的集合相似度自连接计算是对任意2个N-lists的比较,其计算复杂度O\left({N}_{\mathrm{l}\mathrm{i}\mathrm{s}\mathrm{t}\mathrm{s}}\right)=\left|{x}'\right|\times {\left|A({x}')\right|}^{2}.

    图5展示4种FP-tree*-SJ算法的运行时间随着阈值t提高的变化,我们可以看到在facebook30w, Enron30w, kosarak30w这3组数据集上FP-SJ, LP-SJ, TELP-SJ的运行时间比PPC-SJ的运行时间少很多. 如表2所示,这3组数据的\left|A(x')\right|很大,说明原数据子集元素属性合集很大,即是高维大数据. 该实验数据说明这3种算法比PPC-SJ更适合处理高维大规模集合相似度自连接计算,其中TELP-SJ的运行时间最少.

    图  5  FP-tree*-SJ的运行时间与阈值关系
    Figure  5.  Relationship between FP-tree*-SJ’s running time and the threshold

    在accidents30w数据集上PPC-SJ的运行效率最好,其次是TELP-SJ, 最差是FP-SJ. accidents30w 的\left|A({x}')\right|= 458,而其他3组的\underset{1\le i\le {m}'}{\mathrm{max}}\left(\right|X({a}_{i}')\left|\right)\left|A({x}')\right|都很大,所以PPC-SJ的运行效率最好. 该实验数据说明PPC-SJ比其他3种算法适合处理低维大规模集合相似度自连接计算. 此种情况下,TELP-SJ比FP-SJ, LP-SJ的运行效率也要高.

    表3展示了阈值t = 0.6时4种FP-tree*-SJ算法处理Enron30w数据集时各分步的运行时间,包括建树时间、遍历树时间、总耗时. 表4展示了TELP- SJ与其他3种算法的相对性能提升率. 由表3表4可见,4种算法遍历树的时间在总耗时中占比较高,而TELP-SJ和LP-SJ的遍历时间少于FP-SJ和PPC-SJ,这与第1节的分析一致. 其中,TELP-SJ的遍历时间最少,相比于FP-SJ和PPC-SJ性能分别提高了32%和83%. 同时,我们也看到,TELP-SJ的建树时间和遍历树时间都比LP-SJ少,其中建树时间性能提高了45%,遍历时间性能提高了17%,这也与第1节的分析一致. 随着阈值t的增大,因为大部分数据在第1阶段过滤中被过滤掉,候选集规模小,建树和遍历树的代价差异减小,相应地TELP-SJ与FP-SJ和 LP-SJ 的运行时间差异减小.

    表  3  FP-tree*-SJ处理Enron30w数据集的细分运行时间
    Table  3.  Detailed Execution Time of Enron30w Dataset handled by FP-tree*-SJ s
    耗时FP-SJPPC-SJLP-SJTELP-SJ
    建树时间393517895488
    遍历树时间2087823917041419
    总耗时2496877226161923
    下载: 导出CSV 
    | 显示表格
    表  4  TELP-SJ相对于其他FP-tree*-SJ的性能提升
    Table  4.  Relative Performance Improvement of TELP-SJ Compared with Other FP-tree*-SJ %
    相对性能提升FP-SJPPC-SJLP-SJ
    建树时间−24645
    遍历树时间328317
    总耗时237826
    下载: 导出CSV 
    | 显示表格

    我们以Enron数据集为例,阈值t=0.6,从5万条数据起,每次每组增加5万条,共6组数据,分别运行4种算法以观察它们的运行时间与数据子集大小的关系. 如图6所示,随着数据子集大小的增加,TELP-SJ的运行时间增长速度低于另外3种算法,可扩展性最好.

    图  6  FP-tree*-SJ的运行时间与Enron数据子集大小的关系
    Figure  6.  Relationship between FP-tree*-SJ’s running time and the size of Enron’s sub-datasets

    2) 内存占用峰值

    图7展示了阙值t = 0.6时4种算法运行期的内存占用率. 由图7(a)(b)可见,4种FP-tree*-SJ算法运行期在facebook30w和kosarak30w数据子集上的内存占用率峰值相近,图7(c)(d)则显示在Enron30w和acciden30w数据集上,FP-SJ的内存占用率峰值最高,PPC-SJ相对较低和TELP-SJ最低,这说明TELP-SJ使用数组存储了更多的元素,具有较好的压缩比,而PPC-tree因为使用N-lists进行计算,不需要建立相同元素结点间的索引链,减少了内存开销.

    图  7  FP-tree*-SJ的内存占用率(t = 0.6)
    Figure  7.  Memory usage of FP-tree*-SJ (t = 0.6)

    本节我们以TELP-tree为例,以FastTELP-SJ相对TELP-SJ的运行时间加速比及内存占用峰值评估MapReduce对基于FP-tree*的集合相似度自连接算法的加速效果.

    实验将FastTELP-SJ和TELP-SJ分别运行在4个数据集的子集上,图8描绘了2种算法的相对加速比. 其中数据子集大小始于5万条,每次每组增加5万条,共6组数据,阈值t分别设置为0.6和0.9. 由图8可见,当阈值t = 0.6时,随着数据子集大小的增加,相对加速比加大. FastTELP-SJ相对于TELP-SJ的相对加速比在accidents数据子集上高达10,且在facebook和Enron数据子集上相对加速比的增长近似于线性. 当阈值t = 0.9时,当数据子集大小等于3万条时,相对加速比在Enron和accidents数据子集上分别约为2和7,可见采用并行分布式计算框架MapReduce可加速基于FP-tree*的集合相似度自连接计算.

    图  8  FastTELP-SJ与TELP-SJ的相对加速比
    Figure  8.  Relative speedup of FastTELP-SJ and TELP-SJ

    当数据子集比较小时,如图8中数据集大小小于15万条时,FastTELP-SJ和TELP-SJ算法的相对加速比在facebook, kosarak, Enron等数据子集上都小于1. 同时,在所有kosarak数据子集上的相对加速比增长都缓慢,且小于1.5. 这是因为该数据集的\left|A({x}')\right|\underset{1\le i\le {m}'}{\mathrm{max}}\left(\right|X({a}_{i}')\left|\right)偏低,如图9所示,转置后数据子集的规模和维度都不大,相当于小数据集. 同理,当阈值t = 0.9时,大部分数据在第1阶段过滤中被过滤掉,规模减小后的候选集变成了小数据集,因此,2种算法的相对加速比在facebook和kosarak数据子集中都小于1. 这是因为基于并行分布式计算框架MapReduce的计算有额外的运行期开销,包括数据划分、合并、重新分配、排序等,当数据集比较小时,额外地运行其开销抵消甚至超过降低切分数据并行计算带来的提升. 此时,TELP-SJ比FastTELP-SJ的运行效率高.

    图  9  FastTELP-SJ和TELP-SJ的相对加速比与阈值的关系
    Figure  9.  Relationship between relative speedups of FastTELP-SJ and TELP-SJ, and the threshold

    另外,图9描绘了2种算法的相对加速比与阈值t的关系. 数据子集大小均为30万条,阈值t设置为 0.6\sim0.9 . 从图9可以看出FastTELP-SJ和TELP-SJ的相对加速比在4个数据集上都大于1,且随着阈值的减小,相对加速比在不断增大. 这是因为在阈值减小时,第1阶段过滤后得到的候选集规模变大,需要进行两两交集大小计算的集合对个数增多,利用并行分布式计算框架MapReduce的FastTELP-SJ能使用更多计算资源完成计算,因而减小计算耗时.

    图10描绘的是阙值 t=0.6 时FastTELP-SJ和TELP-SJ在4个数据子集上的运行期内存占用率,从图10可见,除了在enron30w数据子集上两者的内存占用率峰值基本相等外,在其他3个子集上FastTELP-SJ的内存占用率峰值接近于TELP-SJ的 1/2 ,即采用并行分布式计算框架MapReduce可减少单个节点的内存负载.

    图  10  FastTELP-SJ与TELP-SJ的内存占用率(t = 0.6)
    Figure  10.  Memory usage of FastTELP-SJ and TELP-SJ (t = 0.6)

    从3.1节和3.2节的实验结果可见,FastTELP-SJ在处理大规模集合相似度自连接计算时相较于基于其他FP-tree*-SJ算法运行效率最高. RP-PPJoin和FS-Join是基于MapReduce的集合相似度自连接算法的代表. 另外,最近提出的位图过滤[12]在单机和GPU系统上运行均展现了它的有效性. 在本节,为了更全面地评估FastTELP-SJ的性能,本文同时设计并实现基于位图过滤策略的RP-PPJoin,记为RP-PPJoin + Bitmap. 我们将通过FastTELP-SJ与RP-PPJoin, RP-PPJoin + Bitmap, FS-Join这4种算法的比较实验评估FastTELP-SJ的性能.

    1) 运行时间

    首先将这4种算法运行在facebookb30w, kosarak30w, Enron30w, accidents30w这4组数据集上. 阈值 t 的取值范围为 0.6\sim 0.9 . 图11展示4种算法随着阈值t的提高运行时间的变化,可以看到通过使用位图过滤,RP-PPJoin + Bitmap在facebookb30w, kosarak30w, Enron30w上的运行效率都得到提高. 而FastTELP-SJ 的运行时间在这3个数据集上都优于其他3种算法,尤其在阈值t<0.7时运行时间明显降低很多. 这主要是TELP-SJ将数据压缩在内存中进行计算,减少了I/O次数,减小了候选集和降低了计算复杂度. 而此时RP-PPJoin, RP-PPJoin + Bitmap, FS-join算法产生较大候选集,其 O\left(k{n}^{2}\right) 的高复杂度验证计算延长了运行时间. 尤其对accidents30w,当 t\le 0.85 时,FS-Join无法在当前计算环境中完成计算,当 t < 0.7 时,RP-PPJoin和RP-PPJoin+Bitmap的运行时间大幅度升高,而FastTELP-SJ的运行时间增长不多,运行效率最高.

    图  11  FastTELP-SJ和RP-PPJoin, RP-PPJoin+Bitmap, FS-Join的运行时间与阈值的关系
    Figure  11.  Relationship between running time of FastTELP-SJ, RP-PPJoin, RP-PPJoin+Bitmap and FS-Join, and the threshold

    图12描绘了这4种算法的运行时间与数据子集大小的关系,以accidents数据集为例,阈值t分别设置为0.6和0.9. 其中,0.6代表了低阈值情况,而0.9代表了较高阈值的情况. 数据子集大小始于5万条、每次每组增加5万条,取6组数据,分别运行这4种算法并观察它们的运行时间与数据子集大小的关系. 如图12(a)所示,当 t=0.6 时,FastTELP- SJ的运行时间低于另外3种算法,且其运行时间随数据增长呈线性增长,可扩展性优于另外3种算法. 当 t=0.9 时,高阈值下各算法应用过滤策略过滤了大量相似度低于阈值的候选集合对. 此时,FastTELP-SJ的运行期开销如建树时间等导致它的总运行时间高于RP-PPJoin和RP-PPJoin + Bitmap,但仍然低于FS-Join,如图12(b)所示,这个结果也与图10 t 值较大时的结果一致.

    图  12  FastTELP-SJ, RP-PPJoin, RP-PPJoin + Bitmap, FS-Join的运行时间与accidents数据子集大小的关系
    Figure  12.  Relationship between running time of FastTELP-SJ, RP-PPJoin, RP-PPJoin+Bitmap and FS-Join, and the size of accidents’ sub-datasets

    最后,我们评估这4种算法的运行时间与集群规模的关系,其中,集群规模为集群节点个数. 实验以facebook30w数据集为例,阈值t设置为0.6,集群规模起始计算节点为2,依次增加2个直至16个,分别运行4种算法并观察它们的运行时间与集群规模的关系. 图13描绘了实验结果,随着集群节点个数的增加,相比于RP-PPJoin, RP-PPJoin+Bitmap, FSJoin和FastTELP-SJ运行时间的变化速率下降得更慢. 这说明相较于其他3种算法,FastTELP-SJ的扩展性最好.

    图  13  FastTELP-SJ, RP-PPJoin, RP-PPJoin + Bitmap, FS-Join的运行时间与集群规模的关系
    Figure  13.  Relationship between running time of FastTELP-SJ, RP-PPJoin, RP-PPJoin+Bitmap and FS-Join, and the cluster’s size

    2) 内存占用率

    图14描绘了4种算法在facebookb30w, kosarak30w, Enron30w, accidents30w这4组数据子集进行集合相似度自连接计算过程中的内存占用率,其中,FastTELP-SJ在处理kosarak30w和Enron30w时内存占用率峰值分别是其他3种算法的2~3倍,因为TELP-tree在其任务2的函数reduce运行过程中常驻内存,这跟第1, 2节的分析一致. 但RP-PPJoin和FS-Join的候选集大,也有可能出现内存占用率高的情况,如图14(a)(d). 同时RP-PPJoin+Bitmap的内存占用率峰值始终最大,这是因为该算法需要为每个集合构造相应的位图并保存在内存中进行计算.

    图  14  4种算法的内存占用率(t = 0.6)
    Figure  14.  Memory usage of four algorithms (t = 0.6)

    3) 磁盘使用量

    图15描绘了4种算法在facebookb30w,kosarak30w,Enron30w,accidents30w这4组数据子集上进行集合相似度自连接计算过程中的磁盘使用量. 当阈值t = 0.6时,FastTELP-SJ在处理facebook30w,kosarak30w,accidents30w这3个数据子集时的磁盘读写量最低,因为它的验证计算都在内存中完成,减少了I/O,此结论与第1, 2节的分析和3.3.1节运行时间相关的实验结果分析相一致. 尤其是RP-PPJoin和RP-PPJoin+Bitmap,因它们可能产生重复验证的冗余候选集,磁盘使用量最大,见图15(c)(d). 而当阙值 t 增大时,如 t=0.9 时,由于过滤策略的应用,大量数据被过滤,各个算法的磁盘使用量都降低,差别也减少.

    图  15  4种算法的磁盘使用量
    Figure  15.  Disk usage amount of four algorithms

    基于3.1~3.3节的实验结果比较,当阈值t比较高时,如在我们的实验环境和数据下, t > 0.8 时, 4种算法的执行性能差别不大. 当阈值t比较低时,我们有4点实验结论:

    1) 高维大规模集合相似度自连接计算中TELP-SJ的运行效率最好且具有较好的可扩展性.

    2) 低维大规模集合相似度自连接计算中PPC-SJ的运行效率最好.

    3) 高维大规模集合相似度自连接计算中基于并行分布式计算模型MapReduce和TELP-tree设计的算法FastTELP-SJ相对于TELP-SJ有较好的加速比.

    4) 大规模集合相似度自连接计算中FastTELP-SJ的运行效率优于现有基于MapReduce的3类算法RP-PPJoin, RP-PPJoin + Bitmap, FS-Join.

    数据的增长、集合规模的加大给现有集合相似度自连接算法带来挑战. 基于MapReduce的并行分布式集合相似度自连接加速了计算,但当阈值较低时现有算法生成了较大规模的候选集,执行效率依然不理想.

    为此,本文提出并设计采用频繁模式树及其派生结构FP-tree*加速集合相似度自连接算法:1)设计面向基于FP-tree*的集合相似度自连接算法及加速其计算的2阶段过滤规则,减小FP-tree*的规模并提高树遍历效率;2)提出并构建面向集合相似度自连接的遍历效率更高的FP-tree派生结构-线性频繁模式树结构TELP-tree及基于其的算法TELP-SJ;3)设计基于MapReduce和TELP-tree的集合相似度自连接算法FastTELP-SJ. 基于4组真实应用数据集,通过3组比较实验从运行时间、内存占用率、磁盘使用量等方面进行对比实验来评估FastTELP-SJ的性能,实验结果展现了FastTELP-SJ较好运行性能和可扩展性.

    FastTELP-SJ算法将数据压缩在内存中进行计算,带来构建树和销毁树等运行期内存管理开销,同时,FastTELP-SJ算法包含2次MapReduce任务,带来运行期流程管理开销. 经调研,文献[39-40]设计了一种基于生命周期的内存管理框架Deca,通过自动分析用户定义的函数和数据结构,预测其生命周期. 基于该预测分配和释放空间可提高系统垃圾回收效率,进而提高内存使用率. 另外,文献[41-42]提出了一种面向流数据和迭代任务流程管理降低能耗的资源共享框架F3C. 我们将进一步研究如何结合有效的内存管理、流程管理框架构建绿色高效的集合相似度连接计算.

    作者贡献声明:冯禹洪发现问题、定义问题、提出算法思路和实验方案;吴坤汉、黄志鸿、冯洋洲负责完成算法设计、实现、性能评估;陈欢欢、白鉴聪、明仲优化算法和实验方案. 所有作者共同完善国内外研究现状调研、完成论文的撰写和修改.

  • 图  1   一个示例程序采用不同自动向量化方法进行处理的过程

    Figure  1.   Process of various auto-vectorization methods adopted by an example program

    图  2   基于shuffle指令的程序转换示例

    Figure  2.   An example of program transformation based on shuffle instruction

    图  3   扩展变换示例

    Figure  3.   An example of extended transform

    图  4   二元表达式替换示例

    Figure  4.   An example of replacement of binary expression

    图  5   SLP-M的处理流程

    Figure  5.   Process flow of SLP-M

    图  6   转换模式示例

    Figure  6.   An example of conversion pattern

    图  7   同构化转换选择方法示例

    Figure  7.   An example of isomorphism transform selection method

    图  8   不同方法在构造核心函数上的加速比

    Figure  8.   Speedup ratios of various methods on constructing kernel functions

    图  9   构造核心函数自动向量化方法减少的指令代价

    Figure  9.   Reduced instruction costs of auto-vectorization methods on constructing kernel functions

    图  10   不同方法在核心函数上的加速比

    Figure  10.   Speedup ratios of various methods on kernel functions

    图  11   不同操作数量的核心函数代码片段

    Figure  11.   Code fragments of the kernel function with different numbers with opcodes

    图  12   函数gl_render_vb代码片断生成的汇编指令

    Figure  12.   Assembly instructions generated by the code fragments of the function gl_render_vb

    图  13   不同操作类型的核心函数代码片段

    Figure  13.   Code fragments of the kernel function of different types of opcodes

    图  14   多种自动向量化方法对于函数box_UVCoord代码片断生成的汇编指令

    Figure  14.   Assembly instructions for the code fragments of the function box_UVCoord generated by various auto-vectorization methods

    图  15   函数intra16x16_plane_pred_mbaff代码片段

    Figure  15.   Code fragments of the function intra16x16_plane_pred_mbaff

    图  16   函数intra16x16_plane_pred代码片段

    Figure  16.   Code fragments of the function intra16x16_plane_pred

    图  17   多种自动向量化方法对于函数start_pass代码片断生成的汇编指令

    Figure  17.   Assembly instructions for the code fragments of the function start_pass generated by various auto-vectorization methods

    图  18   核心函数自动向量化方法减少的指令代价

    Figure  18.   Reduced instruction costs of auto-vectorization methods on kernel functions

    图  19   不同自动向量化方法在整体基准测试程序集上的加速比

    Figure  19.   Speedup ratios of various auto-vectorization methods on whole benchmarks

    表  1   X的扩展等价表达式

    Table  1   Equivalent Extended Expression of X

    序号X的扩展等价表达式依据的等价关系
    1X+0X+0 = X
    20+X0+X = X
    3X−0X−0 = X
    4X×1X×1 = X
    5XX = X
    6X/1X/1 = X
    7X<<0X<<0 = X
    8X>>0X>>0 = X
    下载: 导出CSV

    表  2   二元表达式替换模式列表

    Table  2   List of Patterns of Replacement for Binary Expressions

    原表达式二元替换等价表达式二元表达式替换的条件
    X+C1XC2C1C2是常数,且C1+C2=0
    X+XX×2
    XC1X+C2C1C2是常数,且C1+C2=0
    X×C1X<<C2C1C2是常数,C1是2的整数次幂,且C1={2^{C_2}}
    X×C1X+XC1是常数2
    X×C1X/C2C1C2是常数,且C1×C2=1
    X/C1X×C2C1C2是常数,C1×C2=1
    X>>C1X×C2C1C2是常数,且C2={2^{C_1}}
    下载: 导出CSV

    表  3   构造函数

    Table  3   Constructed Functions

    测试函数核心代码程序特征 测试函数核心代码程序特征
    s1a[0] =(b[0]+c[0])×5.0;
    a[1] = b[1]+c[1].
    操作个数不同,双精度浮点类型,2条语句 s9a[0] = b[0]/4.0;
    a[1] = b[1]×5.0;
    a[2] = b[2]×6.0;
    a[3] = b[3]×7.0.
    操作类型不同,单精度浮点类型,4条语句
    s2a[0] = b[0]/11.0;
    a[1] = b[1]×13.0.
    操作类型不同,双精度浮点类型,2条语句s10a[0] = b[0]+c[0];
    a[1] =(b[1]+c[1])×5.0;
    a[2] =(b[2]+c[2])/4.0;
    a[3] =(b[3]+c[3])×7.0.
    操作个数和类型不同,单精度浮点类型,4条语句
    s3a[0] = b[0]+11.0;
    a[1] = b[1]×13.0.
    操作类型不同,双精度浮点类型,2条语句s11a[0] = b[0]−4.0;
    a[1] = b[1]×5;
    a[2] = b[2]/4.0;
    a[3] = b[3]×7.
    操作类型不同,单精度浮点类型,4条语句
    s4a[0] = b[0];
    a[1] = b[1]×11;
    a[2] = b[2]×11;
    a[3] = b[3]×11.
    操作个数不同,整数类型,4条语句s12a[0] = b[0]+c[0];
    a[1] =(b[1]+c[1])×5.0;
    a[2] =(b[2]+c[2])×6.0;
    a[3] =(b[3]+c[3])×7.0.
    操作个数不同,双精度浮点类型,4条语句
    s5a[0] = b[0]<<2;
    a[1] = b[1]×5;
    a[2] = b[2]×6;
    a[3] = b[3]×7.
    操作类型不同,整数类型,4条语句s13a[0] = b[0]/4.0;
    a[1] = b[1]×5.0;
    a[2] = b[2]×6.0;
    a[3] = b[3]×7.0.
    操作类型不同,双精度浮点类型,4条语句
    s6a[0] = b[0];
    a[1] = b[1]×5;
    a[2] = b[2]<<2;
    a[3] = b[3]×7.
    操作个数和类型不同,整数类型,4条语句s14a[0] = b[0]+c[0];
    a[1] =(b[1]+c[1])×5.0;
    a[2] =(b[2]+c[2])/4.0;
    a[3] =(b[3]+c[3])×7.0.
    操作个数和类型不同,双精度浮点类型,4条语句
    s7a[0] = b[0]−4;
    a[1] = b[1]×5;
    a[2] = b[2]<<2;
    a[3] = b[3]×7.
    操作类型不同,整数类型,4条语句s15a[0] = b[0]−4.0;
    a[1] = b[1]×5;
    a[2] = b[2]/4.0;
    a[3] = b[3]×7.
    操作类型不同,双精度浮点类型,4条语句
    s8a[0] = b[0]+c[0];
    a[1] =(b[1]+c[1])×5.0;
    a[2] =(b[2]+c[2])×6.0;
    a[3] =(b[3]+c[3])×7.0.
    操作个数不同,单精度浮点类型,4条语句s16a[0] = b[0]−4.0;
    a[1] = 5×b[1];
    a[2] = b[2]/4.0;
    a[3] = b[3]×7.
    操作类型不同,双精度浮点类型,4条语句
    下载: 导出CSV

    表  4   核心函数描述

    Table  4   Description of the Kernel Functions

    序号函数描述类型语言
    1gl_render_vbOpenGL函数库 (SPEC CPU 2000 177)操作个数不同C
    2u2sPERL编程语言(SPEC CPU 2006 400)操作个数不同C
    3calc_pair_energy生物系统模拟(SPEC CPU 2006 444)操作个数不同C++
    4start_pass_fdctmgr图像压缩(MediaBench2 cjpeg)操作类型不同C
    5ssim_end1x264编解码(SPEC CPU 2017 625)操作类型不同C
    6box_UVCoord影像光线追踪(SPEC CPU 2006 453)操作类型不同C++
    7intra16x16_plane_pred_mbaffx264编解码(SPEC CPU 2017 625)操作个数和类型不同C
    8intra16x16_plane_predx264编解码(SPEC CPU 2017 625)操作个数和类型不同C
    9start_pass图像压缩(MediaBench2 cjpeg)操作个数和类型不同C
    下载: 导出CSV
  • [1] 高伟,赵荣彩,韩林,等. SIMD自动向量化编译优化概述[J]. 软件学报,2015,26(6):1265−1284 doi: 10.13328/j.cnki.jos.004811

    Gao Wei, Zhao Rongcai, Han Lin, et al. Research on SIMD auto-vectorization compiling optimization[J]. Journal of Software, 2015, 26(6): 1265−1284 (in Chinese) doi: 10.13328/j.cnki.jos.004811

    [2]

    Maleki S, Gao Yaoqing, Garzar M J, et al. An evaluation of vectorizing compilers[C] //Proc of the 20th IEEE Parallel Architectures and Compilation Techniques. Piscataway, NJ: IEEE, 2011: 372−382

    [3] 冯竞舸,贺也平,陶秋铭. 自动向量化:近期进展与展望[J]. 通信学报,2022,43(3):180−195 doi: 10.11959/j.issn.1000-436x.2022051

    Feng Jingge, He Yeping, Tao Qiuming. Auto-vectorization: Recent development and prospect[J]. Journal on Communications, 2022, 43(3): 180−195 (in Chinese) doi: 10.11959/j.issn.1000-436x.2022051

    [4]

    Kennedy K, Allen J R. Optimizing Compilers for Modern Architectures: A Dependence-based Approach [M]. San Francisco, CA: Morgan Kaufmann, 2001

    [5]

    Larsen S, Amarasinghe S. Exploiting superword level parallelism with multimedia instruction sets[J]. Programming Language Design and Implementation, 2000, 35(5): 145−156

    [6] 李玉祥,施慧,陈莉. 面向向量化的局部数据重组[J]. 小型微型计算机系统,2009,30(8):1528−1534

    Li Yuxiang, Shi Hui, Chen Li. Vectorization-oriented local data regrouping[J]. Computer System, 2009, 30(8): 1528−1534 (in Chinese)

    [7]

    Porpodas V, Magni A, Jones T M. PSLP: Padded SLP automatic vectorization[C] //Proc of the 13th IEEE Code Generation and Optimization. Piscataway, NJ: IEEE, 2015: 190−201

    [8]

    Porpodas V, Rocha R C O, Góes L F W. Look-ahead SLP: Auto-vectorization in the presence of commutative operations[C] //Proc of the 16th ACM Code Generation and Optimization. New York: ACM, 2018: 163−174

    [9]

    Porpodas V, Rocha R C O, Brevnov E, et al. Super-Node SLP: Optimized vectorization for code sequences containing operators and their inverse elements[C] //Proc of the 17th ACM Code Generation and Optimization. New York: ACM, 2019: 206−216

    [10]

    Feng Jingge, He Yeping, Tao Qiuming, et al. An SLP vectorization method based on equivalent extended transformation[J/OL]. Wireless Communications and Mobile Computing, 2022[2022-04-20].https://downloads.hindawi.com/journals/wcmc/2022/1832522.pdf

    [11]

    Porpodas V, Ratnalikar P. PostSLP: Cross-region vectorization of fully or partially vectorized code[C] //Proc of the 32nd ACM Workshop on Languages and Compilers for Parallel Computing. New York: ACM, 2019: 15−31

    [12]

    Rocha R C O, Porpodas V, Petoumenos P, et al. Vectorization-aware loop unrolling with seed forwarding[C/OL] //Proc of the 29th ACM Int Conf on Compiler Construction. New York: ACM, 2020[2022-04-23].https://rcor.me/papers/cc20valu.pdf

    [13] 魏帅,赵荣彩,姚远. 面向SLP的多重循环向量化[J]. 软件学报,2012,23(7):1717−1728 doi: 10.3724/SP.J.1001.2012.04106

    Wei Shuai, Zhao Rongcai, Yao Yuan. Loop-nest auto-vectorization based on SLP[J]. Journal of Software, 2012, 23(7): 1717−1728 (in Chinese) doi: 10.3724/SP.J.1001.2012.04106

    [14] 高伟,韩林,赵荣彩,等. 向量并行度指导的循环SIMD向量化方法[J]. 软件学报,2017,28(4):925−939 doi: 10.13328/j.cnki.jos.005029

    Gao Wei, Han Lin, Zhao Rongcai, et al. Vectorization method for loops guided by SIMD parallelism[J]. Journal of Software, 2017, 28(4): 925−939 (in Chinese) doi: 10.13328/j.cnki.jos.005029

    [15] 赵捷,赵荣彩. 基于有向图可达性的SLP向量化识别方法[J]. 中国科学:信息科学,2017,47(3):310−325 doi: 10.1360/N112016-00146

    Zhao Jie, Zhao Rongcai. Identifying superword level parallelism with directed graph reachability[J]. SCIENTIA SINICA Informationis, 2017, 47(3): 310−325 (in Chinese) doi: 10.1360/N112016-00146

    [16]

    Shin J, Hall M, Chame J. Superword-level parallelism in the presence of control flow[C] //Proc of the 3rd IEEE Code Generation and Optimization. Piscataway, NJ: IEEE, 2005: 165−175

    [17]

    Chen Y, Mendis C, Amarasinghe S. All you need is superword-level parallelism: Systematic control-flow vectorization with SLP [C] //Proc of the 43rd ACM SIGPLAN Int Conf on Programming Language Design and Implementation. New York: ACM, 2022: 301−315

    [18]

    Huh J, Tuck J. Improving the effectiveness of searching for isomorphic chains in superword level parallelism[C] //Proc of the 50th ACM Int Symp on Microarchitecture. New York: ACM, 2017: 718−729

    [19]

    Liu Jun, Zhang Yuanrui, Jang O, et al. A compiler framework for extracting superword level parallelism[C] //Proc of the 33rd ACM Programming Language Design and Implementation. New York: ACM, 2012: 347−358

    [20]

    Mendis C, Amarasinghe S. GoSLP: Globally optimized superword level parallelism framework[C/OL] //Proc of the 30th ACM Object Oriented Programming Systems Languages and Applications. New York: ACM, 2018[2022-03-12].https://dl.acm.org/doi/pdf/10.1145/3276480

    [21] 吕鹏伟,刘从新,赵一明,等. 基于动态规划的自动向量化方法[J]. 北京理工大学学报,2017,37(5):544−550 doi: 10.15918/j.tbit1001-0645.2017.05.020

    Lü Pengwei, Liu Congxin, Zhao Yiming, et al. Auto-vectorization method based on dynamic programming[J]. Transactions of Beijing Institute of Technology, 2017, 37(5): 544−550 (in Chinese) doi: 10.15918/j.tbit1001-0645.2017.05.020

    [22]

    Porpodas V, Jones T M. Throttling automatic vectorization: When less is more[C] //Proc of the 24th IEEE Parallel Architecture and Compilation. Piscataway, NJ: IEEE, 2015: 432−444

    [23]

    Porpodas V, Rocha R C O, Góes L F W. VW-SLP: Auto-vectorization with adaptive vector width[C/OL] //Proc of the 28th IEEE Parallel Architectures and Compilation Techniques. Piscataway, NJ: IEEE, 2018[2022-03-11]. http://vporpo.me/papers/vwslp_pact2018.pdf

    [24] 赵博,赵荣彩,李雁冰,等. 类型转换语句的SLP发掘方法[J]. 计算机科学,2014,41(11):16−21 doi: 10.11896/j.issn.1002-137X.2014.11.004

    Zhao Bo, Zhao Rongcai, Li Yanbing, et al. SLP exploitation method for type conversion statements[J]. Computer Science, 2014, 41(11): 16−21 (in Chinese) doi: 10.11896/j.issn.1002-137X.2014.11.004

    [25]

    Liu Yuping, Hong Dingyong, Wu Janjan, et al. Exploiting SIMD asymmetry in ARM-to-x86 dynamic binary translation [J/OL]. Transactions on Architecture and Code Optimization, 2019[2022-02-13].https://dl.acm.org/doi/pdf/10.1145/3301488

    [26]

    Mendis C, Jain A, Jain P, et al. Revec: Program rejuvenation through revectorization[C]//Proc of the 28th ACM Int Conf on Compiler Construction. New York: ACM, 2019: 29−41

    [27]

    Chen Yishen, Mendis C, Carbin M, et al. VeGen: A vectorizer generator for SIMD and beyond[C] //Proc of the 26th ACM Int Conf on Architectural Support for Programming Languages and Operating Systems. New York: ACM, 2021: 902−914

    [28]

    Fritts J E, Steiling F W, Tucek J A, et al. MediaBench II video: Expediting the next generation of video systems research[J]. Microprocessors and Microsystems, 2009, 33(4): 301−318 doi: 10.1016/j.micpro.2009.02.010

    [29]

    Jia Zhihao, Padon O, Thomas J, et al. TASO: Optimizing deep learning computation with automatic generation of graph substitutions [C] //Proc of the 27th ACM Symp on Operating Systems Principles. New York: ACM, 2019: 47−62

    [30]

    Willsey M, Nandi C, Wang Y R, et al. Egg: Fast and extensible equality saturation[C/OL] //Proc of the 48th ACM SIGPLAN Symp on Principles of Programming. New York: ACM, 2021[2022-03-12].https://dl.acm.org/doi/pdf/10.1145/3434304

    [31]

    Lattner C, Adve V. The LLVM compiler framework and infrastructure tutorial[C] //Proc of the 17th Int Workshop on Languages and Compilers for Parallel Computing. Berlin: Springer, 2004: 15−16

    [32] 纪守领,李进锋,杜天宇,等. 机器学习模型可解释性方法、应用与安全研究综述[J]. 计算机研究与发展,2019,56(10):2071−2096 doi: 10.7544/issn1000-1239.2019.20190540

    Ji Shouling, Li Jinfeng, Du Tianyu, et al. Survey on techniques, applications and security of machine learning interpretability[J]. Journal of Computer Research and Development, 2019, 56(10): 2071−2096 (in Chinese) doi: 10.7544/issn1000-1239.2019.20190540

图(19)  /  表(4)
计量
  • 文章访问数:  137
  • HTML全文浏览量:  36
  • PDF下载量:  54
  • 被引次数: 0
出版历程
  • 收稿日期:  2022-05-22
  • 修回日期:  2023-02-08
  • 网络出版日期:  2023-09-19
  • 刊出日期:  2023-11-30

目录

/

返回文章
返回