0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一個使用Java語言實現(xiàn)的向量化BLAS庫VectorBLAS

openEuler ? 來源:openEuler ? 2023-08-16 10:40 ? 次閱讀

VectorBLAS簡介

VectorBLAS是一個使用Java語言實現(xiàn)的向量化BLAS高性能庫,目前已在openEuler社區(qū)開源。

VectorBLAS通過循環(huán)展開、矩陣分塊和內(nèi)存布局優(yōu)化等算法優(yōu)化,對BLAS函數(shù)進(jìn)行了深度優(yōu)化,并利用VectorAPI JDK提供的多種向量化API實現(xiàn)。

可以理解為:VectorBLAS = VectorAPI + BLAS。

BLAS簡介:

BLAS(Basic Linear Algebra Subprograms)是進(jìn)行向量和矩陣等基本線性代數(shù)操作的數(shù)值庫,是LAPACK(Linear Algebra Package)的一部分。

在高性能計算領(lǐng)域中被廣泛應(yīng)用,由此衍生出大量優(yōu)化版本,如OpenBLAS、Intel的Intel MKL等優(yōu)化版本。

主要支持三個級別的運(yùn)算:分別支持向量與向量、向量與矩陣、矩陣與矩陣的相關(guān)操作。

VectorAPI簡介:

VectorAPI是Java端為實現(xiàn)SIMD向量化功能提供的一個抽象層,從JDK16開始發(fā)布,目前已孵化到第六代(JDK21)。

VectorAPI提供的能力包括:

1. 定義更清晰及準(zhǔn)確的向量化API,使用戶更直接的實現(xiàn)向量化;

2. 與平臺無關(guān):支持AArch64和x86等平臺,支持NEON、SVE、AVX等多種向量化指令,一份代碼多處可用;

應(yīng)用場景:

目前BLAS庫在大數(shù)據(jù)、HPC和機(jī)器學(xué)習(xí)等高性能計算中被廣泛使用。例如大數(shù)據(jù)組件`Spark`中的多種機(jī)器學(xué)習(xí)算法(如:`KMeans`、 `LDA`、 `PCA`、 `Bayes`、 `GMM`、 `SVM`等)都用到了BLAS函數(shù)接口`gemm`、 `gemv`、 `axpy`、 `dot`、 `spr`等。

主要優(yōu)化方法

1. VectorAPI向量化

BLAS庫中的函數(shù)分為矢量-矢量、矢量-矩陣、矩陣-矩陣的計算,其中多數(shù)場景為對數(shù)組、矩陣進(jìn)行計算,因此使用向量化進(jìn)行優(yōu)化,一次處理多個數(shù)據(jù),提升效率,下面以daxpy函數(shù)為例:

daxpy => y = alpha * x + y, 其中alpha為常數(shù),x和y為一維向量,數(shù)據(jù)類型均為double;

原生樸素實現(xiàn):對x和y中的元素逐個計算;

向量化實現(xiàn):以256位寬的寄存器為例,一次可以處理2個double類型,即一次對alpha、x和y做兩次乘加操作;

16f2f720-3a9b-11ee-9e74-dac502259ad0.png
可以看出,向量化操作可以成倍的提升處理效率,目前的向量化寄存器有128、256、512等大小的位寬,SVE等指令集甚至最高可支持2048位。

2. 循環(huán)展開

循環(huán)展開是一種循環(huán)轉(zhuǎn)換技術(shù), 通過減少或消除控制程序循環(huán)的指令,來減少計算開銷,這種開銷包括增加指向數(shù)組中下一個索引或者指令的指針?biāo)銛?shù)等,還可以減少循環(huán)的次數(shù),每次循環(huán)內(nèi)的計算也可以利用CPU的流水線提升效率;

JDK中的JIT即時編譯器也有針對循環(huán)進(jìn)行自動優(yōu)化,尤其是使用int, short, 或者char變量作為計數(shù)器的計數(shù)循環(huán)(counted loops)

VectorBLAS主要分析函數(shù)特性,通過把循環(huán)改造為counted loop,或手動對關(guān)鍵循環(huán)進(jìn)行展開,以此提高執(zhí)行效率;

3. 矩陣分塊

矩陣分塊是一種cache優(yōu)化手段,當(dāng)數(shù)組、矩陣的規(guī)模較大的時候,在N層循環(huán)中的跨度太大時,無法`fit in the cache`,數(shù)據(jù)則會被清出了緩存,造成較高的`cache miss`率; 通過矩陣分塊,可以將小塊數(shù)據(jù)鎖在L1/L2 Cache中,提高cache命中,降低`cache miss`率。

171cf566-3a9b-11ee-9e74-dac502259ad0.png

4. Packing

Packing優(yōu)化又稱為內(nèi)存布局優(yōu)化,因矩陣在數(shù)組中一般是按列存儲或者按行存儲,若計算時不是按照整行整列的順序進(jìn)行,那么就需要跨列或跨行讀取數(shù)據(jù)。

Packing指的是在內(nèi)存中新開一塊空間,在這塊空間內(nèi)重新排布數(shù)據(jù),使得數(shù)據(jù)的讀取可以變得連續(xù),減少cache miss,提升讀取速度,Packing一般與矩陣分塊搭配使用。

172c82c4-3a9b-11ee-9e74-dac502259ad0.png

性能數(shù)據(jù)

現(xiàn)有版本基于鯤鵬服務(wù)器測試驗證,性能相較于業(yè)界同類庫F2jBLAS/ludovic.netlib都有提升,如下圖所示:

174730ec-3a9b-11ee-9e74-dac502259ad0.png

后續(xù)規(guī)劃

