首页> 中国专利> 一种基于申威平台的基础线性代数库BLAS三级函数GEMM的高性能实现方法

一种基于申威平台的基础线性代数库BLAS三级函数GEMM的高性能实现方法

摘要

本发明提出了一种基于申威平台的基础线性代数库BLAS三级函数GEMM的高性能实现方法,针对国产申威SW1600平台,采用“interface接口?driver驱动?kernel汇编核心代码”的三层代码设计框架,使用乘加指令、循环展开、软件流水线指令重排、SIMD向量化运算、寄存器分块技术等与平台架构相关的技术手段,实现汇编级手工优化,解决了编译器针对计算密集型函数GEMM优化不足的问题,大幅提升函数性能,与开源BLAS数学库GotoBLAS相较,平均加速比为4.72,最高加速比为5.61。

著录项

  • 公开/公告号CN105808309A

    专利类型发明专利

  • 公开/公告日2016-07-27

    原文格式PDF

  • 申请/专利权人 中国科学院软件研究所;

    申请/专利号CN201610130123.6

  • 申请日2016-03-08

  • 分类号G06F9/45(20060101);G06F17/15(20060101);G06F17/16(20060101);

  • 代理机构11251 北京科迪生专利代理有限责任公司;

  • 代理人成金玉;孟卜娟

  • 地址 100190 北京市海淀区中关村南四街4号

  • 入库时间 2023-06-19 00:12:25

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2019-04-05

    授权

    授权

  • 2016-08-24

    实质审查的生效 IPC(主分类):G06F9/45 申请日:20160308

    实质审查的生效

  • 2016-07-27

    公开

    公开

说明书

技术领域

本发明涉及一种基础线性代数库BLAS(一种最基础的数学库之一,广泛应用于科 学工程计算,主要包括向量和矩阵的基本操作)的三级函数一般矩阵乘GEMM的高性 能实现方法,通过一系列平台架构相关的优化方法,提升函数性能。

背景技术

BLAS(BasicLinearAlgebraSubprograms)是一个线性代数核心子程序的集合,主要包 括向量和矩阵的基本操作。它是最基本和最重要的数学库之一,广泛应用于科学工程计 算。目前世界上有关矩阵运算的软件几乎都调用BLAS库;重要的稠密线性代数算法软 件包(如EISPACK、LINPACK、LAPACK和ScaLAPACK等)的底层都是以BLAS为支 撑。BLAS目前已成为线性代数领域的一个标准API库。

BLAS分成三个等级:

1级:进行向量-向量操作;

2级:进行向量-矩阵操作;

3级:进行矩阵-矩阵操作。

BLAS3级中的矩阵相乘GEMM函数,如公式所示,其中A,B表示矩阵相乘计算 的两个因子,C表示累加结果矩阵,α,β为标量因子。

C=αAB+βC(公式1)

针对特定的体系结构进行BLAS库的优化,特别是GEMM函数的优化工作,国内 外已有相当多的研究成果,例如Goto等人所提出的矩阵乘法实现算法(GotoK,GeijnRA. Anatomyofhigh-performancematrixmultiplication[J].ACMTransactionsonMathematical Software(TOMS),2008,34(3):12.),通过对矩阵A和B进行划分,矩阵乘法细分为一组 panel-panel的乘法操作(GEBP),分析矩阵计算三重循环顺序与cache缓存之间的关系 模型并提出最优算法。基于该模型的开源高性能BLAS数学库有GotoBLAS与OpenBLAS 等。近几年来,针对BLAS的自动调优技术日渐成熟,基于该技术的BLAS数学库ATLAS 可以针对通用CPU平台,自动调整矩阵分块、监测cache利用率、调整寄存器使用策略, 生成最合适平台架构的代码。

申威SW1600平台是一款由江南计算技术研究所研制的新型国产平台,使用了扩展 的ALPHA架构指令集,每个CPU支持乘加指令与256位向量化运算,支持计算指令与 访存指令同步发射,具体硬件参数如表1所示。

