引言
Cusparse 库包含一些用于处理稀疏矩阵的线性代数基本子程序。该库基于NVIDIA CUDA运行时(CUDA Toolkit 的一部分)实现,设计用于C和C++语言调用,这些子程序可以分为四类:
l Level 1 进行稀疏向量和稠密向量之间的操作
l Level 2 进行稀疏矩阵和稠密向量之间的操作
l Level 3 进行稀疏矩阵和稠密向量集(也可以看做稠密矩阵)之间的操作
l 转换操作 允许不同矩阵格式之间进行转换
Cusparse 允许开发者进入NVIDIA GPU的计算资源,尽管并不自动执行多个图形处理单元。除非指定字符串DevHostPtr来特殊说明函数中的参数名,否则Cusparse API假定输入和输出数据位于GPU存储中。
例如:
函数 cusparse<t>doti()中的参数 *resultDevHostPtr。
开发者的任务在于使用独立的CUDA运行时API函数分配内存并在GPU存储和CPU存储之间复制数据。例如
CudaMalloc(),cudaFree(),cudaMemcpy()以及cudaMemcpyAsync().
Tips
Cusparse 库需要计算能力2.0或者更高的硬件支持,详见NVIDIACUDA C Programming Guide 附录A 给出的全部NVIDIA GPU计算能力列表。
1.1 命名规则
Cusparse库中的函数可用与float,double,cuComplex以及cuDoubleComplex数据类型。Level1~3的函数遵守以下命名规则:
cusparse<t>[<matrix dataformat>]<operation>[<output matrix data format>],其中,<t>可以是S,D,C,Z或者X,分别对应于数据类型float,double, cuComplex, cuDoubleComplex,以及泛型; <matrix dataformat>可以是dense,coo,csr,csc或者hyb,分别对应稠密,坐标,压缩的稀疏行,压缩的稀疏列以及混合存储格式;最后,<operation>可以是axpyi, doti, dotci, gthr, gthrz, roti或者 sctr,分别对应Level1的函数,也可以是mv或者sv,对应level2的函数,以及mm或者sm对应level3的函数。
所有这些函数都有返回类型cusparseStatus_t,更多细节在后面章节。
1.2 异步执行
Cusparse库的函数对于主机异步执行并且在结果准备好之前将控制返回给主机上的应用程序。开发者可以使用cudaDeviceSynchronize()函数来确保特定的Cusparse 库例程的执行已完成。开发者还可以使用cudaMemcpy()例程将数据从设备复制到主机,反之亦然,cudaMemcpyDeviceToHost和cudaMemcpyHostToDevice分别使用参数。在这种情况下,cudaDeviceSynchronize() 的调用,因为对与上述参数cudaMemcpy() 的调用阻塞和完成只有当结果在主机上准备好的时候。
1.3 静态库支持
从6.5版本开始,cusparse 库也交付了静态形式 libcusparse_static.a在Linux和Mac OS. 静态Cusparse库和其他静态数学库依赖于一个常见的线程抽象层库libculibos.a(Linux和Mac OS)和culibos.lib(Windows).
例如
在linux中,编译一个使用cusparse动态库的小程序,会用到下面的命令:
nvcc myCusparseApp.c –lcusparse –omyCusparseApp
如果用静态库,则必须使用下面的命令
nvcc myCusparseApp.c -lcusparse_static-lculibos -o myCusparseApp
也可以使用本地主机的编译器,取决于主机的操作系统,在linking line上可能需要一些额外的库比如pthread或者dl,在Linux上,建议使用一下命令:
g++ myCusparseApp.c -lcusparse_static-lculibos -lcudart_static -
lpthread -ldl -I<cuda-toolkit-path>/include -L <cuda-toolkit-path>/lib64 -o
myCusparseApp
注意在后者的情况下,不需要cuda库,如果需要时CUDA运行时将会尝试显式打开cuda库。如果一个操作系统中未安装cuda驱动程序,这将允许应用程序正常地管理这个问题并潜在运行,如果CPU-only路径不可用。
水平有限,仅供参考,欢迎批评指正。
参考文档:http://docs.nvidia.com/cuda/cusparse/index.html#axzz49iopDHZG