CUDA矩阵运算之cuBLAS库的常用函数

前言

对于矩阵运算,我们使用GPU会更加快速,因为GPU可以并行计算,在使用CUDA的时候,编写核函数会有点麻烦,于是,有一个cuBLAS库可以使用,上面包含了一些基本的矩阵运算函数。

根据文档,可以看到一些关于cuBLAS的函数,以下是根据文档第二章加上自己的理解所编写的一些函数的简介目录。

为了方面及时查看有哪些库可以使用,我就写下这篇博客,如果有错误,谢谢大家的指出!

Chapter 2 CUBLAS by example

2.1 示例的一般说明

所有子程序都有四个版本对应的四种数据类型

  • s, S: float
  • d, D: double
  • c, C: cuComplex
  • z, Z: cuDoubleComplex

2.2 CUBLAS level-1. 标量-向量的基本操作

2.2.1 cublasIsamax, cublasIsamin

此函数查找具有最大/最小幅度的数组元素的最小索引

2.2.3 cublasSasum

绝对值之和

2.2.5 cublasSaxpy

计算αx + y,向量x乘上标量α加上向量y

2.2.7 cublasScopy

x拷贝到y上,向量操作。

2.2.9 cublasSdot

点积: 计算向量 x 和 y 的点积
x ⋅ y = x 0 y 0 + . . . + x n − 1 y n − 1 x·y=x_0y_0+...+x_{n-1}y_{n-1} xy=x0y0+...+xn1yn1

2.2.11 cublasSnrm2

计算向量x的欧几里得范数:
∣ ∣ x ∣ ∣ = ∣ x 0 ∣ 2 + . . . + ∣ x n − 1 ∣ 2 ||x||=\sqrt{{|x_0|}^2+...+{|x_{n-1}|}^2} x=x02+...+xn12

2.2.13 cublasSrot

apply the Givens rotation

2.2.19 cublasSscal

缩放向量:
x = α x x=\alpha x x=αx

2.2.21 cublasSswap

交换两个向量:
x ← y ,     y ← x x\leftarrow y,\ \ \ y\leftarrow x xy,   yx

2.3 CUBLAS Level-2. 矩阵-向量操作

2.3.1 cublasSgbmv

This function performs the banded matrix-vector multiplication:
y = α   o p ( A ) x + β y y=\alpha \ op(A)x + \beta y y=α op(A)x+βy

2.3.3 cublasSgemv

矩阵-向量乘法:
y = α   o p ( A ) x + β y y=\alpha \ op(A)x + \beta y y=α op(A)x+βy

2.3.5 cublasSger

rank-1 update: 列向量和行向量相乘得到矩阵,然后加上一个矩阵:
A = α x y T + A     o r     A = α x y H + A A=\alpha xy^T + A\ \ \ or\ \ \ A=\alpha xy^H+A A=αxyT+A   or   A=αxyH+A
xy都是向量,α是标量

2.3.7 cublasSsbmv

对称带状矩阵-向量乘法
y = α   A x + B y y=\alpha \ Ax+By y=α Ax+By
A是对称带状矩阵,xy是向量,

2.3.9 cublasSspmv

对称压缩矩阵-向量乘法
y = α   A x + B y y=\alpha \ Ax+By y=α Ax+By

2.3.11 cublasSspr

对称压缩矩阵rank-1
A = α x x T + A A=\alpha xx^T+A A=αxxT+A

2.3.13 cublasSspr2

对称压缩矩阵rank-2
A = α ( x y T + y x T ) + A A=\alpha (xy^T+yx^T)+A A=α(xyT+yxT)+A

2.3.15 cublasSsymv

对称矩阵向量乘法
y = α A x + β y y=\alpha Ax+\beta y y=αAx+βy

2.3.17 cublasSsyr

对称矩阵rank-1
A = α x x T + A A=\alpha xx^T+A A=αxxT+A

2.3.19 cublasSsyr2

