标准论文网致力于提供经济、法律、医学、管理、体育、教育等论文范文。
加入收藏 联系我们 信誉保证 网站地图
标准论文网创建10周年
站内搜索:
热门:
您当前的位置:> 计算机软件论文 > 论文内容

基于RISC体系结构的2种高性能SIMD非对齐访存结构

加入收藏〗 发布时间:2017-06-08

  摘 要: 单指令流多数据流( SIMD) 是实现数据级并行的有效方法,但访问地址非对齐的数据严重影响程序的向量化,造成处理器性能下降。为降低非对齐访存延时,对高性能应用程序的访存结构进行建模,设计并实现 SIMD分离缓冲行非对齐访存结构与双体 cache 非对齐访存结构。实验结果表明,在双体 cache 非对齐访存结构下,通过两数组相加与 SIMD 向量化实现的非对齐访存代码可达到对齐访存代码性能的 99%,提高了 SIMD 向量化的访存效率。

  关键词: 高性能计算; 数据级并行; 向量化; 单指令流多数据流扩展; 非对齐访存; Gem5 模拟器

  1、概述

  单指令流多数据流( Single Instruction MultipleData,SIMD) 处理器体系结构不仅硬件结构简单,而且能高效执行包括大量数据级并行 ( Data LevelParallelism,DLP) 的应用程序。这些 SIMD 扩展通过增加一系列 SIMD 指令来最大程度地利用程序中的DLP。在这些 SIMD 扩展中的访存指令能够一次加载或存储多个数据项。为了提供最佳性能,访存地址最好是自然对齐。若向量数据在存储器中是对齐的,则 SIMD 处理器能够使用单条指令来完成一组数据的加载和存储操作,然而数据在存储器中并非都是对齐存放的。当访存地址不在对齐的边界上时,则需要进行额外的移位和合并操作,才能得到满足要求的向量数据。非对齐访存结构不仅增加了额外的访存操作,而且增加了特殊的操作( 例如移位和合并操作等) ,才能得到满足 SIMD 运算部件要求的向量数据。

  然而,大多数 SIMD 架构的访存结构都有一定的限制,仅支持访问存储器中的连续数据,并且对于访存地址还有较强的对齐限制。这些体系结构要么不提供非对齐访存的硬件支持,要么以很大的性能损失为代价来支持非对齐访存。例如,AltiVec扩展[1]能够对不是自然对齐的数据进行操作,一条加载指令从存储器 16 Byte 对齐的位置加载16 Byte的连续数据。为了支持访存指令,硬件必须忽略访存地址中的低 4 bit 地址,而一些多媒体处理器提供非对齐访存指令,但会以很大的性能损失为代价,例如 Intel 的 SSE 扩展[2],包括硬件支持和非对齐异常。movdqu 和 movups 指令可以直接返回非对齐访存的数据。另外,非对齐访存在高性能应用程序中普遍存在且占有很大的比例。例如,在128 bit SIMD处理器上测试高性能测试集 SPLASH-2[3]中的部分测试程序,结果表明,在该测试集中有 30% 的 SIMD访存操作是非对齐的。因此,设计一种高性能的非对齐访存硬件结构对于提高处理器性能十分重要。

  本文基于高性能计算应用程序 SPLASH-2 访存结构的建模结果,在当前 SIMD 体系结构中为非对齐访存实现硬件支持,并基于 RISC 体系结构,设计2 种高性能非对齐访存结构。

  2、SIMD 非对齐访存解决方案

  如果访存地址 A % n = 0,n 是以字节为单位的访存数据的宽度,那么访存地址 A 就是对齐访存的地址,该访存为对齐访存; 否则为非对齐访存。当一个访存是非对齐访存时,A % n 的值决定了相对于对齐访存地址的偏移量。数组的起始地址是对齐的,下述2 段代码分别说明了对齐和非对齐访存的循环。

  大多数 SIMD 体系结构不支持非对齐访存,即使支持性能损失也较大。当访问一个非对齐地址的数据时,要进行一系列再对齐的操作:

  ( 1) 根据访存地址来加载位于访存地址前面的一部分对齐访存的数据,并通过移位操作将不必要的数据移除;( 2) 加载位于访存地址后的一部分对齐访存的数据,同样将多余的数据通过移位操作移除;( 3) 将以上 2 个步骤的数据进行合并得到非对齐访存所需要的向量数据。

  假设向量数据包括 4 个元素,每个元素大小为4 Byte,则一个非对齐向量数据加载的再对齐过程如图1 所示。

