CUDA编程(十三) CUDA标准库与Thrust库

CUDA标准库简介

CUDA编程(十三) CUDA标准库与Thrust库_第1张图片

Thrust 库

Thrust 是一个实现了众多基本并行算法的C++模板库,类似于C++的标准模板库(stan dard template library,STL)。该库自动包含在 CUDA 工具箱中。这是一个模板库,仅仅由 一些头文件组成。在使用该库的某个功能时,包含需要的头文件即可。该库中的所有类型 与函数都在名字空间(namespace)thrust中定义,所以都以thrust::开头。用名字空间 的目的是避免名字冲突。例如,Thrust中的thrust::sort和STL中的std::sort就不会 发生名字冲突。

CUDA编程(十三) CUDA标准库与Thrust库_第2张图片

算法

CUDA编程(十三) CUDA标准库与Thrust库_第3张图片

cuBLAS库

cuBLAS 是BLAS在CUDA运行时的实现。BLAS的全称是basiclinearalgebrasubrou tines(或者 basic linear algebra subprograms),即基本线性代数子程序。

CUDA编程(十三) CUDA标准库与Thrust库_第4张图片

CUDA编程(十三) CUDA标准库与Thrust库_第5张图片

cuSolver库

和cuBLAS类似,cuSOLVER是一个线性代数方面的CUDA库。相对于cuBLAS,cu Solver 专注于一些比较高级的线性代数方面的计算,如矩阵求逆和矩阵对角化。正因为比较 高级,所以cuSolver库的实现是基于cuBLAS和cuSPARSE两个更基础的库的。cuSolver的 功能类似于Fortran 中的LAPACK库。LAPACK是LinearAlgebra PACKage 的简称,即一 个线性代数库。

CUDA编程(十三) CUDA标准库与Thrust库_第6张图片

uSolver 库函数倾向于使用异步执行。为了保证一个cuSolver函数的工作已经完成,可 以使用cudaDeviceSynchronize() 函数进行同步。在GPU中执行的cuSolver库函数要求相关 的数据已经在设备准备好。用户负责主机与设备之间的传输工作。如果用阻塞的cudaMem cpy() 函数传输数据,则在传输数据前没有必要显示地同步。

cuRAND库

这是一个与随机数生成有关的库。该库产生的随机数有伪随机数(pseudorandomnum bers)和准随机数(quasirandomnumbers)之分,但我们只关注伪随机数。伪随机数序列是 用某种确定性算法生成的,且满足大部分真正的随机数序列所满足的统计性质。。它在很多 计算机模拟,特别是蒙特卡罗模拟中应用广泛。

在cuRAND库中,提供了两种API:主机API和设备API。

首先要在相关源代码中包含头文件curand.h

cuFFT库

对一维或多维信号进行离散傅里叶变换的FFT变换自身具有可“分治”实现的特点,因此能高效地在GPU平台上实现。CUDA提供了封装好的CUFFT库,它提供了与CPU上的FFTW库相似的接口,能够让使用者轻易地挖掘GPU的强大浮点处理能力,又不用自己去实现专门的FFT内核函数。使用者通过调用CUFFT库的API函数,即可完成FFT变换。

 常见的FFT库在功能上有很多不同。有些库采用了基2变换,只能处理长度为2的指数的FFT,而其他的一些可以处理任意长度的FFT。CUFFT4.0提供了以下功能:

(1) 对实数或复数进行一维、二维或三维离散傅里叶变换;

(2) 可以同时并行处理一批一维离散傅里叶变换;

(3) 对任意维的离散傅里叶变换,单精度最大长度可达到6400万,双精度最大长度可达到12800万(实际长度受限于GPU存储器的可用大小);

(4) 对实数或复数进行的FFT,结果输出位置可以和输入位置相同(原地变换),也可以不同;

(5) 可在兼容硬件(GT200以及之后的GPU)上运行双精度的变换;

(6)支持流执行:数据传输过程中可以同时执行计算过程。

详细看这篇博客,我后续会实现:CUDA C编程(二十六)cuFFT库-CSDN博客

你可能感兴趣的:(人工智能,深度学习)