我最近想使用简单的CUDA矩阵向量乘法。我在cublas库中找到了一个合适的函数:cublas<<>> gbmv。这是the official documentation
但它实际上很差,所以我没有设法理解kl
和ku
参数的含义。而且,我不知道stride
是什么(它也必须提供)。
有关这些参数的简要说明(页37),但看起来我需要了解其他参数。
在互联网上搜索并没有提供大量关于这个问题的有用信息,主要是对不同版本的文档的引用。
所以我对GPU / CUDA / cublas大师提出了几个问题:
非常感谢。
答案 0 :(得分:6)
所以BLAS(基本线性代数子程序)通常是一个API,顾名思义,它是基本的线性代数例程。它包括矢量矢量运算(1级blas例程),矩阵矢量运算(2级)和矩阵运算(3级)。有一个"reference" BLAS可用,可以正确实现所有内容,但大多数情况下,您会为您的架构使用优化的实现。 cuBLAS是CUDA的一个实现。
BLAS API非常成功,它描述了它被广泛采用的基本操作。然而,(a)由于当时的架构限制(这是1979年,API使用8个字符或更少的名称来定义,以确保它可以广泛编译),名称非常神秘,并且(b)它是成功的,因为它很通用,所以即使是最简单的函数调用也需要很多无关的参数。
因为它如此广泛,人们常常认为,如果你正在进行数值线性代数,你已经知道了API的一般要点,因此实施手册通常会遗漏重要的细节,我认为这就是你遇到的问题。
2级和3级例程通常具有TMMOO..
形式的函数名称,其中T
是矩阵/向量的数字类型(S
/ D
/ double precision real,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 T 或A H 。因此,如果您只是想要y = Ax
,那么就像常见情况一样,那么a = 1
,b = 0
。和transa == CUBLAS_OP_N
。
incx
是x
中不同元素之间的步幅;有很多情况下这会派上用场,但如果x
只是一个包含向量的简单1d数组,则步幅为1。
这就是SGEMV所需要的一切。