所以BLAS(基本线性代数子程序)通常是一个 API,顾名思义,基本线性代数例程。它包括向量-向量运算(1 级 blas 例程)、矩阵-向量运算(2 级)和矩阵-矩阵运算(3 级)。有一个可用的“参考”BLAS可以正确实现所有内容,但大多数时候您会为您的架构使用优化的实现。cuBLAS 是 CUDA 的一个实现。
BLAS API 作为描述基本操作的 API 非常成功,因此被广泛采用。然而,(a)由于当时的架构限制,这些名称非常神秘(这是 1979 年,API 使用 8 个字符或更少字符的名称定义,以确保它可以广泛编译),并且(b)它是成功的,因为它非常通用,因此即使是最简单的函数调用也需要大量无关的参数。
因为它是如此广泛,所以通常假设如果你在做数值线性代数,你已经知道 API 的一般要点,所以实现手册通常会遗漏重要的细节,我认为这就是你遇到的问题。
2 级和 3 级例程通常具有以下形式的函数名称,TMMOO..
其中T
是矩阵/向量的数值类型(S
/D
用于单/双精度实数,C
/Z
用于单/双精度复数),MM
是矩阵类型(GE
对于一般 - 例如,只是一个密集的矩阵,你不能说其他任何事情;GB
对于一般的带状矩阵,SY
对称矩阵等),并且OO
是操作。
这一切现在看起来有点荒谬,但它确实有效并且效果相对较好——您很快就会学会扫描这些熟悉的操作,因此 SGEMV 是单精度通用矩阵乘以向量乘法(这可能是您想要的,而不是 SGBMV) , DGEMM 是双精度矩阵-矩阵乘法等。但确实需要一些练习。
因此,如果您查看 cublas sgemv 说明,或在原始文档中,您可以逐步浏览参数列表。一、基本操作是
此函数执行矩阵向量乘法
y = a op(A)x + b y
,其中 A 是以列优先格式存储的 amxn 矩阵,x 和 y 是向量,并且 和 是标量。
其中 op(A) 可以是 A、A T或 A H。因此,如果您只想要y = Ax
,就像常见的情况一样,那么a = 1
, b = 0
。和transa == CUBLAS_OP_N
。
incx
是 中不同元素之间的步幅x
;在很多情况下这会派上用场,但如果x
只是一个包含向量的简单一维数组,那么步幅将为 1。
这就是 SGEMV 所需的全部内容。