cuBLAS是cuda封装好的一个数学库,头文件为<cublas_v2.h>,其中的矩阵乘法函数是我们做深度学习绕不开的函数,

下面是一个常用的函数,后面又有扩展,但是核心函数使用逻辑一样。

#define cublasSgemm cublasSgemm_v2
CUBLASAPI cublasStatus_t CUBLASWINAPI cublasSgemm_v2
(cublasHandle_t handle,cublasOperation_t transa, cublasOperation_t transb,int m, int n, int k,const float *alpha,const float *A, int lda,const float *B, int ldb,const float *beta,float *C, int ldc
);
下面对容易犯错的函数参数进行总结,估计看完后还是一脸蒙逼,所以看看下面的
实战操作就可以明白每个参数真实的含义:C = alpha*A*B + beta*C(看起来没啥问题,使用起来呵呵哒)cublasHandle_t handle:调用 cuBLAS 库时的句柄
cublasOperation_t transa, 是否对A转置
cublasOperation_t transb, 是否对B转置
int m, int n, int k, mnk表示矩阵计算时候的维度
const float *alpha,
const float *A, //矩阵A
int lda,  //按列读取的长度
const float *B,
int ldb,
const float *beta,
float *C,
int ldc ldc:按列取的个数

     一、本来以为的操作

cublasSgemm(handle, CUBLAS_OP_N, CUBLAS_OP_N, 2 ,4, 3, &alpha, *A, 2, *B, 3, &beta, *C, 2);

cublas和mkl里面的cblas的区别在于,这个cublas不能按行存储,只能选择按列存储,而c++/c的数据存储格式都是按行存储的,但是他这个API不管,人家就是按你是列优先的储存格式,所以在实际使用的时候会一直出错,为此需要理清楚这个函数的每个

参数的意思,避免一直出现问题。

首先来看int m,int n, int k这三个参数,这三个参数依次代表的是A1的行,B1的列,A1的列(B1的行)

lda: 这个参数就比较魔幻,A(c/c++是按行存的)进来的数据【1,2,3,4,5,6】按照每lda一列排好,得到A1;

ldb:B同上

ldc:按列从C1中取数,每次取ldc的长度,只能大于等于C1的行数,当大于C1时,c1单列由于数字不够会补零。

可以看到呀,这个函数一旦进入,其实就给数据调换了位置,因为一个协议是按列,一个协议是按行,所以c/c++在调用

这个函数时就有问题,而CUBLAS_OP_T (转置)和CUBLS_OP_N(不转置)利用这两个参数是不是就可以解决这个问题?

二、思考后的操作

cublasSgemm(handle, CUBLAS_OP_T, CUBLAS_OP_T, 2, 4, 3, &alpha, d_A, 3, d_B, 4, &beta, d_C, 2);

c1---行优先--->输出c2[[38 83 44 98],[50 113 56 128]]

所以结果还是和预期结果不一致,为此,来了一个骚操作:

三、正确的操作

cublasSgemm(handle, CUBLAS_OP_N, CUBLAS_OP_N, 4, 2, 3, &alpha, *B, 4, *A, 3 , &beta, *C, 4);

结果正确,利用的是 A B = (BT AT)T,真是天秀。

附上代码:没有释放内存,随便做实验用的

#include <assert.h>
#include <iostream>
#include <cuda_runtime.h>
#include <cublas_v2.h>using namespace std;//cuBLAS代码
int main()
{
const float alpha = 1.0f;
const float beta  = 0.0f;
int m = 2, n = 4, k = 3;float A[6] = {1,2,3,4,5,6};
float B[12] = {1,2,3,4,5,6,7,8,9,10,11,12};
float *C;float* d_A,*d_B, *d_C;C = (float*)malloc(sizeof(float)*8);
cudaMalloc((void**)&d_A, sizeof(float)*6);
cudaMalloc((void**)&d_B, sizeof(float)*12);
cudaMalloc((void**)&d_C, sizeof(float)*8);cudaMemcpy(d_A, A, 6*sizeof(float),  cudaMemcpyHostToDevice);
cudaMemcpy(d_B, B, 12*sizeof(float), cudaMemcpyHostToDevice);cublasHandle_t handle;
cublasCreate(&handle);
cublasSgemm(handle, CUBLAS_OP_T, CUBLAS_OP_T, m, n, k, &alpha, d_A, 3, d_B, 4, &beta, d_C, 2);
cublasDestroy(handle);cudaMemcpy(C, d_C, 8*sizeof(float), cudaMemcpyDeviceToHost);for(int i=0; i<8; i++)
{cout<<C[i]<<endl;
}}

参考链接:https://www.cnblogs.com/cuancuancuanhao/p/7763256.html(有些结果有问题)

