基于
1621
高精度
算法
实现
优化
徐方洁
基于申威 1621 的高精度点积算法实现与优化徐方洁,王磊,王一卓,张亚光(中原工学院前沿信息技术研究院,郑州450007)通信作者:徐方洁,E-mail:摘要:点积函数是 BLAS 库中的一级基础函数,其被科学计算等领域广泛调用.由于浮点计算会引入舍入误差,现有 BLAS 库中双精度点积函数不足以满足某些应用领域的精度要求,因此需要高精度算法来实现更精确可靠的计算.在本文中,面向国产申威 1621 平台,在现有的 BLAS 库的基础上,新增高精度点积函数的实现接口,来满足应用的高精度需求.同时,对于高精度点积算法运用循环展开、访存优化、指令重排等优化策略,实现汇编级手工优化.实验结果显示,文中高精度点积算法的计算结果精度,近似达到了双精度点积的两倍,有效提升了原始算法精度.同时,在保证精度提升的基础上,文中优化后的高精度点积函数相比未优化前,平均性能加速比达到了 1.61.关键词:申威 1621;点积;高精度;BLAS 库接口;性能优化引用格式:徐方洁,王磊,王一卓,张亚光.基于申威 1621 的高精度点积算法实现与优化.计算机系统应用,2023,32(2):400405.http:/www.c-s- and Optimization of High-precision Dot Product Algorithm Based onSW1621 ProcessorXUFang-Jie,WANGLei,WANGYi-Zhuo,ZHANGYa-Guang(ResearchInstituteofFrontierInformationTechnology,ZhongyuanUniversityofTechnology,Zhengzhou450007,China)Abstract:Thedotproductfunctionisafirst-levelbasicfunctionintheBLASlibrary,whichiswidelycalledbyscientificcalculationsandotherfields.Asthefloating-pointcalculationintroducesroundingerrors,thedouble-precisiondotproductisunabletomeettheaccuracyrequirementsinsomeapplicationfields,andthushigh-precisionalgorithmsareneededtoachievemoreaccurateandreliablecalculations.Inthisstudy,onthebasisoftheexistingBLASlibrary,theinterfaceofthehigh-precisiondotproductfunctionisaddedtomeetthehigh-precisionrequirementsofapplicationsonthedomesticSW1621platform.Atthesametime,thehigh-precisiondotproductalgorithmusessuchoptimizationstrategiesasloopexpansion,visit-memoryoptimization,andinstructionrearrangementtorealizeassembly-levelmanualoptimization.Theexperimentalresultsindicatethatthehigh-precisiondotproductalgorithmhastheaccuracyapproximatelytwicethatofthedouble-precisiondotproduct,whicheffectivelyimprovestheprecisionoftheoriginalalgorithm.Onthisbasis,theaverageperformancespeedupofthehigh-precisiondotproductfunctionreaches1.61afteroptimization.Key words:SW1621;dotproduct;high-precision;BLASlibraryinterface;performanceoptimization1引言目前,伴随着高性能计算机的快速发展,大规模、长时程的科学计算已广泛应用于各个领域之中.线性代数计算是高性能计算非常重要的领域之一.通常,这些计算通过调用基本线性代数子程序库(basiclinearalgebrasubprograms,BLAS)来执行,BLAS 库是线性代数应用程序的计算内核.目前主流的BLAS库主要包括两大类:一类是针对特定处理器专门优化的 BLAS计算机系统应用ISSN1003-3254,CODENCSAOBNE-mail:ComputerSystems&Applications,2023,32(2):400405doi:10.15888/ki.csa.008932http:/www.c-s-中国科学院软件研究所版权所有.Tel:+86-10-62661041收稿时间:2022-06-20;修改时间:2022-07-18;采用时间:2022-08-09;csa 在线出版时间:2022-12-02CNKI 网络首发时间:2022-12-05400研究开发ResearchandDevelopment库,例如,Intel的MKL 数学核心库和AMD的ACML库等,一类是开源 BLAS 库,不同平台都可以对开源库进行优化,例如,GotoBLAS1和OpenBLAS2,3等.现在,越来越多的应用开始部署在以申威处理器为代表的国产高性能计算平台上,包括科学计算、气象预报、武器装备、金融统计等领域,均极度依赖底层 BLAS 接口.现有的 BLAS 库函数一般支持普适性强的单精度和双精度两种浮点计算精度,由于浮点数表示及浮点数计算不可避免地引入舍入误差,使得函数在实现过程中会造成计算精度的损失.双精度函数有时不能满足某些应用的精度要求,因为浮点计算存在误差导致的事故比比皆是,例如,在金融交易领域,温哥华证券交易所推出的一项初始值为 1000 的股票指数,由于舍入误差累积,当 22 个月后发现该问题时,指数为 524.811,而实际的指数是 1098.892.在武器装备领域,美军部署的“爱国者”导弹,由于软件计时系统存在累计误差,导致拦截伊军“飞毛腿”导弹失败,造成了 28 名士兵死亡4.一系列事件都表明了误差的危害性5,基于这一现实状况,设计实现高精度、高可靠性的浮点数值算法很有必要.点积函数是 BLAS1 中具有代表性的子程序,是线性代数应用中最为基础的运算之一,同时,它也可以应用于更高级别的运算,例如矩阵乘法.精确求点积算法在许多领域中有着不同的应用,具体应用描述见文献 6,7.目前科研工作者对包括点积函数在内的高精度算法有较多的研究成果.文献 7 基于 double-double算法,提出了扩展混合精度的 XBLAS 库.文献 8 基于无误差变换技术,设计实现了高精度的浮点数求和及点积算法,该算法相比 XBLAS 库中点积和求和算法性能有明显的提升.文献 9 在 GPU 上实现了 BLAS函数库的 4 倍精度版本.文献 10 在 GPU 上以 SUM、DOT、SCAL 和 AXPY 函数为例实现了 BLAS 一级函数的多精度版本.文献 11 面向飞腾处理器实现并优化了高精度的求和与点积算法.文献 12 基于无误差变换技术,实现并优化了 QGEMM 算法.上述高精度点积算法,并没有结合申威平台有特殊优化.文献 1315基于国产申威平台,在 BLAS 库函数性能优化方面做了大量工作.本文面向国产申威 1621 平台,在现有 BLAS 库的基础上实现了高精度点积函数.同时,针对该算法实现过程中的访存延迟和数据依赖问题,运用访存和指令重排等优化策略,充分利用国产申威平台硬件特性对其手工优化.在满足精度提升的基础上,使性能和精度达到尽可能的平衡.2相关理论 2.1 IEEE 浮点数标准IEEE-754 是二进制浮点数算术标准,其定义了如表 1 所示的几类二进制浮点数格式,该标准被大部分处理器所采用.表 1IEEE-754 标准二进制浮点数格式精度类型长度符号位指数位尾数位+精度半精度binary16161510+1单精度binary32321823+1双精度binary646411152+1四精度binary128128115112+1目前,包括申威处理器在内的绝大多数通用高性能处理器,在硬件上通常支持普适性较强的单精度和双精度,并没有对更高精度浮点算术提供相应的硬件支持.因此,目前一般采用软件算法来控制浮点运算中的舍入误差,来模拟实现数值精度的提升.本文以高精度点积函数为例,在已有数值算法的基础上,通过设计误差补偿算法,从而实现更高精度.2.2 无误差变换误差补偿的思想由 Dekker16和 Kahan17首先进行了相关研究,2005 年,Ogita 等人8正式提出了基于误差补偿思想的无误差变换的概念,其概念如定义 1.+,a,b Fx=fl(ab)F定义 1.设,a 和 b 为两个浮点数,且有,在没有上下溢出,且舍入模式是就近舍入时,存在:(ab)=x+y(1)其中,x 表示计算结果的最佳浮点数近似,y 表示舍入误差.把浮点数(a,b)转化为浮点数(x,y)的过程就是无误差变换.对于两个浮点数加法的无误差变换,目前已知的最优的是 TwoSum 算法18,如算法 1 所示,该算法在下溢发生时仍然有效.算法1.TwoSum算法输入:浮点数a,b输出:浮点数x,y1)x=a+b2)z=xa3)y=(a(xz)+(bz)2023年第32卷第2期http:/www.c-s-计 算 机 系 统 应 用ResearchandDevelopment研究开发401对于两个浮点数乘法的无误差变换,最著名的是TwoProd 算法16.由于申威处理器支持混合乘减指令,可以简化 TwoProd 算法,从而有效提升算法的效率,简化后的算法 TwoProductFMA8如算法 2 所示.算法2.TwoProductFMA算法输入:浮点数a,b输出:浮点数x,y1)x=ab2)y=FMSx(a,b,x)这里的 FMSx 为申威平台上浮点乘减指(abc),其所实现的功能是:对于浮点数 Fa 和 Fb 相乘后减去Fc,只对最终的结果进行舍入.本文选择其作为高精度点积函数基础实现算法之一.基于上述无误差变换算法的高精度点积算法,如算法 38所示.该算法利用 TwoProductFMA 算法计算出每次浮点数乘积的舍入误差,利用TwoSum算法记录迭代求和过程中的舍入误差.结合循环求点积运算,将记录的舍入误差累加并与原点积计算结果求和,通过误差补偿的方式修正了原点积算法的数值结果,从而有效提升数值结果的精度.该算法的数值结果精度与应用双倍工作精度下的 dot 算法的数值结果精度相同,就像以四精度计算一样.文献 8 给出了这一算法的相关理论分析证明,论证了该算法的可行性.算法3.AccurateDot算法输入:浮点数x,y输出:浮点数res1)p,s0=TwoProductFMA(x1,y1)2)fori=2:n3)h,s1=TwoProductFMA(xi,yi)4)p,s2=Twosum(p,h)5)s0=fl(s+(s0+s1)6)res=fl(p+s0)3高精度点积在申威 1621 上的实现与优化 3.1 高精度点积算法的实现高精度点积算法实现的主要实现过程如图 1 所示,图中的 xi和 yi表示输入的向量元素.由于访问一次存储器的时间消耗,远大于访问一次寄存器的时间消耗,因此,对于运算的中间误差结果,这里使用寄存器来进行保存.每次迭代使用 s0 寄存器对误差结果进行保存,最后,将浮点