图 1 非对齐向量加载
图 1 非对齐向量加载

  非对齐访存数据需要通过移位和合并操作得到需要的向量数据。相关解决方案可以分为 2 类:

  ( 1) 基于软件的解决方案,即编译方法,执行一系列特殊的数据重对齐指令来实现向量数据的重组;( 2) 基于硬件的解决方案,包括通过硬件逻辑处理非对齐的加载/存储操作。

  基于软件的解决方案依赖于指令集架构( Instruc-tion Set Architecture,ISA) 中特殊指令来支持移位和合并操作。一些体系结构仅能访问存储器中对齐的数据。在这种情况下,若要支持访问存储器中非对齐地址数据的访存操作,编译器则要负责产生额外的开销指令来对齐数据,从而得到满足要求的数据。例 如,PowerPC[1]体 系 结 构 的 Altivec 扩 展、MIPS-3D[4]和 Alpha[5]体系结构都使用该解决方案。

  该方案若要产生一个非对齐访存所要求的数据,则需要执行 2 条对齐加载指令后,2 个目标向量寄存器通过移位和合并指令产生需要的数据,如图 2 所示。

图 2 基于软件的非对齐访存结构
图 2 基于软件的非对齐访存结构

  合并操作是根据再对齐标记[6]提供的特殊指令来合并 2 个向量寄存器低位和高位到第 3 个向量寄存器中。这个再对齐标记可能是一个掩码,也可能是非对齐地址( 比如在 MIPS-3D 和 Alpha 中) 或者通过特殊的指令( 比如在 Altivec 中是 LVSL 指令)产生。在软件解决方案中存在性能损失,并且最后的结果依赖很多因素,例如编译器/程序员正确调度指令来隐藏移位和合并操作的能力。文献[7]针对访存结构具有对齐限制的体系结构提出多种编译方法进行数据重组,例如零移位策略、激进移位策略、懒惰移位策略和主移位策略。若已知非对齐的编译信息,则上述策略在编译时有效,但只有零移位策略在运行时有效。文献[8]对此做了进一步扩展,使后3 种移位策略都能在运行时发挥作用,并且使该技术能够用于长度转换操作,例如数据类型转换。文献[9]详细讨论了访存对齐问题,通过循环剥离技术尽量避免使用非对齐访存指令来最大化循环中的对齐访存数目。文献[10]对比了循环展开、循环剥离和多维数组填充等技术对非对齐访存所起的作用。文献[11]提出面向非多媒体程序的 SIMD 向量化算法,然而向量化编译器没有对这些 SIMD 扩展指令提供很好的支持。因此,编程人员在编程时要考虑数据对齐问题,通过更底层的汇编语言或者编译器生产商提供的内嵌指令来使用 SIMD 扩展指令。这对编程人员和向量化编译器设计人员提出了很大挑战。

  基于硬件的解决方案通常在体系结构的访存层进行实现,并且加入了处理非对齐访存的重新对齐网络,如图 3 所示。重新对齐网络被置于加载/存储执行单元和 L1-D cache 之间。当出现一个非对齐访存操作时,额外的访存操作被触发产生非对齐访存需要的向量数据。在 SSE3 扩展中使用类似的硬件支持,它提供 LDDQU( Load Unaligned Integer 128 bit) 指令来处理一个32 Byte 的加载操作并从非对齐数据中提取16 Byte 相应的数据。