表1

申威SW1600平台作为国产高性能多核平台,性能指标优异,已被济南超算等国内 超算中心使用,受众广泛,有大量的科学计算应用在该平台上执行,提供一套基于该平 台的高效的基础线性代数库进行底层支持十分有必要,GEMM函数作为最通用的3级 BLAS函数更是非常重要。然而,目前已有的开源BLAS库都没有对申威SW1600平台 进行过定制优化,由于申威SW1600使用了扩展的ALPHA指令集,支持256位SIMD 向量化与乘加指令,GotoBLAS等开源BLAS库都没有基于该平台涉及运用这些技术, 大多数性能不高,需重新设计(在高性能计算领域,开源的GotoBLAS库是业界认可的 性能对比标准)。若基于C代码实现BLAS数学库,依赖申威SW1600平台的通用编译 器进行优化,则无法充分利用GEMM为计算密集型的特征,优化力度不够,性能远低 于手工进行软件流水线设计的汇编代码。

发明内容

本发明解决的问题是:基于目前没有针对申威SW1600平台特定优化过的BLAS数 学库,而开源数学库性能直接应用于该平台之上性能不高的情况,本发明提出了一种基 于申威SW1600平台的基础线性代数库BLAS的三级函数,一般矩阵乘GEMM的高性 能实现方案,该方案合理利用硬件资源,克服计算数据依赖问题,将数据通信隐藏于计 算当中,保证计算部件高效运行。应用于该平台时,本发明性能远高于GotoBLAS等开 源的BLAS数学库。

本发明实现手工汇编级优化,使用乘加指令、循环展开、软件流水线指令重排、SIMD 向量化运算、寄存器分块技术、矩阵分块与数据重排等与平台架构相关的技术手段,大 幅提升函数性能。

本发明的高性能实现方案实现如下:

(1)interface接口层函数:该层为函数接口,负责输入参数检查,主要判断矩阵规 模等参数是否合法,当输入参数不合法时返回错误码;判断背景技术一节中公式1中的 A、B两个输入矩阵的转置情况,依据不同情况调用对应的driver驱动层函数;

(2)driver驱动层函数:由interface接口层函数调用,并调用下层的kernel汇编核 心层函数;该driver驱动层函数负责矩阵数据重排,以适应kernel汇编核心层函数的寄 存器分块情况,计算过程包含的N维和M维两重嵌套循环,在N维循环内进行B矩阵 重排,在M维循环内进行A矩阵重排,保证kernel汇编核心层函数连续从cache中获 取数据,以减少cache不命中的情况,提高性能;

(3)kernel汇编核心层函数:为底层核心层函数,由driver驱动层函数调用,负责 实际计算的高性能实现;kernel汇编核心层函数基于申威SW1600的扩展的ALPHA架 构指令集,使用256位的SIMD向量化运算与乘加指令提高计算性能;基于该平台的 ALPHA架构特征,使用F0至F31共32个浮点向量寄存器,采用寄存器分块策略进行 算法设计;利用GEMM的计算密集型特性,手工实现汇编级的循环展开与指令重排, 使用计算指令掩盖访存延迟,保证CPU利用率。

256位SIMD向量化运算:一般而言,可以使用C语言的intrinsic函数进行手工向量化, 提升性能。但是对于性能要求较高的任务,比如本发明涉及的GEMM函数,intrinsic函数不 能胜任,因为intrinsic函数不能控制指令的调度和寄存器分配,我们需要在核心函数中编写 向量化的汇编代码。申威SW1600平台提供了256位的SIMD向量扩展支持。以实数双精为 例,每个元素为8字节,进行向量化扩展后,配合长度为256位的浮点向量化寄存器,每次 顺序读取4个A矩阵元素,同时对4个C累加结果矩阵的元素进行运算,理论上性能可提 升4倍。

