VectorBLAS簡介
VectorBLAS是一個使用Java語言實現的向量化BLAS高性能庫,目前已在openEuler社區開源。
VectorBLAS通過循環展開、矩陣分塊和內存布局優化等算法優化,對BLAS函數進行了深度優化,并利用VectorAPI JDK提供的多種向量化API實現。
可以理解為:VectorBLAS = VectorAPI + BLAS。
BLAS簡介:
BLAS(Basic Linear Algebra Subprograms)是進行向量和矩陣等基本線性代數操作的數值庫,是LAPACK(Linear Algebra Package)的一部分。
在高性能計算領域中被廣泛應用,由此衍生出大量優化版本,如OpenBLAS、Intel的Intel MKL等優化版本。
主要支持三個級別的運算:分別支持向量與向量、向量與矩陣、矩陣與矩陣的相關操作。
VectorAPI簡介:
VectorAPI是Java端為實現SIMD向量化功能提供的一個抽象層,從JDK16開始發布,目前已孵化到第六代(JDK21)。
VectorAPI提供的能力包括:
1. 定義更清晰及準確的向量化API,使用戶更直接的實現向量化;
2. 與平臺無關:支持AArch64和x86等平臺,支持NEON、SVE、AVX等多種向量化指令,一份代碼多處可用;
應用場景:
目前BLAS庫在大數據、HPC和機器學習等高性能計算中被廣泛使用。例如大數據組件`Spark`中的多種機器學習算法(如:`KMeans`、 `LDA`、 `PCA`、 `Bayes`、 `GMM`、 `SVM`等)都用到了BLAS函數接口`gemm`、 `gemv`、 `axpy`、 `dot`、 `spr`等。
主要優化方法
1. VectorAPI向量化
BLAS庫中的函數分為矢量-矢量、矢量-矩陣、矩陣-矩陣的計算,其中多數場景為對數組、矩陣進行計算,因此使用向量化進行優化,一次處理多個數據,提升效率,下面以daxpy函數為例:
daxpy => y = alpha * x + y, 其中alpha為常數,x和y為一維向量,數據類型均為double;
原生樸素實現:對x和y中的元素逐個計算;
向量化實現:以256位寬的寄存器為例,一次可以處理2個double類型,即一次對alpha、x和y做兩次乘加操作;
可以看出,向量化操作可以成倍的提升處理效率,目前的向量化寄存器有128、256、512等大小的位寬,SVE等指令集甚至最高可支持2048位。
2. 循環展開
循環展開是一種循環轉換技術, 通過減少或消除控制程序循環的指令,來減少計算開銷,這種開銷包括增加指向數組中下一個索引或者指令的指針算數等,還可以減少循環的次數,每次循環內的計算也可以利用CPU的流水線提升效率;
JDK中的JIT即時編譯器也有針對循環進行自動優化,尤其是使用int, short, 或者char變量作為計數器的計數循環(counted loops)
VectorBLAS主要分析函數特性,通過把循環改造為counted loop,或手動對關鍵循環進行展開,以此提高執行效率;
3. 矩陣分塊
矩陣分塊是一種cache優化手段,當數組、矩陣的規模較大的時候,在N層循環中的跨度太大時,無法`fit in the cache`,數據則會被清出了緩存,造成較高的`cache miss`率; 通過矩陣分塊,可以將小塊數據鎖在L1/L2 Cache中,提高cache命中,降低`cache miss`率。
4. Packing
Packing優化又稱為內存布局優化,因矩陣在數組中一般是按列存儲或者按行存儲,若計算時不是按照整行整列的順序進行,那么就需要跨列或跨行讀取數據。
Packing指的是在內存中新開一塊空間,在這塊空間內重新排布數據,使得數據的讀取可以變得連續,減少cache miss,提升讀取速度,Packing一般與矩陣分塊搭配使用。
性能數據
現有版本基于鯤鵬服務器測試驗證,性能相較于業界同類庫F2jBLAS/ludovic.netlib都有提升,如下圖所示:
后續規劃
本項目已開源在openEuler社區,當前版本實現了BLAS庫中的主要接口,后續規劃如下:
1. 支持Level1、Level2、Level3中更多的函數接口;
2. 補充完善UT和Benchmark;
3. 對于不同平臺/指令集的調優;
4.結合Spark MLlib等機器學習算法庫進行性能優化。
審核編輯:湯梓紅
-
JAVA
+關注
關注
19文章
2976瀏覽量
105211 -
開源
+關注
關注
3文章
3412瀏覽量
42737 -
函數
+關注
關注
3文章
4346瀏覽量
63012 -
機器學習
+關注
關注
66文章
8445瀏覽量
133120 -
BLAS
+關注
關注
0文章
3瀏覽量
6702
原文標題:【openEuler創新項目探索】一個Java端的向量化BLAS庫VectorBLAS
文章出處:【微信號:openEulercommunity,微信公眾號:openEuler】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論