李 韦 文渊博 孙广中 陈云霁
(*中国科学技术大学计算机科学与技术学院 合肥 230026) (**计算机体系结构国家重点实验室(中国科学院计算技术研究所) 北京 100190) (***上海寒武纪信息科技有限公司 上海 201203)
过去的几十年,在高性能计算(high-performance computing,HPC)社区的软件开发工作中,诞生了许多广泛使用的高性能函数库,这些函数库或针对计算进行优化,如基本线性代数例程(basic linear algebra subprograms,BLAS)[1-3]、高扩展线性代数库(scalable LAPACK,ScaLAPACK)[4]、西方最快傅立叶变换(fastest Fourier transforms in the West,FFTW)[5];或提供等特定场景中的基本原语,如信息传递接口(message passing interface,MPI)。同时,使用编译制导语句进行编程,提高程序并行度也已成为高性能应用开发中的常用技术,例如开放并行处理(open multi-processing,OpenMP)[6]和开源加速器(open accelerators,OpenACC)[7]。使用标准化的库函数以及编译制导语句的一个重要原因是:使用它们进行编程,可以提高所编写应用程序的性能可移植性。使用库函数和编译制导语句,程序员不必过分纠结底层实现,而相同的代码也可以更为轻松移植到新硬件架构上。同时,当标准库的开发人员为所需移植的目标架构提供优化版本时,应用程序在硬件架构上的性能也会同步得到提高。
尽管在许多应用程序中广泛使用了高度优化的函数库,但是将所有的库“链接”到一个应用程序中的过程仍然存在问题。其原因在于不同函数调用之间通常需要使用手写代码(即胶水代码),在将应用程序的输入或者函数调用的输出作为输入传递给另一个函数调用之前,进行一些类似于更改数据布局格式或分配存储空间的额外操作,以实现数据预处理。……