cuBLAS矩阵乘法相关推荐

  1. cublas 矩阵乘法

    cublas是cuda用来解决线性代数的问题的一个函数库,而且对于矩阵运算来说,其效率比大部分人自己写核函数高不少,只是cublas不同于C++,是列优先存储,因此参数一不小心设的不对,结果大不相同, ...

  2. 使用cublas实现矩阵乘法

    使用CUDA写一个矩阵乘法C = A X B(矩阵维度:A: M X K, B: K X N, C: M X N),当然可以自己写核函数,但效率不如CUDA自带的cublas算法效率高.使用cubla ...

  3. GTX 295 VS C1060 矩阵乘法测试(cublas)

    测试描述: 使用cublas库进行矩阵乘法测试 C=A*B, 矩阵AB 大小从128*128 到 16384*16384 float 类型 主要测试计算时间, 讨论在不同矩阵大小的情况下, 哪块卡更实 ...

  4. 使用blas做矩阵乘法

    原文:http://www.cnblogs.com/huashiyiqike/p/3871927.html 我没运行成功,报错: error while loading shared librarie ...

  5. 循环取矩阵的某行_1.2 震惊! 某大二本科生写的矩阵乘法吊打Mathematica-线性代数库BLAS-矩阵 (上)...

    本文是 1. 线性代数库BLAS​zhuanlan.zhihu.com 系列的第二篇, 将讲述矩阵类的结构和矩阵基础运算的AVX2加速算法. 1. 矩阵类的结构 在讲述矩阵各种算法之前很有必要详解一下 ...

  6. 稀疏矩阵加法运算_1.2 震惊! 某大二本科生写的矩阵乘法吊打Mathematica-线性代数库BLAS-矩阵 (上)...

    本文是 1. 线性代数库BLAS​zhuanlan.zhihu.com 系列的第二篇, 将讲述矩阵类的结构和矩阵基础运算的AVX2加速算法. 1. 矩阵类的结构 在讲述矩阵各种算法之前很有必要详解一下 ...

  7. C++、python、CUDA性能分析--矩阵乘法

    网上看到一个分析python.Numpy.C++.cuda.cuBLAS做矩阵运算性能的帖子,我觉得非常好.所以,就自己动手实测了一下.这才有了这篇文章.就算是给需要的朋友做个参考吧. ******* ...

  8. CUDA矩阵乘法优化

    前言 纸上的来终觉浅,绝知此事要躬行. naive写法 一个矩阵的乘法简单如下:C=A*B, 一般用gemm(A,B,C,M,N,K)来表示,其中的m,n,k代表的位置如下,默认是k表示消失的纬度. ...

  9. cuda矩阵相乘_CUDA入门实战2:将矩阵乘法速度提升5000倍

    本实验采用不同的方法来计算 8192 * 8192 的整型矩阵乘法运算. C语言版 C语言是大家公认的高性能语言,那我们就从C语言开始吧. // 用一位数组表示二维矩阵 mat1 = (int*) m ...

最新文章

  1. 博士旅程之前 -----转
  2. 《C++ Primer 4th》读书笔记 第6章-语句
  3. Spring-学习笔记04【Spring的常用注解】
  4. 全排列函数next_permutation
  5. 每天一道LeetCode-----有序数组循环右移n位后,寻找最小值,数组中可能包含重复元素
  6. idea创建maven web项目需要注意的一些细节
  7. SAP CRM enterprise search index调试细节
  8. 知乎高赞、高逼格 1024 程序员节礼物
  9. [转载] 民兵葛二蛋——第1集
  10. (转)一步一步Asp.Net MVC系列_权限管理之权限控制
  11. Android 原生 MediaPlayer 和 MediaCodec 的区别和联系(二)
  12. 二阶低通有源滤波器设计与仿真测试
  13. # Vue 组件开发打包、Vue 项目打包、js库组件库打包使用
  14. java exe 程序
  15. VC浏览器相关的学习(八)(截获IE网络访问)
  16. 解决接口慢的几种方法
  17. 数据结构—时间、空间复杂度
  18. 用自己训练的AI玩王者荣耀是什么体验?
  19. hive计算指定日期所在周的第一天和最后一天
  20. 微信 {errcode:48001,errmsg:api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]}

热门文章

  1. python 安装了不能用_不能用Cond安装任何东西
  2. 中基鸿业投资理财入门的六个小技巧
  3. php直播源码,css实现流星效果
  4. 4 个快速的 Python 编译器
  5. 股票入门基础知识31:日本蜡烛图——十字线形态
  6. 上一期文章说的关于PWN入门常见的问题
  7. 计算机中时钟符号在哪,汽车的仪表盘出现了一个时钟的标志,这是代表什么意思呢?请各位大神解救…...
  8. Pycharm破解方法注册码
  9. android listview预加载动画,Android开发Activity页面预加载
  10. 电脑端甘特图软件推荐,十分好用