李 韋 文淵博 孫廣中 陳云霽
(*中國科學技術大學計算機科學與技術學院 合肥 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]。使用標準化的庫函數以及編譯制導語句的一個重要原因是:使用它們進行編程,可以提高所編寫應用程序的性能可移植性。使用庫函數和編譯制導語句,程序員不必過分糾結底層實現,而相同的代碼也可以更為輕松移植到新硬件架構上。同時,當標準庫的開發人員為所需移植的目標架構提供優化版本時,應用程序在硬件架構上的性能也會同步得到提高。
盡管在許多應用程序中廣泛使用了高度優化的函數庫,但是將所有的庫“鏈接”到一個應用程序中的過程仍然存在問題。其原因在于不同函數調用之間通常需要使用手寫代碼(即膠水代碼),在將應用程序的輸入或者函數調用的輸出作為輸入傳遞給另一個函數調用之前,進行一些類似于更改數據布局格式或分配存儲空間的額外操作,以實現數據預處理。……