论文部分内容阅读
基本线性代数函数库BLAS(Basic Linear Algebra Subprograms)是高性能计算中最基本最重要的数学库之一,它的性能对超级计算机的性能有着极大的影响。目前BLAS库已经成为初等线性代数运算事实上的标准,它广泛用于科学及工程计算,是许多数学软件的基本核心,因此BLAS库的性能的优化对提高程序运行速度、发挥计算机的运算能力有很重要的意义。龙芯系列处理器是中国科学院计算技术研究所自主研发的,兼容MIPS指令集的高性能通用处理器。2009年研制成功的龙芯3A四核处理器是一款多核通用CPU,基于可伸缩的多核互连架构设计,在单个芯片上集成4个高性能处理器核以及大量的2级cache,主要面向服务器和高性能机应用。为了充分发挥龙芯处理器的优势,推动龙芯在高性能计算领域的应用,亟需开发一套高性能的BLAS数学库。单核BLAS库的性能和处理器的体系结构严重相关,需要针对不同平台进行优化。
本文根据龙芯3A的体系结构和各级BLAS函数的特征,总结、提出并实验了一系列方法来优化单核BLAS库的性能。对于BLAS1,2级函数,由于其瓶颈主要在于内存访问上,所以实验通过SIMD访存指令、循环展开、分块算法、数据预取来尽量减少内存访问次数,提高cache命中率,使用计算来掩盖访存时间,达到优化指令和访存流水线的目的。而且实验中发现BLAS1,2级函数对内存带宽和外围存储结构的非常敏感,提出了一种基于存储模型的自适应优化方法,可以使BLAS1,2级函数在不同的CPU平台上都能呈现出最好的性能。在龙芯3A实验平台上,优化后的单核BLAS1,2级函数,例如最具代表性的AXPY和GEMV较之GotoBLAS的原始版本分别提高了约40%和90%的性能。而多核并行方面,受内存带宽限制的BLAS1,2在双通道内存平台上四核加速比从原始的1.3提高到了1.9。对于BLAS3级函数,本文的工作主要集中于多核并行方面。通用CPU的多核并行最高效的方式就是多线程并行,可以根据应用选择Pthread或OpenMP的并行方式。实验中发现,BLAS1,2级函数的并行瓶颈主要在于内存带宽和线程间cache冲突,BLAS3级函数的并行瓶颈则主要在线程间cache冲突。Pthread的方式并行开销更小,能够比较有效的控制线程行为,减少线程间cache冲突。本文对核心的BLAS3函数提出了新的数据划分方法,使龙芯3A的并行加速比从GotoBLAS的3.0提高到3.6。