cublasDgemv/cublasDdot计算对比

2 阅读2分钟

cublasDgemv 和 cublasDdot 是 NVIDIA cuBLAS(CUDA Basic Linear Algebra Subprograms)库中用于双精度浮点计算的函数,分别用于矩阵-向量乘法和向量点积操作。本文对这两个函数进行详细介绍和对比。

1. cublasDgemv:矩阵-向量乘法

功能

计算矩阵与向量的乘积,形式为:y = α·A·x + β·y

函数原型

cublasStatus_t cublasDgemv(
    cublasHandle_t handle,     // cuBLAS 句柄
    cublasOperation_t trans,   // 是否转置矩阵
    int m,                     // 矩阵行数
    int n,                     // 矩阵列数
    const double *alpha,       // 标量 α
    const double *A,           // 矩阵 A(列优先存储)
    int lda,                   // leading dimension
    const double *x,           // 向量 x
    int incx,                  // x 的步长
    const double *beta,        // 标量 β
    double *y,                 // 输出向量 y
    int incy                   // y 的步长
);

关键参数

  • trans:控制矩阵是否转置(CUBLAS_OP_N / CUBLAS_OP_T / CUBLAS_OP_C)
  • m, n:矩阵维度
  • alpha, beta:标量系数,支持 y = α·A·x + β·y 的灵活组合

2. cublasDdot:向量点积

功能

计算两个向量的双精度点积(内积):result = Σ(x_i · y_i)

函数原型

cublasStatus_t cublasDdot(
    cublasHandle_t handle,  // cuBLAS 句柄
    int n,                  // 向量长度
    const double *x,        // 向量 x
    int incx,               // x 的步长
    const double *y,        // 向量 y
    int incy,               // y 的步长
    double *result          // 输出点积结果
);

3. 对比分析

特性cublasDgemvcublasDdot
计算类型矩阵-向量乘法向量点积
计算复杂度O(m·n)O(n)
数据依赖矩阵+向量两个向量
典型应用线性方程组求解正交化、投影

4. 使用建议

  1. 数据布局:cuBLAS 使用列优先(Fortran 风格)存储,C/C++ 中需要注意转置
  2. 异步执行:cuBLAS 函数默认异步执行,需要 cudaDeviceSynchronize() 获取结果
  3. 双精度 vs 单精度:D 前缀表示双精度,S 前缀表示单精度,根据精度需求选择
  4. 错误检查:始终检查返回的 cublasStatus_t 确保调用成功

总结

cublasDgemv 和 cublasDdot 是 cuBLAS 中最基础的两个函数,分别处理矩阵-向量乘法和向量点积。在科学计算和工程模拟中,合理使用这些函数可以充分利用 GPU 的并行计算能力,大幅提升计算效率。

本文来源于公众号「梁柱墙笔记」,原文链接:mp.weixin.qq.com/s/ZwAVI9r2U…