【问题标题】:CUDA cublas<t>gbmv understandingCUDA cublas<t>gbmv 理解
【发布时间】:2012-05-30 06:52:00
【问题描述】:

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

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

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

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

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

非常感谢。

【问题讨论】:

  • CUBLAS 函数只是以标准 Fortran BLAS 为模型,有大量文档。所以尝试搜索 SBGMV,你可能会找到你要找的东西(你的矩阵真的是带状的吗?)

标签: cuda cublas


【解决方案1】:

所以BLAS(基本线性代数子程序)通常是一个API,顾名思义,基本线性代数例程。它包括向量-向量运算(1 级 blas 例程)、矩阵-向量运算(2 级)和矩阵-矩阵运算(3 级)。有一个可用的"reference" 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 指令或documentation of the original,您可以单步执行参数列表。一、基本操作是

此函数执行矩阵向量乘法 y = a op(A)x + b y 其中 A 是以列优先格式存储的 m x n 矩阵,x 和 y 是向量, 和 是标量。

其中 op(A) 可以是 A、AT 或 AH。所以如果你只想要y = Ax,就像常见的情况一样,那么a = 1b = 0。和transa == CUBLAS_OP_N

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

这就是 SGEMV 所需的全部内容。

【讨论】:

    猜你喜欢
    • 2010-12-13
    • 2014-11-08
    • 2014-04-11
    • 2013-09-02
    • 2012-02-27
    • 2021-02-16
    • 2012-11-26
    • 2017-08-24
    相关资源
    最近更新 更多