<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一個使用Java語言實現的向量化BLAS庫VectorBLAS

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

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做兩次乘加操作;

16f2f720-3a9b-11ee-9e74-dac502259ad0.png
可以看出,向量化操作可以成倍的提升處理效率,目前的向量化寄存器有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`率。

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

4. Packing

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

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

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

性能數據

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

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

后續規劃

本項目已開源在openEuler社區,當前版本實現了BLAS庫中的主要接口,后續規劃如下:

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

2. 補充完善UT和Benchmark;

3. 對于不同平臺/指令集的調優;

4.結合Spark MLlib等機器學習算法庫進行性能優化。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2905

    瀏覽量

    103092
  • 開源
    +關注

    關注

    3

    文章

    3002

    瀏覽量

    41750
  • 函數
    +關注

    關注

    3

    文章

    4042

    瀏覽量

    61390
  • 機器學習
    +關注

    關注

    66

    文章

    8155

    瀏覽量

    130771
  • BLAS
    +關注

    關注

    0

    文章

    3

    瀏覽量

    6653

原文標題:【openEuler創新項目探索】一個Java端的向量化BLAS庫VectorBLAS

文章出處:【微信號:openEulercommunity,微信公眾號:openEuler】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    SQL語言實現數據記錄的查詢

    絕大部分DBMS都支持SQL語言,LabVIEW數據工具包實現的實質也是基于SQL語言,它為不熟悉SQL語言的用戶把SQL
    發表于 07-01 21:25

    如何用VHDL語言實現幀同步的設計?

    幀同步是什么工作原理?如何用VHDL語言實現幀同步的設計?
    發表于 04-08 06:33

    請問怎樣實現H.264的量化?

    量化的功能有哪些?量化的算法是什么?怎樣用Verilog語言實現H.264的量化?如何運用Modelsim對H.264進行仿真?
    發表于 04-28 06:12

    基于Miracl的中國剩余定理C語言實現資料分享

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

    基于Proteus和C語言實現

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

    如何使用C語言實現模糊PID控制?

    如何使用C語言實現模糊PID控制?
    發表于 09-24 08:54

    C語言實現常用排序算法是什么?

    C語言實現常用排序算法是什么?
    發表于 10-19 06:41

    JAVA語言實現RSA公鑰密碼算法

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

    DSP算法的c語言實現

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

    4個重要算法C語言實現源代碼

    4個重要算法C語言實現源代碼
    發表于 06-10 08:00 ?12次下載

    MATLAB的循環向量化編程方法的詳細資料研究

    在簡要介紹MATLAB軟件基礎上,探討了MABLAB傳統循環結構編程思想及循環向量化編程思想。通過實例對循環結構編程與循環向量化編程進行比較。說明了循環向量化編程的優點。循環向量化方法
    發表于 08-28 17:46 ?4次下載

    CRC校驗算法原理及c語言實現

    CRC校驗算法原理及c語言實現
    發表于 11-30 10:04 ?9次下載

    累加校驗和C語言實現

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

    怎么用C語言實現多態

    這里我想主要介紹下在C語言中是如何實現的面向對象。知道了C語言實現面向對象的方式,我們再聯想下,C++中的class的運行原理是什么?
    的頭像 發表于 10-12 09:12 ?1656次閱讀

    使用C語言實現的CRC計算單元的例子

    使用C語言實現的CRC計算單元的例子
    的頭像 發表于 05-16 16:16 ?56次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>