本項目已開源在openEuler社區(qū),當(dāng)前版本實現(xiàn)了BLAS庫中的主要接口,后續(xù)規(guī)劃如下:

1. 支持Level1、Level2、Level3中更多的函數(shù)接口;

2. 補(bǔ)充完善UT和Benchmark;

3. 對于不同平臺/指令集的調(diào)優(yōu);

4.結(jié)合Spark MLlib等機(jī)器學(xué)習(xí)算法庫進(jìn)行性能優(yōu)化。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2946

    瀏覽量

    104361
  • 開源
    +關(guān)注

    關(guān)注

    3

    文章

    3181

    瀏覽量

    42235
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4256

    瀏覽量

    62223
  • 機(jī)器學(xué)習(xí)

    關(guān)注

    66

    文章

    8318

    瀏覽量

    132162
  • BLAS
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    6681

原文標(biāo)題:【openEuler創(chuàng)新項目探索】一個Java端的向量化BLAS庫VectorBLAS

文章出處:【微信號:openEulercommunity,微信公眾號:openEuler】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    C語言實現(xiàn):見縫插針游戲!代碼思路+源碼分享

    見縫插圓我們昨天已經(jīng)用C語言實現(xiàn)了,今天將實現(xiàn)見縫插針的游戲。
    發(fā)表于 12-05 11:02 ?680次閱讀

    介紹C語言實現(xiàn)的http下載器

    做OTA升級功能時,能直接拿到的往往只是升級包的鏈接,需要我們自己去下載,這時候就需要用到http下載器,下文介紹C語言實現(xiàn)的http下載器。
    發(fā)表于 02-22 10:25 ?353次閱讀

    SQL語言實現(xiàn)數(shù)據(jù)記錄的查詢

    絕大部分DBMS都支持SQL語言,LabVIEW數(shù)據(jù)工具包實現(xiàn)的實質(zhì)也是基于SQL語言,它為不熟悉SQL語言的用戶把SQL
    發(fā)表于 07-01 21:25

    請問怎樣實現(xiàn)H.264的量化?

    量化的功能有哪些?量化的算法是什么?怎樣用Verilog語言實現(xiàn)H.264的量化?如何運(yùn)用Modelsim對H.264進(jìn)行仿真?
    發(fā)表于 04-28 06:12

    基于Miracl的中國剩余定理C語言實現(xiàn)資料分享

    /article/details/102755680針對大數(shù)的中國剩余定理C語言實現(xiàn)、算法介紹二、代碼實現(xiàn)三、結(jié)果截圖、算法介紹中國剩余定理又稱孫子定理,是中國人在古代數(shù)學(xué)上的
    發(fā)表于 07-02 06:18

    基于Proteus和C語言實現(xiàn)

    基于Proteus和C語言實現(xiàn)共四題目,有沒有人愿意嘗試下?
    發(fā)表于 07-14 06:20

    JAVA語言實現(xiàn)RSA公鑰密碼算法

    JAVA語言實現(xiàn)RSA公鑰密碼算法:本文闡述了公開密鑰密碼體制RSA算法的原理及實現(xiàn)技術(shù)。并在此基礎(chǔ)上,給出了JAVA語言實現(xiàn)的RSA算法
    發(fā)表于 02-10 10:27 ?58次下載

    Verilog HDL語言實現(xiàn)時序邏輯電路

    Verilog HDL語言實現(xiàn)時序邏輯電路 在Verilog HDL語言中,時序邏輯電路使用always語句塊來實現(xiàn)。例如,實現(xiàn)
    發(fā)表于 02-08 11:46 ?4618次閱讀

    DSP算法的c語言實現(xiàn)

    DSP算法的c語言實現(xiàn),又需要的朋友下來看看。
    發(fā)表于 05-09 10:59 ?0次下載

    PID控制算法的C語言實現(xiàn)(完整版)

    PID控制算法的C語言實現(xiàn) PID算法原理
    發(fā)表于 11-05 15:45 ?0次下載

    4重要算法C語言實現(xiàn)源代碼

    4重要算法C語言實現(xiàn)源代碼
    發(fā)表于 06-10 08:00 ?12次下載

    如何使用C語言實現(xiàn)比較簡單的猜數(shù)游戲的程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是如何使用C語言實現(xiàn)比較簡單的猜數(shù)游戲的程序免費(fèi)下載
    發(fā)表于 04-24 18:31 ?0次下載
    如何使用C<b class='flag-5'>語言實現(xiàn)</b><b class='flag-5'>一</b><b class='flag-5'>個</b>比較簡單的猜數(shù)游戲的程序免費(fèi)下載

    MATLAB的循環(huán)向量化編程方法的詳細(xì)資料研究

    在簡要介紹MATLAB軟件基礎(chǔ)上,探討了MABLAB傳統(tǒng)循環(huán)結(jié)構(gòu)編程思想及循環(huán)向量化編程思想。通過實例對循環(huán)結(jié)構(gòu)編程與循環(huán)向量化編程進(jìn)行比較。說明了循環(huán)向量化編程的優(yōu)點(diǎn)。循環(huán)向量化方法
    發(fā)表于 08-28 17:46 ?4次下載

    使用C語言實現(xiàn)壓縮目錄每一個文件為單獨(dú)的zip文件程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用C語言實現(xiàn)壓縮目錄每一個文件為單獨(dú)的zip文件程序免費(fèi)下載。
    發(fā)表于 11-01 15:07 ?16次下載

    累加校驗和C語言實現(xiàn)

    累加校驗和C語言實現(xiàn)
    發(fā)表于 11-29 18:06 ?10次下載
    累加校驗和C<b class='flag-5'>語言實現(xiàn)</b>