玩玩CUBLAS(3)——level2函数

转载请注明出处:http://blog.csdn.net/bendanban/article/details/8897735

/*=======================================================================
* 今天天气不错,是被吵起来的。
=======================================================================*/

今天我们会介绍局矩阵,BLAS中level2的函数包含了矩阵与向量的操作。

我觉得cublas库中最烦人的是按列存储数组,并且从1开始索引。不过关系也不是很大,我们只要关注自己的算法就好了,保持对数学的理解,不要过多关注存储结构就好了。

3.1 C或C++使用CUBLAS时,可以考虑使用的宏函数

#define IDX2C(i,j,ld) (((j)*(ld))+(i))

这个宏表示, 矩阵第i行第j列的元素在C语言中 数组存储位置的索引,ld表示的是 矩阵的第一维的元素个数,就是 矩阵的行数


使用这种宏的场景描述:

  • 你要操作的矩阵是为CUBLAS库函数准备的。就是说你正在准备将这个矩阵作为参数传递给CUBLAS的库函数。
  • 你从CUBLAS中得到了某个矩阵,你可以使用这个宏来索引相应的元素。

3.2 如果我用C已经处理了一个矩阵,这个矩阵是按行存储的

我们假设你已经用C语言处理过的矩阵为float *A, 假设在数学上,它是一个M X N的矩阵(M行,N列),那么C‘语言和CUBLAS如何理解同一块存储为同一个数学含义呢?

C语言是按行存储的,所以,在内存中,A的首行首先被连续存储,然后是首行后的一行再被连续的存储,依次类推,我们称A的这个存储结构为Host_A。

那么CUBLAS会如何理解HOST_A呢?

CUBLAS中,矩阵会被按照列存储,所以CUBLAS也是按照 按列存储的方式理解内存中的数据的,如果我们告诉CUBLAS,HOST_A存储的是一个M X N的矩阵,那么,CUBLAS会把连续存储的首次M个元素作为矩阵首列的元素存储单元,按照我们原先C中的使用,这显然是不对的,因为C中,我们认为HOST_A的首N个连续存储单元为A的首行元素。

看看图1中的描述,大家可能更好的理解一下。


图1 对同一块内存的CUBLAS与C语言的不同理解。矩阵是2行3列的。

图1可以知道CUBLAS完全理解错了我原先的C语言数据。这样想,如果我们告诉CUBLAS我们给他的是一个3X2的矩阵,那么内存的0到2将会被看做矩阵的第一列,3到5将会被看做第二列&

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值