对称矩阵rank-2:
A = α ( x y T + y x T ) + A A=\alpha (xy^T+yx^T)+A A=α(xyT+yxT)+A

2.3.21 cublasStbmv

三角带状矩阵-向量乘法:
x = o p ( A ) x x=op(A)x x=op(A)x

2.3.23 cublasStbsv

求解三角带状线性系统:
o p ( A ) x = b op(A)x=b op(A)x=b
求出x

2.3.25 cublasStpmv

三角压缩矩阵-向量乘法:
x = o p ( A ) x x=op(A)x x=op(A)x

2.3.27 cublasStpsv

求解三角压缩矩阵:
o p ( A ) x = b op(A)x=b op(A)x=b
求出x

2.3.29 cublasStrmv

三角矩阵-向量乘法:
x = o p ( A ) x x=op(A)x x=op(A)x

2.3.31 cublasStrsv

求解三角矩阵-向量:
o p ( A ) x = b op(A)x=b op(A)x=b
x

2.3.33 cublasChemv

Hermitian 矩阵-向量乘法:
y = α A x + β y y=\alpha Ax+\beta y y=αAx+βy

2.3.35 cublasChbmv

Hermitian 带状矩阵-向量乘法:
y = α A x + β y y=\alpha Ax+\beta y y=αAx+βy

2.3.37 cublasChpmv

Hermitian 压缩矩阵-向量乘法:
y = α A x + β y y=\alpha Ax+\beta y y=αAx+βy

2.3.39 cublasCher

Hermitian 矩阵rank-1:
A = α x x H + A A=\alpha x x^H+A A=αxxH+A

2.3.41 cublasCher2

Hermitian 矩阵rank-2:
A = α x y H + α ˉ y x H + A A=\alpha xy^H+\bar{\alpha}yx^H+A A=αxyH+αˉyxH+A

2.3.43 cublasChpr

压缩Hermitian 矩阵rank-1:
A = α x x H + A A=\alpha x x^H+A A=αxxH+A

2.3.45 cublasChpr2

压缩Hermitian 矩阵rank-2:
A = α x y H + α ˉ y x H + A A=\alpha xy^H+\bar{\alpha}yx^H+A A=αxyH+αˉyxH+A

2.4 CUBLAS Level-3. 矩阵-矩阵操作

2.4.1 cublasSgemm

矩阵乘法:
C = α o p ( A ) o p ( B ) + β C C=\alpha op(A)op(B)+\beta C C=αop(A)op(B)+βC

2.4.3 cublasSsymm

对称矩阵-矩阵乘法:
C = α A B + β C   ① C=\alpha AB+\beta C\ ① C=αAB+βC 

C = α B A + β C   ② C=\alpha BA+\beta C\ ② C=αBA+βC 

两种情况都可以的

2.4.5 cublasSsyrk

对称rank-k:
C = α   o p ( A ) o p ( A ) T + β C C=\alpha \ op(A)op(A)^T+\beta C C=α op(A)op(A)T+βC

2.4.7 cublasSsyr2k

对称rank-2k:
C = α   ( o p ( A ) o p ( B ) T + o p ( B ) o p ( A ) T ) + β C C=\alpha \ (op(A)op(B)^T+op(B)op(A)^T)+ \beta C C=α (op(A)op(B)T+op(B)op(A)T)+βC

2.4.9 cublasStrmm

三角矩阵-矩阵乘法:
C = α   o p ( A )   B   ① C=\alpha \ op(A)\ B\ ① C=α op(A) B 

C = α   B   o p ( A )   ② C=\alpha \ B\ op(A)\ ② C=α B op(A) 

2.4.11 cublasStrsm

求解三角矩阵:
o p ( A )   X = α   B   ① op(A)\ X=\alpha\ B\ ① op(A) X=α B 

X   o p ( A ) = α   B   ② X\ op(A)=\alpha\ B\ ② X op(A)=α B 

2.4.13 cublasChemm