乘加指令:申威SW1600平台提供SIMD乘加指令,每次计算指令可以实现加法和乘法 在一个指令周期完成,理论上可以实现2倍加速,且可以减少指令数,减少内层循环中间变 量个数,降低对寄存器资源的消耗,利于软件流水线的排布。

寄存器分块:寄存器分块的目的是合理安排核心函数中矩阵分块的大小,在不超过硬件 限制的情况下尽可能充分利用寄存器等硬件资源,实现性能优化。寄存器的数量决定了寄存 器分块的大小。申威SW1600是扩展的ALPHA架构平台,每个CPU拥有F0到F31,共32 个向量化浮点寄存器,本发明选择4*4的寄存器分块。在此分块下,每轮使用4个浮点向量 寄存器,取4个256位向量长度的A矩阵元素,共16个A矩阵元素;使用4个浮点向量寄 存器,每个寄存器取1个B阵元素并扩展成4份,则4个寄存器处理4个B矩阵元素,计 算16个256位向量长度的C矩阵元素,即64个C矩阵双精元素的部分解,由此共使用了 24个浮点向量寄存器。此外,F31寄存器存0值,剩余7个逻辑寄存器存储中间变量或用作 循环变量,寄存器资源使用合理且高效。

循环展开与软件流水线:循环展开是编译器经常使用的优化策略之一,循环展开后,最 内层循环的单次循环内指令数增加,对硬件而言,有更多的指令可用于乱序发射与乱序执行, 硬件保留站和流水线等硬件资源利用更充分;对软件而言,更多的指令可以用于指令重排, 有助于避免“访存-计算”的数据依赖关系。

本发明与现有技术相比的有益效果在于:本发明采用“interface接口层函数-driver 驱动层函数-kernel汇编核心层函数”的三层代码设计框架,使用乘加指令、循环展开、 软件流水线指令重排、SIMD向量化运算、寄存器分块技术、矩阵分块与数据重排等与 平台架构相关的技术手段,实现汇编级手工优化,解决了编译器针对计算密集型函数 GEMM优化不足的问题,大幅提升函数性能,与开源BLAS数学库GotoBLAS相较,平 均加速比为4.72,最高加速比为5.61。

附图说明

图1为本发明实现流程图:描述了算法流程及“interface接口层函数-driver驱动层函 数-kernel汇编核心层函数”的三层代码设计框架,在kernel汇编核心层函数中使用了寄 存器分块、SIMD向量以及循环展开等平台相关的优化技术;

图2为A矩阵数据重排示意图:描述A矩阵为非转置矩阵时,数据重排的情况;

图3为B矩阵数据重排示意图:描述B矩阵为非转置矩阵时,数据重排的情况;

图4为申威SW1600GEMM与GotoBLASGEMM性能比对图。

具体实施方式

本发明实施例基于国产申威SW1600平台的GEMM高性能实现。由江南计算技术 研究所设计研制的申威SW1600平台,基于该平台的一个CPU进行算法设计,函数设 计采用“interface接口层函数-driver驱动层函数-kernel汇编核心层函数”的三层代码设计 框架,如图1所示,其调用关系为interface-driver-kernel,其中driver层多次调用kernel 层函数。三层代码设计框架具体实施方式为:

(1)interface接口层函数:该层为函数接口,负责输入参数检查,主要判断矩阵规 模等参数是否合法,当输入参数不合法时返回错误码;判断背景技术一节中公式1中的 A、B两个输入矩阵的转置情况,依据不同情况调用对应的driver驱动层函数。

(2)driver驱动层函数:由interface接口层函数调用,并调用下层的kernel汇编核 心层函数;该driver驱动层函数负责矩阵数据重排,以适应kernel汇编核心层函数的寄 存器分块情况,计算过程包含的N维和M维两重嵌套循环,在N维循环内进行B矩阵 重排,在M维循环内进行A矩阵重排,保证kernel汇编核心层函数连续从cache中获 取数据,考虑到kernel汇编核心层函数最内层为K层循环,应使得A矩阵与B矩阵数 据都沿K维连续,由于kernel汇编核心层函数的设计方案采用了4*4寄存器分块策略, A矩阵数据重排情况如图2所示、B矩阵数据重排情况如图3所示。

