日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

从零开始的 Rust 语言 blas 库之预备篇(1)—— blas 基础介绍

發(fā)布時間:2023/12/4 综合教程 30 生活家
生活随笔 收集整理的這篇文章主要介紹了 从零开始的 Rust 语言 blas 库之预备篇(1)—— blas 基础介绍 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

從零開始的 Rust 語言 blas 庫之預(yù)備篇(1)—— blas 基礎(chǔ)介紹

下一篇:從零開始的 Rust 語言 blas 庫之預(yù)備篇(2)—— blas 矩陣格式詳解

文章部分參考:https://blog.csdn.net/hehe199807/article/details/108365427

目錄索引

  • 從零開始的 Rust 語言 blas 庫之預(yù)備篇(1)—— blas 基礎(chǔ)介紹
    • 前言
    • BLAS 基本說明
      • BLAS 構(gòu)成
      • BLAS 函數(shù)介紹
      • BLAS 主要參數(shù)
      • CBLAS 接口與 OpenBLAS
    • roblas 實(shí)現(xiàn)計劃

前言

最近想著自己即將要踏入深度學(xué)習(xí)的領(lǐng)域發(fā)展,不能夠只知其用法卻不知道底層。

許多深度學(xué)習(xí)的模型,底層本質(zhì)都是矩陣運(yùn)算,于是突發(fā)奇想,打算自己移植一個線性代數(shù)庫。憑借著之前的并行計算的基礎(chǔ),我選中了 blas 庫,也是順應(yīng)了時代。

至于開發(fā)語言,我選中了 Rust 語言。一部分原因是我曾經(jīng)參與過 rcore 項(xiàng)目,另一方面是 Rust 語言最近開始被 linux 社區(qū)接受了,我想也是時候支持這門新生語言了。

項(xiàng)目取名為 roblas,含義為 rust-only blas,項(xiàng)目地址為:https://github.com/rust-family/roblas

BLAS 基本說明

此處基本參考:https://blog.csdn.net/hehe199807/article/details/108365427

BLAS 庫,即 Basic Linear Algrbra Subprograms,是進(jìn)行向量和矩陣等基本線性代數(shù)操作的事實(shí)上的數(shù)值庫。這些程序最早在 1979 年發(fā)布,是 LAPACK(Linear Algebra PACKage) 的一部分,便于建立功能更強(qiáng)的數(shù)值程序包。BLAS庫在高性能計算中被廣泛應(yīng)用,由此衍生出大量優(yōu)化版本,如 Intel MKL,AMD 的 ACML,ATLAS 等。在 cuda 計算領(lǐng)域,也有實(shí)現(xiàn)了相應(yīng)接口的 cublas 庫存在。

BLAS 構(gòu)成

  • BLAS1:支持向量與向量之間相關(guān)的操作。主要是為了編程方便,在實(shí)際計算中使用很少,因?yàn)椴荒茉诖蠖鄶?shù)機(jī)器上實(shí)現(xiàn)高性能。
  • BLAS2:支持矩陣與向量之間相關(guān)的操作。在 O(n2)O(n^2)O(n2) 時間復(fù)雜度實(shí)現(xiàn) O(n2)O(n^2)O(n2) 的浮點(diǎn)運(yùn)算。在許多向量機(jī)上能實(shí)現(xiàn)接近峰值的性能。然而在多級存儲器的處理器上則性能一般,因?yàn)槭芟抻跀?shù)據(jù)在存儲器間的遷移。
  • BLAS3:支持矩陣與矩陣之間相關(guān)的操作。在 O(n2)O(n^2)O(n2) 時間復(fù)雜度實(shí)現(xiàn) O(n3)O(n^3)O(n3) 量級的浮點(diǎn)運(yùn)算,能充分發(fā)揮現(xiàn)代處理器的性能,并且能為用戶提供透明的并發(fā)機(jī)制。

BLAS 函數(shù)介紹

BLAS 中對每個函數(shù)的功能定義見官方:http://netlib.org/blas/blasqr.pdf。BLAS 函數(shù)名中的前綴 “x” 表示參數(shù)和返回值的類型:

  • S:單精度實(shí)數(shù)
  • D:雙精度實(shí)數(shù)
  • C:單精度復(fù)數(shù)
  • Z:雙精度復(fù)數(shù)
  • Q:混合精度

其中混合精度由 S,D,C,Z 組成,最左邊表示返回值類型,其余為參數(shù)類型。如 DROTMG 表示的是雙精度的平面轉(zhuǎn)換,SSCAL 表示的則是單精度的向量縮放。

BLAS 主要參數(shù)

