CUDA学习之浅谈cuBLAS

     各位小伙伴们~!今天我们来谈谈CUDA中使用范围很广的一个编程库——cuBLAS。
        cuBLAS利用GPU加速向量、矩阵的线性运算。由于本人主要的研究方向是数据挖掘,在数据挖掘各种算法中,包含着很多的向量、矩阵运算额,而随着数据量的增大,普通的串行程序很难满足速度的要求,而又不能一味的使用Matlab(因为这样到企业中会被鄙视。。 ),多线程的程序又很难写,因此,使用CUDA自带的开发包cuBLAS和下一小节我们要谈的针对稀疏矩阵的cuSPARSE包,就成了一种很自然的应对方式。
        有的小伙伴又会有疑问了:数据量很大?内存能存下吗?你的显存能够存下那么大的矩阵或者向量吗? 这个问题的答案是:我们暂且认为内存可以存的下,但显存是存不下的(如果内存存不下,那么就需要一种硬盘到内存的调度算法,保证显存需要的数据是在内存的,因此又满足的上述的条件)。CUDA 6的开发包中,提供了一个新的API——CUBLASXT,它是在cuBLAS API的上层封装了一个矩阵分块算法,解决了上述显存不足的问题,但现有的CUBLASXT所提供的计算接口功能还比较有限,后面我们将会提到。
一、cuBLAS API
        我们进入正题,从正题上来看cuBLAS API,可以分为数据描述结构体、功能函数、level-1函数、level-2函数、level-3函数和类BLAS扩展函数。数据描述结构体包含了矩阵和向量结构的描述,比如存储矩阵的存储格式等;功能函数包括创建流、拷贝向量和矩阵到GPU等功能操作;从level-1到类BLAS扩展函数分别定义了向量-向量运算、向量矩阵运算、矩阵矩阵运算和补充的运算。通过查看cuBLAS文档,可以看到每个操作的输入和输出。整体上看,每个操作都有四种形式,分别对应四种数据类型。
        使用cuBLAS API有两个需要注意和小心的地方:
        1. cuBLAS继承了Fortran语言矩阵存储的特性——矩阵按列存储!这是个很重要的特性,还记得当年第一次使用cuBLAS API的时候,手动输入了两个小矩阵做矩阵乘法,得到的结果就是和手动计算的结果不同但又很相似,仔细观察过后,发现输入矩阵式按行存储的,矩阵转置后再相乘,就是cuBLAS计算出来的结果,瞬间恍然大悟!
        2. 对于矩阵操作来说,参数中有lda或者ldb,这是个什么东西,与m、n、k有什么区别呢?不知道小伙伴们对GPU对齐存储有没有印象~对齐存储能能够保证线程的对齐访问,降低访问次数。如果对齐存储了,会导致什么后果呢?就是实际存储的空间要比矩阵的维度大,因此lda,ldb就是描述实际存储空间的维度,这个值是可以从申请空间的函数中得到的;m、n、k就是矩阵所表现出的维度大小,正如文档中的参数描述部分写到的类似lda>=max(1, m)的要求。
实际使用cuBLAS还是很简单的,按照API将参数对应好,就可以了,而且速度是很快的。
PS:如果想要的操作在前3个level的API中没有找到,及得到类BLAS API中查查看~。
二、CUBLASXT API
        接下来谈谈CUDA6.0提出的CUBLASXT API。这个API解决了矩阵运算中由于矩阵过大,不能全部同时存储在GPU显存的问题。该API会自动的将矩阵分块,并根据用户设定的CPU-GPU运算百分比,在CPU-GPU平台下进行矩阵运算,这里的GPU可以是多于1个GPU。API同cuBLAS API很类似,只不过是多了用户设定块大小、CPU-GPU运算百分比、设备参数的过程。这么方便的算法有什么弊端吗?答案是:有。
        首先,现在能够支持CUBLASXT API的GPU设备还是比较少的,一块主板上至少要有一个Tesla K10或者GeForce GTX690的GPU才可以,另外,只有64位版本的CUDA才能支持该API。
        另外,矩阵运算的复杂度并没有降低,只是简单的将矩阵分块运算。不知道小伙伴们有没有了解过矩阵分块运算的strassen算法,该算法通过矩阵分块的方式将矩阵乘法O(n3)的复杂度降低到O(n2.81),毕竟数据量大的话,降低复杂度才是王道,而不是简单的将矩阵分块。
        相信Nvida公司能够将CUDA的cuBLAS包更加的完善,能够支持更多的设备,能够更方便的供用户使用,CUBLASXT就是一个很好的例子,已经给了大家很多的惊喜!
        非常感谢能够从头到尾看完的小伙伴们的支持,留下你看完该帖子的感受吧,可以是支持的,也可以是反对的,也可以是技术的交流~因为有你们的支持,CSDN CUDA版块才能越办越好~!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值