99 lines
2.8 KiB
Markdown
99 lines
2.8 KiB
Markdown
# cuda 标准库的使用
|
||
|
||
+ Thrust: 类型 c++ 的标准模板库;
|
||
+ cuBLAS:基本线性代数子程序;
|
||
+ cuFFT:快速傅里叶变换;
|
||
+ cuSPARSE:稀疏矩阵;
|
||
+ cuRAND:随机数生成器;
|
||
+ cuSolver:稠密矩阵和稀疏矩阵计算库;
|
||
+ cuDNN:深度神经网络。
|
||
|
||
------
|
||
|
||
## Thrust
|
||
|
||
**Thrust**:一个实现了众多基本并行算法的c++模板库,类似c++的标准库stl。
|
||
|
||
[Thrust官方资料](https://github.com/NVIDIA/thrust)
|
||
|
||
1. 数据结构
|
||
|
||
Thrust 中的数据结构主要是矢量容器,类似 stl 中的 std::vector:
|
||
|
||
+ 存储于主机的容器 `thrust::host_vector<typename>`;
|
||
+ 存储于设备的容器 `thrust::device__vector<typename>`;
|
||
|
||
容器的使用也类似于 stl:
|
||
|
||
```cuda
|
||
// 包含头文件
|
||
#include<thrust/host_vector.h>
|
||
#include<thrust/device_vector.h>
|
||
|
||
// 定义并初始化主机内存
|
||
thrust::host_vector<double> arr(12, 0.0);
|
||
```
|
||
|
||
Thrust 函数可以直接调用设备上的矢量容器。
|
||
|
||
2. 算法
|
||
|
||
Thrust 提供5类常用算法:变换,归约,前缀和,排序于搜索,选择性复制、替换、移除、分区等重排操作。
|
||
|
||
Thrust 函数的参数必须都来自于主机容器,或者都来自于设备容器;thrust::copy 除外。
|
||
|
||
如果程序中大量使用了 thrust 库,使用设备矢量较为合适;如果只是偶尔使用 Thrust 库,
|
||
则使用设备内存指针更为合适。
|
||
|
||
------
|
||
|
||
## cuBLAS
|
||
|
||
**cuBLAS**,一个基本线性代数子程序,提供三层功能函数:
|
||
+ 处理矢量之间的计算,如矢量之间的内积;
|
||
+ 处理矩阵和矢量之间的运算,如相乘;
|
||
+ 处理矩阵之间的运算,如相乘。
|
||
|
||
CUBLAS 中矩阵采用 **列主序**,即矩阵数据按列存储。
|
||
|
||
[cuBLAS官方资料](https://docs.nvidia.com/cuda/cublas/index.html)
|
||
|
||
------
|
||
|
||
## cuSolver
|
||
|
||
**cuSolver**:稠密矩阵和稀疏矩阵计算库。
|
||
|
||
cuSolver 相比于 cuBLAS,专注于一些比较高级的线性代数计算,并由3个子库组成:
|
||
+ cuSolverDN,处理稠密矩阵线性代数计算;
|
||
+ cuSolverSP,处理稀疏矩阵线性代数计算;
|
||
+ cuSolverRF,处理稀疏矩阵分解。
|
||
|
||
cuSolver 库函数倾向于使用异步执行。为例保证一个 cuSolver 函数的工作已完成,
|
||
可以使用 `cudaDeviceSynchronize()` 函数进行同步。
|
||
|
||
cuSolver 中矩阵同样采用 **列主序**。
|
||
|
||
[cuSolver官方资料](https://docs.nvidia.com/cuda/cusolver/index.html)
|
||
|
||
------
|
||
|
||
## cuRAND
|
||
|
||
**cuRAND**:随机数生成器。
|
||
|
||
cuRAND 库中提供两种 API: 主机API 和 设备API。以主机API为例,使用方式:
|
||
|
||
```cuda
|
||
#include <curand.h>
|
||
|
||
编译时指定链接选项 `-lcurand`
|
||
```
|
||
|
||
同时,主机API 分为两种使用方式:
|
||
+ 使用设备产生伪随机数并存于设备数组;
|
||
+ 使用主机产生伪随机数并存于主机数组。
|
||
|
||
[cuRAND官方资料](https://docs.nvidia.com/cuda/curand/index.html)
|
||
|
||
------ |