(3)kernel汇编核心层函数:为底层核心层函数,由driver驱动层函数调用,负责 实际计算的高性能实现;kernel汇编核心层函数基于申威SW1600的扩展ALPHA架构 指令集,使用256位的SIMD向量化运算与乘加指令提高计算性能;基于该平台的 ALPHA架构特征,使用F0至F31共32个浮点向量寄存器,采用寄存器分块策略进行 算法设计;利用GEMM的计算密集型特性,手工实现汇编级的循环展开与指令重排, 使用计算指令掩盖访存延迟,保证CPU利用率。

256位SIMD向量化运算:一般而言,可以使用C语言的intrinsic函数进行手工向量化, 提升性能。但是对于性能要求较高的任务,比如本发明涉及的GEMM函数,intrinsic函数不 能胜任,因为intrinsic函数不能控制指令的调度和寄存器分配,我们需要在核心函数中编写 向量化的汇编代码。申威SW1600平台提供了256位的SIMD向量扩展支持。以实数双精为 例,每个元素为8字节,进行向量化扩展后,配合长度为256位的浮点向量化寄存器,每次 顺序读取4个A矩阵元素,同时对4个C矩阵元素进行运算,理论上性能可提升4倍。

乘加指令:申威SW1600平台提供SIMD乘加指令,每次计算指令可以实现加法和乘法 在一个指令周期完成,理论上可以实现2倍加速,且可以减少指令数,减少内层循环中间变 量个数,降低对寄存器资源的消耗,利于软件流水线的排布。

寄存器分块:寄存器分块的目的是合理安排核心函数中矩阵分块的大小,在不超过硬件 限制的情况下尽可能充分利用寄存器等硬件资源,实现性能优化。寄存器的数量决定了寄存 器分块的大小。申威SW1600是ALPHA架构平台,每个CPU拥有F0到F31,共32个向量 化浮点寄存器,本发明选择4*4的寄存器分块。在此分块下,每轮使用4个浮点向量寄存器, 取4个256位向量长度的A矩阵元素,共16个A矩阵元素;使用4个浮点向量寄存器,每 个寄存器取1个B阵元素并扩展成4份,则4个寄存器处理4个B矩阵元素,计算16个256 位向量长度的C矩阵元素,即64个C矩阵双精元素的部分解,由此共使用了24个浮点向 量寄存器。此外,F31寄存器存0值,剩余7个逻辑寄存器存储中间变量或用作循环变量, 寄存器资源使用合理且高效。

循环展开与软件流水线:循环展开是编译器经常使用的优化策略之一,循环展开后,最 内层循环的单次循环内指令数增加,对硬件而言,有更多的指令可用于乱序发射与乱序执行, 硬件保留站和流水线等硬件资源利用更充分;对软件而言,更多的指令可以用于指令重排, 有助于避免“访存-计算”的数据依赖关系。

本发明基于申威SW1600平台,通过使用多线程与手工汇编代码优化,提高了对于 该计算密集型函数的运行性能,表2统计了数据规模分别为1024、2048、4096、8192 时,申威SW1600GEMM性能和GotoBLASGEMM性能,对比图如图4所示,实验包 含了1024、2048、4096、8192四种矩阵规模,实数单精、实数双精、复数单精、复数 双精共16组测试用例,为表2的对比示意图,平均加速比为4.72,最高加速比为5.61。

表2

提供以上实施例仅仅是为了描述本发明的目的,而并非要限制本发明的范围。本发 明的范围由所附权利要求限定。不脱离本发明的精神和原理而做出的各种等同替换和修 改,均应涵盖在本发明的范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号