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. 对比分析
| 特性 | cublasDgemv | cublasDdot |
|---|---|---|
| 计算类型 | 矩阵-向量乘法 | 向量点积 |
| 计算复杂度 | O(m·n) | O(n) |
| 数据依赖 | 矩阵+向量 | 两个向量 |
| 典型应用 | 线性方程组求解 | 正交化、投影 |
4. 使用建议
- 数据布局:cuBLAS 使用列优先(Fortran 风格)存储,C/C++ 中需要注意转置
- 异步执行:cuBLAS 函数默认异步执行,需要 cudaDeviceSynchronize() 获取结果
- 双精度 vs 单精度:D 前缀表示双精度,S 前缀表示单精度,根据精度需求选择
- 错误检查:始终检查返回的 cublasStatus_t 确保调用成功
总结
cublasDgemv 和 cublasDdot 是 cuBLAS 中最基础的两个函数,分别处理矩阵-向量乘法和向量点积。在科学计算和工程模拟中,合理使用这些函数可以充分利用 GPU 的并行计算能力,大幅提升计算效率。
本文来源于公众号「梁柱墙笔记」,原文链接:mp.weixin.qq.com/s/ZwAVI9r2U…