图 3 基于硬件的非对齐访存过程与结构
图 3 基于硬件的非对齐访存过程与结构

  3、SIMD 非对齐访存结构的实现

  为有效支持 SIMD 非对齐访存并得到一个满足计算部件要求的向量数据,需要设计重新对齐网络。重新对齐网络位于 L1-D cache 和向量寄存器之间,由选择和移位单元组成,如图 4 所示。对齐的向量数据放置在一个 cache 行中,但是非对齐的向量数据有可能跨 cache 行的边界。一种解决非对齐访存问题的硬件结构是分离缓冲行[12]非对齐访存结构。

  当向量数据跨越 2 个 cache 行时,需要执行以下步骤来获得非对齐数据: ( 1) 取得第 1 个 cache 行,暂存在分离缓冲块中; ( 2) 获取第 2 个 cache 行,并将这2 个cache 行合并产生满足要求的非对齐数据。虽然这个分离 cache 行缓冲不会改变很多已经存在的 cache 结构,但当遇到跨 cache 行时会增加延时周期。

图4 分离缓冲行非对齐访存结构
图4 分离缓冲行非对齐访存结构

  另外一种解决非对齐访存问题的硬件结构是双体 cache 非对齐访存结构[13-14],如图 5 所示,双体cache 由奇数和偶数体 cache 组成。

图 5 双体 cache 非对齐访存结构
图 5 双体 cache 非对齐访存结构

  如果访存的数据跨越 cache 行边界时,那么可以得到奇数体和偶数体的地址。地址中的奇数/偶数位表明第 1 个 cache 体存储了向量数据的前半部分,第 2 个 cache 体存储了向量数据的剩余部分。这2 个cache 体是并行访问的,2 个输出结果在合并单元进行合并得到向量数据。双体 cache 相对于单体cache 有如下优势: 当2 个cache 行数据同时访存时会出现 2 个 cache 行同时命中的情况。基于 RISC 体系结构,在该 ISA 中扩展了 SIMD访存指令功能,使得这些指令能够进行对齐访存和非对齐访存。为了测试 SIMD 非对齐访存结构的性能,使用基于事件驱动的全系统模拟器 Gem5[15]对这 2 种硬件结构进行实现,得到单精度浮点和双精度浮点数据类型数组相加的对齐和非对齐 2 种版本的测试程序。上述 2 段代码给出了单精度浮点类型数组相加的汇编伪代码,使用 SIMD 非对齐访存指令实现 2 个单精度浮点类型的数组相加。其中,对齐循环的 SIMD 实现具体如下: 首先分别从对齐的地址[b]和[c]加载 4 bit 大小的单精度浮点类型的数据到 128 bit 的向量寄存器 v1,v2; 然后对 v1,v2寄存器的数据进行向量浮点加法运算,将结果保存在向量寄存器 v3中; 最后将 v3寄存器中的数据存储到存储器对齐地址[a]中。非对齐循环的 SIMD 实现方式和对齐循环的 SIMD 实现方式类似,不同的是每次加载和存储数据的地址不是对齐的。

  本文分别对单精度和双精度浮点 2 种数据类型数组相加的对齐和非对齐版本的实现进行测试,并通过改变数组的大小来测试同一数据类型、不同大小数组相加的模拟时间。图 6 为双体 cache 非对齐访存结构下,单精度和双精度浮点数据类型数组相加的非对齐代码相对于对齐代码的性能测试结果。结果表明,两数组相加与 SIMD 向量化实现的非对齐访存版本可达到对齐访存版本性能的 99%,几乎没有性能损失。

图 6 非对齐代码相对于对齐代码的性能加速比
图 6 非对齐代码相对于对齐代码的性能加速比

  4、结束语

  本文设计了一种 SIMD 非对齐访存结构,能实现对 SIMD 非对齐访存指令的直接支持。实验结果表明,在 SIMD 非对齐结构下,通过 2 个数组相加与SIMD 向量化实现的非对齐访存版本的性能可达到对齐访存版本性能的 99%。下一步将使用更丰富的测试集对这 2 种非对齐访存结构进行性能测试,以提高向量访存的效率和灵活性。

    优秀论文范文分享:
    联系地址: 上海市杨浦区邯郸路(临复旦大学校区)邮编:200000 网站合法性备案号:蜀ICP备09029270号-1
    Copyright © 2002-2014 www.bzlunwen.com All Rights Reserved. 版权所有