Hermitian 矩阵-矩阵乘法:
C = α A B + β C   ① C=\alpha AB+\beta C\ ① C=αAB+βC 

C = α B A + β C   ② C=\alpha BA+\beta C\ ② C=αBA+βC 

2.4.15 cublasCherk

Hermitian rank-k:
C = α   o p ( A ) o p ( A ) H + β   C C=\alpha \ op(A)op(A)^H+\beta \ C C=α op(A)op(A)H+β C

2.4.17 cublasCherk2k

Hermitian rank-2k:
C = α   o p ( A ) o p ( B ) H + α ˉ   o p ( B ) o p ( A ) H + β   C C=\alpha \ op(A)op(B)^H+\bar{\alpha}\ op(B)op(A)^H+\beta \ C C=α op(A)op(B)H+αˉ op(B)op(A)H+β C

  • 5
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言稀疏矩阵三元组加法的实现可以分为以下几个步骤: 1. 定义稀疏矩阵三元组结构体,包括行数、列数、非零元素个数和三个数组:行下标数组、列下标数组和值数组。 2. 输入两个稀疏矩阵三元组,分别存储在两个结构体中。 3. 判断两个稀疏矩阵是否可以相加,即行数和列数是否相等。 4. 定义一个新的稀疏矩阵三元组结构体,用于存储相加后的结果。 5. 遍历两个稀疏矩阵的非零元素,将它们对应位置的值相加,并将结果存储在新的结构体中。 6. 如果某个稀疏矩阵还有剩余的非零元素,则将它们直接复制到新的结构体中。 7. 输出新的稀疏矩阵三元组。 以下是C语言稀疏矩阵三元组加法的示例代码: ``` #include <stdio.h> #define MAXSIZE 100 typedef struct { int row; int col; int val; } Triple; typedef struct { int row; int col; int num; Triple data[MAXSIZE]; } TSMatrix; void CreateMatrix(TSMatrix *M) { int i, j, k, val; printf("请输入矩阵的行数、列数和非零元素个数:\n"); scanf("%d%d%d", &M->row, &M->col, &M->num); printf("请输入矩阵的非零元素:\n"); for (k = 0; k < M->num; k++) { scanf("%d%d%d", &i, &j, &val); M->data[k].row = i; M->data[k].col = j; M->data[k].val = val; } } void AddMatrix(TSMatrix M1, TSMatrix M2, TSMatrix *M) { int i, j, k, p, q; if (M1.row != M2.row || M1.col != M2.col) { printf("两个矩阵无法相加!\n"); return; } M->row = M1.row; M->col = M1.col; k = 0; p = 0; q = 0; while (p < M1.num && q < M2.num) { if (M1.data[p].row < M2.data[q].row || (M1.data[p].row == M2.data[q].row && M1.data[p].col < M2.data[q].col)) { M->data[k] = M1.data[p]; p++; } else if (M1.data[p].row > M2.data[q].row || (M1.data[p].row == M2.data[q].row && M1.data[p].col > M2.data[q].col)) { M->data[k] = M2.data[q]; q++; } else { M->data[k].row = M1.data[p].row; M->data[k].col = M1.data[p].col; M->data[k].val = M1.data[p].val + M2.data[q].val; p++; q++; } k++; } while (p < M1.num) { M->data[k] = M1.data[p]; p++; k++; } while (q < M2.num) { M->data[k] = M2.data[q]; q++; k++; } M->num = k; } void PrintMatrix(TSMatrix M) { int i, j, k; k = 0; for (i = 1; i <= M.row; i++) { for (j = 1; j <= M.col; j++) { if (k < M.num && M.data[k].row == i && M.data[k].col == j) { printf("%d ", M.data[k].val); k++; } else { printf("0 "); } } printf("\n"); } } int main() { TSMatrix M1, M2, M; CreateMatrix(&M1); CreateMatrix(&M2); AddMatrix(M1, M2, &M); printf("矩阵相加的结果为:\n"); PrintMatrix(M); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值