CUDA cublas <t> gbmv理解</t>

时间:2012-05-23 17:13:56

标签: cuda cublas

我最近想使用简单的CUDA矩阵向量乘法。我在cublas库中找到了一个合适的函数:cublas&lt;&lt;&gt;&gt; gbmv。这是the official documentation

但它实际上很差,所以我没有设法理解klku参数的含义。而且,我不知道stride是什么(它也必须提供)。 有关这些参数的简要说明(页37),但看起来我需要了解其他参数。

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

所以我对GPU / CUDA / cublas大师提出了几个问题:

  1. 如何找到有关使用cublas的更易理解的文档或指南?
  2. 如果你知道如何使用这个功能,你不能解释我该如何使用它?
  3. 也许Cublas图书馆有点特别,每个人都使用更受欢迎,更好记录的东西等等?
  4. 非常感谢。

1 个答案:

答案 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 = 1b = 0。和transa == CUBLAS_OP_N

incxx中不同元素之间的步幅;有很多情况下这会派上用场,但如果x只是一个包含向量的简单1d数组,则步幅为1。

这就是SGEMV所需要的一切。