所以BLAS(基本線性代數子程序)通常是一個API,正如其名稱所述,基本線性代數子程序。它包括矢量矢量運算(1級blas例程),矩陣矢量運算(2級)和矩陣矩陣運算(3級)。有一個"reference" BLAS可用,可以正確實現所有內容,但大多數情況下,您會爲您的體系結構使用優化的實現。 cuBLAS是CUDA的一個實現。
BLAS API是一個非常成功的API,它描述了它被廣泛採用的基本操作。然而,(a)由於當時的架構限制(這是1979年,並且使用8個字符或更少的名字來定義API以確保它可以廣泛編譯),名稱是難以置信的神祕,並且(b)它是成功的,因爲這是相當普遍的,所以即使最簡單的函數調用也需要大量無關的參數。
因爲它非常普遍,所以通常假設如果你正在做數值線性代數,你已經知道API的一般要點,所以實現手冊經常會忽略重要的細節,我認爲這就是你正在運行的成。
2級和3的例程通常具有形式TMMOO..
其中T
是數控型的基質/載體中的功能名稱(S
/D
對於單/雙精度實,C
/Z
對於單/雙精度複數) ,MM
是矩陣類型(GE
一般 - 例如,只是一個密集的矩陣,你不能說任何其他的; GB
爲一般的帶狀矩陣,SY
爲對稱矩陣等),OO
是操作。
現在這一切都顯得有點荒謬,但它的工作原理和工作方式都比較好 - 你很快學會掃描這些熟悉的操作,以便SGEMV是單精度通用矩陣時間向量乘法(這可能是你想要的,而不是SGBMV),DGEMM是雙精度矩陣 - 矩陣乘法等,但這需要一些練習。
所以,如果你看cublas sgemv指令,或在documentation of the original,你可以通過參數列表。首先,基本操作是
此函數執行矩陣 - 向量乘法 y = a op(A)x + b y
其中A是存儲在列優先格式,x和y 一個m×n個矩陣是矢量,並且和是標量。
其中op(A)可以是A,A Ť,或A ħ。所以如果你只想要y = Ax
,那是常見的情況,那麼a = 1
,b = 0
。和transa == CUBLAS_OP_N
。
incx
是x
中不同元素之間的跨步;有很多情況下,這將派上用場,但如果x
只是一個簡單的1d陣列包含向量,那麼步幅將是1.
這就是關於您需要的所有SGEMV。
CUBLAS函數只是在標準的Fortran BLAS上建模,爲此它有大量的文檔。因此,請嘗試搜索SBGMV,您可能會發現您正在尋找什麼(您的矩陣是否真的被綁定?) – talonmies