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

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

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

一個(gè)使用Java語(yǔ)言實(shí)現(xiàn)的向量化BLAS庫(kù)VectorBLAS

openEuler ? 來(lái)源:openEuler ? 2023-08-16 10:40 ? 次閱讀

VectorBLAS簡(jiǎn)介

VectorBLAS是一個(gè)使用Java語(yǔ)言實(shí)現(xiàn)的向量化BLAS高性能庫(kù),目前已在openEuler社區(qū)開(kāi)源。

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

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

BLAS簡(jiǎn)介:

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

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

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

VectorAPI簡(jiǎn)介:

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

VectorAPI提供的能力包括:

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

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

應(yīng)用場(chǎng)景:

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

主要優(yōu)化方法

1. VectorAPI向量化

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

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

原生樸素實(shí)現(xiàn):對(duì)x和y中的元素逐個(gè)計(jì)算;

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

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

2. 循環(huán)展開(kāi)

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

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

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

3. 矩陣分塊

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

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

4. Packing

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

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

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

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

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

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

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

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

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

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

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

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

審核編輯:湯梓紅

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

    關(guān)注

    19

    文章

    2967

    瀏覽量

    104746
  • 開(kāi)源
    +關(guān)注

    關(guān)注

    3

    文章

    3348

    瀏覽量

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

    關(guān)注

    3

    文章

    4331

    瀏覽量

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

    關(guān)注

    66

    文章

    8418

    瀏覽量

    132627
  • BLAS
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    6693

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    介紹個(gè)C語(yǔ)言實(shí)現(xiàn)的http下載器

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

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

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

    請(qǐng)問(wèn)怎樣實(shí)現(xiàn)H.264的量化?

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

    基于Miracl庫(kù)的中國(guó)剩余定理C語(yǔ)言實(shí)現(xiàn)資料分享

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

    基于Proteus和C語(yǔ)言實(shí)現(xiàn)

    基于Proteus和C語(yǔ)言實(shí)現(xiàn)共四個(gè)題目,有沒(méi)有人愿意嘗試下?
    發(fā)表于 07-14 06:20

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

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

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

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

    DSP算法的c語(yǔ)言實(shí)現(xiàn)

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

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

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

    4個(gè)重要算法C語(yǔ)言實(shí)現(xiàn)源代碼

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

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

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

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

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

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

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

    累加校驗(yàn)和C語(yǔ)言實(shí)現(xiàn)

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