2

我最近想使用一个简单的 CUDA 矩阵向量乘法。我在 cublas 库中找到了一个合适的函数:cublas<<>>gbmv。这里是官方文档

但它实际上很差,所以我没能理解klku参数的含义。此外,我不知道是什么stride(也必须提供)。这些参数有一个简短的解释(第 37 页),但看起来我需要了解其他内容。

在互联网上搜索并没有提供关于这个问题的大量有用信息,主要是对不同版本的文档的引用。

所以我对 GPU/CUDA/cublas 大师有几个问题:

  1. 如何找到有关使用 cublas 的更易于理解的文档或指南?
  2. 如果你知道如何使用这个功能,你能不能解释一下我如何使用它?
  3. 也许 cublas 库有点特别,每个人都使用更流行、文档更好的东西等等?

非常感谢。

4

1 回答 1

6

所以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 所需的全部内容。

于 2012-05-23T17:42:27.817 回答