CUDA学习之浅谈cuBLAS

_梦魇花葬 2014-05-23 04:44:11
加精
各位小伙伴们~!今天我们来谈谈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版块才能越办越好~!
再次感谢大家!
...全文
6983 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
baiwy512 2016-09-02
  • 打赏
  • 举报
回复
楼主你好,我比较了相同的矩阵分别通过cublasDgemm和cublasXtDgemm实现并测试性能发现cublasXt居然比L3的cuBLAS慢上10倍左右,我想请教下楼主这其中的原因。 还有一个问题想请教楼主,关于cublasXtDeviceSelect函数中参数,我是这样使用的, int deviceID[ ] = {0,1}; cublasXtDeviceSelect (handle, 2 ,deviceID); 但是我在跑这个程序时却报这个错:Segmentation fault,请楼主看看会有什么可能的原因。 谢谢!
  • 打赏
  • 举报
回复
楼主,请教一下~CUBLAS库中的函数只能主机代码调用么?kernel里面可不可以?在线等
碧海凌云 2014-07-18
  • 打赏
  • 举报
回复
_梦魇花葬 2014-07-18
  • 打赏
  • 举报
回复
有什么问题,可以提出来的!~~ 大家一起交流,一起成长
x7673 2014-07-17
  • 打赏
  • 举报
回复
此文很有用。感恩。
AnotherBUPT 2014-05-26
  • 打赏
  • 举报
回复
_梦魇花葬 2014-05-26
  • 打赏
  • 举报
回复
引用 28 楼 JacksonRuan 的回复:
感谢楼主回复!
今后可以多来CSDN提提关羽GPU和CUDA的问题,本人会尽能力,快速、准确的解答的
JacksonRuan 2014-05-26
  • 打赏
  • 举报
回复
感谢楼主回复!
_梦魇花葬 2014-05-26
  • 打赏
  • 举报
回复
引用 26 楼 dell_00 的回复:
cuda更新太快了, 简直跟不上。
CUDA有一个弊端就是更新之后,程序不能向后兼容,需要根据新的API更新程序
dell_00 2014-05-26
  • 打赏
  • 举报
回复
cuda更新太快了, 简直跟不上。
_梦魇花葬 2014-05-26
  • 打赏
  • 举报
回复
引用 17 楼 jiangcaiyang123 的回复:
我落伍了,还在用CUDA5.5。CUBLAS是BLAS的CUDA版本。
CUDA 5.5 其实跟CUDA6.0的区别不是很大,CUDA 6.0的新特性需要有专门的GPU来支持,新特性的支持也不是很好,CUDA 5.5还是主流~
_梦魇花葬 2014-05-26
  • 打赏
  • 举报
回复
引用 20 楼 JacksonRuan 的回复:
[quote=引用 13 楼 sparrow986831 的回复:] [quote=引用 12 楼 nadleeh123 的回复:] [quote=引用 11 楼 bob76012 的回复:] [quote=引用 9 楼 nadleeh123 的回复:] 用于CUDA计算的卡是啥?专用的还是就是一般的
GTX系列都是有的[/quote]我意思是lz用的哪款[/quote] 本人现在使用的是GeForce GTX Titan[/quote] 请教一下楼主,普通的i3\i5\i7电脑主机是不是只要有pci接口和8pin电源口就能用GeForce GTX Titan? 那Tesla K40呢?也能用在普通的i3\i5\i7电脑主机上吗?抛开价格因素,为何你不选用Tesla呢? 谢谢解答![/quote] 另外,Tesla也是可以插上的,但散热是一个很大的问题。。
_梦魇花葬 2014-05-26
  • 打赏
  • 举报
回复
引用 20 楼 JacksonRuan 的回复:
[quote=引用 13 楼 sparrow986831 的回复:] [quote=引用 12 楼 nadleeh123 的回复:] [quote=引用 11 楼 bob76012 的回复:] [quote=引用 9 楼 nadleeh123 的回复:] 用于CUDA计算的卡是啥?专用的还是就是一般的
GTX系列都是有的[/quote]我意思是lz用的哪款[/quote] 本人现在使用的是GeForce GTX Titan[/quote] 请教一下楼主,普通的i3\i5\i7电脑主机是不是只要有pci接口和8pin电源口就能用GeForce GTX Titan? 那Tesla K40呢?也能用在普通的i3\i5\i7电脑主机上吗?抛开价格因素,为何你不选用Tesla呢? 谢谢解答![/quote] 可以,需要两个8pin电源接口~
linxxx3 2014-05-26
  • 打赏
  • 举报
回复
引用 20 楼 JacksonRuan 的回复:
[quote=引用 13 楼 sparrow986831 的回复:] [quote=引用 12 楼 nadleeh123 的回复:] [quote=引用 11 楼 bob76012 的回复:] [quote=引用 9 楼 nadleeh123 的回复:] 用于CUDA计算的卡是啥?专用的还是就是一般的
GTX系列都是有的[/quote]我意思是lz用的哪款[/quote] 本人现在使用的是GeForce GTX Titan[/quote] 请教一下楼主,普通的i3\i5\i7电脑主机是不是只要有pci接口和8pin电源口就能用GeForce GTX Titan? 那Tesla K40呢?也能用在普通的i3\i5\i7电脑主机上吗?抛开价格因素,为何你不选用Tesla呢? 谢谢解答![/quote] 可知K40单价近5W了,不是专业做数值计算的,普通单位都不会去买,何况个人
sichuanwww 2014-05-26
  • 打赏
  • 举报
回复
nettman 2014-05-25
  • 打赏
  • 举报
回复
JacksonRuan 2014-05-25
  • 打赏
  • 举报
回复
引用 13 楼 sparrow986831 的回复:
[quote=引用 12 楼 nadleeh123 的回复:] [quote=引用 11 楼 bob76012 的回复:] [quote=引用 9 楼 nadleeh123 的回复:] 用于CUDA计算的卡是啥?专用的还是就是一般的
GTX系列都是有的[/quote]我意思是lz用的哪款[/quote] 本人现在使用的是GeForce GTX Titan[/quote] 请教一下楼主,普通的i3\i5\i7电脑主机是不是只要有pci接口和8pin电源口就能用GeForce GTX Titan? 那Tesla K40呢?也能用在普通的i3\i5\i7电脑主机上吗?抛开价格因素,为何你不选用Tesla呢? 谢谢解答!
bob76012 2014-05-24
  • 打赏
  • 举报
回复
引用 9 楼 nadleeh123 的回复:
用于CUDA计算的卡是啥?专用的还是就是一般的
GTX系列都是有的
hugh_z 2014-05-24
  • 打赏
  • 举报
回复
learnig.
nadleeh 2014-05-24
  • 打赏
  • 举报
回复
引用 楼主 sparrow986831 的回复:
各位小伙伴们~!今天我们来谈谈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版块才能越办越好~! 再次感谢大家!
用于CUDA计算的卡是啥?专用的还是就是一般的
加载更多回复(13)

579

社区成员

发帖
与我相关
我的任务
社区描述
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。
社区管理员
  • CUDA编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