此處有一個解釋較好的回答:https://zhuanlan.zhihu.com/p/104287878。

在 BLAS2 和 BLAS3 的函數(shù)中,有以下重要的參數(shù):

  • INCX: 向量X的存儲步長
  • LDA: 矩陣A的存儲步長(主維(Leading Dimension)實(shí)際占用的空間)。這個參數(shù)查看上述的知乎鏈接,若無法理解,可以觀看老外視頻:https://www.youtube.com/watch?v=PhjildK5oO8。在之后的文章中,我也會專門寫一篇文章以理解 LDA 這個變量。
  • TRANS: 矩陣的轉(zhuǎn)置形式,T(實(shí)數(shù)轉(zhuǎn)置)、N(實(shí)數(shù)非轉(zhuǎn)置)、C(復(fù)數(shù)共軛轉(zhuǎn)置)、H(復(fù)數(shù)共軛非轉(zhuǎn)置)
  • UPLO: 對稱陣或三角陣的存儲方式,U(上三角)、L(下三角)
  • DIAG: 對角線形式,N(非單位對角線)、U(單位對角線)
  • SIDE: 矩陣在操作中的位置,L(左邊)、R(右邊)

CBLAS 接口與 OpenBLAS

正如之前所說,BLAS 只是一組向量和矩陣運(yùn)行的接口規(guī)范,也可以稱為API規(guī)范。Netlib 用 fortran 實(shí)現(xiàn)了 BLAS 的這些 API 接口,得到的庫也叫做 BLAS。Netlib只是一般性地實(shí)現(xiàn)了基本功能,并沒有對運(yùn)算做過多的優(yōu)化。

LAPACK (linear algebra package),是著名的線性代數(shù)庫,也是 Netlib 用 fortran 語言編寫的。其底層是 BLAS,在此基礎(chǔ)上定義了很多矩陣和向量高級運(yùn)算的函數(shù),如矩陣分解、求逆和求奇異值等。該庫的運(yùn)行效率比 BLAS 庫高。

從某個角度講,LAPACK 也可以稱作是一組科學(xué)計算(矩陣運(yùn)算)的接口規(guī)范。Netlib 實(shí)現(xiàn)了這一組規(guī)范的功能,得到的這個庫叫做 LAPACK 庫。

前面 BLAS 和 LAPACK 的實(shí)現(xiàn)均是用的 Fortran 語言。為了方便 c 程序的調(diào)用,Netlib 開發(fā)了 CBLAS 和 CLAPACK。其本質(zhì)是在 BLAS 和 LAPACK 的基礎(chǔ)上,增加了 c 的調(diào)用方式。

再有了接口規(guī)范之后,其他的組織、個人和公司,就可以根據(jù)此規(guī)范,實(shí)現(xiàn)自己的科學(xué)計算庫。
開源社區(qū)實(shí)現(xiàn)的科學(xué)計算(矩陣計算)庫中,比較著名的兩個就是 atlas 和 OpenBLAS。它們都實(shí)現(xiàn)了 BLAS 的全部功能,以及 LAPACK 的部分功能,并且他們都對計算過程進(jìn)行了優(yōu)化。

下面是一些相關(guān)鏈接:

  • netlib 實(shí)現(xiàn)的 blas 庫:http://netlib.org/blas/
  • atlas 庫:http://www.netlib.org/atlas/
  • lapack 庫:http://www.netlib.org/lapack/

roblas 實(shí)現(xiàn)計劃

目前的計劃,是依照 netlib 的 cblas 庫進(jìn)行初版 roblas 的實(shí)現(xiàn),即函數(shù)名需要遵守 c 規(guī)范,可能考慮后續(xù)與 c 進(jìn)行鏈接測試。

netlib 中關(guān)于 blas 的使用文檔非常的糞坑,因此在此找到了兩個較好的文檔:

https://www.hpc.nec/documents/sdk/SDK_NLC/UsersGuide/blas/f/en/index.html

https://spec.oneapi.com/versions/0.7/elements/oneMKL/source/domains/blas/blas.html#onemkl-blas

平臺相關(guān)的優(yōu)化,預(yù)計在明年再實(shí)現(xiàn),主要涉及到多線程以及 SIMD 優(yōu)化。Rust 的多線程支持已經(jīng)基本完善,x86/x64 的 SIMD 支持也已經(jīng)到位,理論上可以實(shí)現(xiàn)。

碼字不易,且看且珍惜~

總結(jié)

以上是生活随笔為你收集整理的从零开始的 Rust 语言 blas 库之预备篇(1)—— blas 基础介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。