文章目录

  • 一、什么是CUBLAS
    • CUBLAS实现矩阵乘法
    • CUBLAS中的Leading Dimension
    • CUBLAS LEVEL3函数 : 矩阵矩阵
    • CUBLAS实现矩阵乘法
  • 二、cuDNN
    • 使用CuDNN实现卷积神经网络
  • 四、CUBLAS和CUDNN实践

一、什么是CUBLAS

cuBLAS是BLAS的一个实现。BLAS是一个经典的线性代数库,他允许用户使用NVIDIA的GPU的计算资源。在使用cuBLAS的时候,应用程序应该分配矩阵或向量需要的GPU内存空间,并加载数据,调用所需要的cuBLAS函数,然后从GPU的内存空间上传计算结果到主机,cuBLAS API也提供了一些帮助函数来写或者从GPU中读取数据。

在使用cuBLAS的时候,cuBLAS使用的是列优先的数组,索引以1为基准。
相关头文件为 “cublas_v2.h”
其包含三类函数(向量标量,向量矩阵,矩阵矩阵)

CUBLAS实现矩阵乘法

cublasHandle_t handle;
cublasCreate(&handle);

//调用计算函数
cublasSgemm(handle, CUBLAS_OP_N, CUBLAS_OP_N, m, n, k, &alpha, *B, n, *A, k, &beta, *C, n);

//销毁句柄
cublasDestroy(handle);

…//回收计算结果,顺序可以和销毁句柄互换

CUBLAS中的Leading Dimension

在CUBLAS中,矩阵可以以行主序(row-major order)或列主序(column-major order)存储。了解leading dimension对于理解CUBLAS函数的参数传递和性能优化至关重要。

对于二维矩阵,leading dimension是矩阵的行数(row-major order)或列数(column-major order)。

列主序(column-major order,也称为Fortran顺序):在这种顺序中,矩阵的列按连续内存地址存储。对于列主序矩阵,leading dimension是矩阵的行数。
例如,对于一个大小为MxN的列主序矩阵A,A(i, j)的内存位置可以通过以下计算得出:

location = i + j * M
其中i表示行索引,j表示列索引(从0开始)。

行主序(row-major order,也称为C顺序):在这种顺序中,矩阵的行按连续内存地址存储。对于行主序矩阵,leading dimension是矩阵的列数。
例如,对于一个大小为MxN的行主序矩阵A,A(i, j)的内存位置可以通过以下计算得出:

location = i * N + j
其中i表示行索引,j表示列索引(从0开始)。

在使用CUBLAS函数时,需要指定leading dimension,以便库可以正确解释矩阵数据。例如,在CUBLAS的cublasDgemm函数中,用于矩阵乘法的参数lda、ldb和ldc分别表示输入矩阵A、B和输出矩阵C的leading dimensions。

在实践中,CUBLAS主要使用列主序(Fortran顺序)存储矩阵。在调用CUBLAS函数时,请确保矩阵以正确的顺序存储,并正确设置leading dimension。

CUBLAS LEVEL3函数 : 矩阵矩阵

cublasStatus_t cublasSgemm(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, floatC, int ldc) • 实现功能: C = alpha * op ( A ) * op ( B ) + beta * C
• 参数意义
• alpha和beta是标量, A B C是以列优先存储的矩阵
• 如果 transa的参数是CUBLAS_OP_N 则op(A) = A ,如果是CUBLAS_OP_T 则op(A)=A的转置
• 如果 transb的参数是CUBLAS_OP_N 则op(B) = B ,如果是CUBLAS_OP_T 则op(B)=B的转置
• Lda/Ldb:A/B的leading dimension,若转置按行优先,则leading dimension为A/B的列数
• Ldc:C的leading dimension,C矩阵一定按列优先,则leading dimension为C的行数

CUBLAS实现矩阵乘法

CUBLAS实现Batch版本矩阵乘法,如下图,最终结果是 [[c1,c2],[c3,c4]]矩阵

二、cuDNN

对于一些比较高级的算子,比如卷积算子,cudnn能够提供更加便捷的操作:
NVIDIA cuDNN是用于深度神经网络的GPU加速库。它强调性能、易用性和低内存开销
• NVIDIA cuDNN可以集成到更高级别的机器学习框架中
• 常用神经网络组件
• 常用语前向后向卷积网络
• 前像后向pooling
• 前向后向softmax
• 前向后向神经元激活
• Rectified linear (ReLU)、Hyperbolic tangent (TANH)
• Tensor transformation functions
• LRN, LCN and batch normalization forward and backward
• 头文件 include "cudnn.h“
• 学习网站: https://docs.nvidia.com/deeplearning/cudnn/

使用CuDNN实现卷积神经网络

创建cuDNN句柄
• cudnnStatus_t cudnnCreate(cudnnHandle_t *handle)

以Host方式调用在Device上运行的函数
• 比如卷积运算:cudnnConvolutionForward等

释放cuDNN句柄
• cudnnStatus_t cudnnDestroy(cudnnHandle_t handle)

将CUDA流设置&返回成cudnn句柄
• cudnnStatus_t cudnnSetStream(cudnnHandle_t handle, cudaStream_t streamId)
• cudnnStatus_t cudnnGetStream(cudnnHandle_t handle, cudaStream_t *streamId)

除此之外,cudnn还可以很方便地实现RNN,Softmax,Batch Normalization, ReLU, Sigmoid,Layer Normalization等等

四、CUBLAS和CUDNN实践

使用CUBLAS实现矩阵乘法:

#include<bits/stdc++.h>
#include "cublas_v2.h"
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
using namespace std;
void checkResult(vector<double> h_C,vector<double> h_C_cpu){double epsilon = 5;bool match = 1;for(size_t i = 0;i < h_C.size();i++){if(abs(h_C[i] - h_C_cpu[i]) > epsilon){match = 0;cout<<"Arrays do not match!"<<endl;cout<<"h_C["<<i<<"] = "<<h_C[i]<<", h_C_cpu["<<i<<"] = "<<h_C_cpu[i]<<endl;break;}}if(match) cout<<"Arrays match."<<endl;
}
vector<double> matrixMulOnHost(vector<double> &A,vector<double> &B,int n){vector<double> C(n * n);for(size_t i = 0;i < n;i++){for(size_t j = 0;j < n;j++){double sum = 0;for(size_t k = 0;k < n;k++){double a = A[i + k * n];double b = B[k + n * j];sum += a * b;}C[i + n * j] = sum;}}return C;
}
int main(int argc,char *argv[]){int n = atoi(argv[1]);vector<double> h_A(n * n);vector<double> h_B(n * n);for(size_t i = 0;i< n ;i++){for(size_t j = 0; j < n ; j++){h_A[i + j * n] = static_cast<double>(rand()) / 100;h_B[i + j * n] = static_cast<double>(rand()) / 100;}}//Allocate Device Memory for matrix A and B and C double *d_A,*d_B,*d_C; cudaMalloc(&d_A,n * n * sizeof(double));cudaMalloc(&d_B,n * n * sizeof(double));cudaMalloc(&d_C,n * n * sizeof(double)); //copy matrix A and B from host to the device cudaMemcpy(d_A,h_A.data(),n * n * sizeof(double),cudaMemcpyHostToDevice);cudaMemcpy(d_B,h_B.data(),n * n * sizeof(double),cudaMemcpyHostToDevice); //Create a CUBLAS handle cublasHandle_t handle; cublasCreate(&handle); //Setup alpha and beta double alpha = 1.0;double beta = 0.0; cudaEvent_t start,stop;cudaEventCreate(&start);cudaEventCreate(&stop);cudaEventRecord(start,0);//Perform matrix multiplication (d_C = alpha * d_A * d_B + beta * d_C) using CUBLAS //d_A : [m,k], d_B : [k,n], d_C : [m,n]cublasDgemm(handle,CUBLAS_OP_N, // No TransitionCUBLAS_OP_N, // No Transitionn, // mn, // nn, // k&alpha, // alpha d_A, // d_An, // lda d_B, // d_Bn, // ldb&beta, // betad_C, // d_Cn // ldc);//Allocate host memory for the result matrix C and copy it from device to host memory cudaEventRecord(stop,0);cudaEventSynchronize(stop);float elapsedTime;cudaEventElapsedTime(&elapsedTime,start,stop);cout<<"Time taken for matrix multiplication of "<<n<<" * "<<n<<" matrix is "<<elapsedTime<<" ms"<<endl;vector<double> h_C(n * n); cudaMemcpy(h_C.data(),d_C,n * n * sizeof(double),cudaMemcpyDeviceToHost); vector<double> h_C_host = matrixMulOnHost(h_A,h_B,n);checkResult(h_C,h_C_host);//Free device memory cudaFree(d_A);cudaFree(d_B);cudaFree(d_C);//Destroy the CUBLAS handle cublasDestroy(handle);return 0;}

这段代码的运行结果是:
Time taken for matrix multiplication of 1024 * 1024 matrix is 5.38173 ms


CUBLAS 和 CUDNN相关推荐

  1. cuDNN 的初始设计

    cuDNN V1.0在2014年的发布,并集成到 Caffe.Paddle 等深度学习框架中.论文 cuDNN: Efficient Primitives for Deep Learning 介绍了 ...

  2. TVM代码生成codegen

    TVM代码生成codegen 硬件后端提供程序(例如Intel,NVIDIA,ARM等),提供诸如cuBLAS或cuDNN之类的内核库以及许多常用的深度学习内核,或者提供框架例,如带有图形引擎的DNN ...

  3. 将代码生成器带入TVM

    将代码生成器带入TVM 为了使数据科学家不必担心开发新模型时的性能,硬件后端提供程序(例如Intel,NVIDIA,ARM等)可以提供诸如cuBLAS或cuDNN之类的内核库以及许多常用的深度学习内核 ...

  4. 30亿美金投入!一文读懂英伟达性能凶残的Tesla V100牛在哪?

    来源:智东西 概要:AI已无处不在,两股力量正推动计算机领域的未来. GTC CHINA 2017大会上,英伟达创始人兼CEO黄仁勋表示,AI已无处不在,两股力量正推动计算机领域的未来.第一.摩尔定律 ...

  5. 深度学习框架太抽象?其实不外乎这五大核心组件

    许多初学者觉得深度学习框架抽象,虽然调用了几个函数/方法,计算了几个数学难题,但始终不能理解这些框架的全貌. 为了更好地认识深度学习框架,也为了给一些想要自己亲手搭建深度学习框架的朋友提供一些基础性的 ...

  6. Py之cupy:cupy的简介、安装、使用方法之详细攻略

    Py之cupy:cupy的简介.安装.使用方法之详细攻略 目录 cupy的简介 cupy的安装 cupy的使用方法 cupy的简介 CuPy: NumPy-like API accelerated w ...

  7. 飞桨全新发布,核心框架首次完整公开解读

    导读:11 月 5 日,在 Wave Summit+2019 深度学习开发者峰会上,飞桨全新发布和重要升级了最新的 21 项进展,在深度学习开发者社区引起了巨大的反响.很多未到场的开发者觉得遗憾,希望 ...

  8. Kubernetes-native 弹性分布式深度学习系统

    9月11日,蚂蚁金服在 Google Developer Day Shanghai 2019 上宣布开源了基于 TensorFlow 2.0 eager execution 的分布式深度学习系统 El ...

  9. ElasticDL:首个基于 TensorFlow 实现弹性深度学习的开源系统

    9 月 11 日,蚂蚁金服开源了 ElasticDL 项目,据悉这是业界首个基于 TensorFlow 实现弹性深度学习的开源系统. Google Brain 成员 Martin Wicke 此前在公 ...

最新文章

  1. Maven中jar版本冲突问题的解决
  2. 下载服务器文件到本地
  3. openresty开发系列2--nginx的简单安装,正向、反向代理及常用命令和信号控制介绍...
  4. Hibernate关键字inverse和cascade
  5. 创客运动引发第三次工业革命
  6. html div剩下高度设置,使div填充剩余屏幕空间的高度
  7. 如何通过命令终端访问本地/局域网/远程的MySQL数据库_访问数据库_连接数据库_登录数据库
  8. Python 面向对象之双下方法,内置函数
  9. ML--K-近邻算法
  10. python opencv双目测距_使用OpenCV/python进行双目测距
  11. eda交通灯控制器波形输入_EDA 基于quartus平台制作的步行街自助式交通灯控制器(含vhdl程序、波形图、及电路原理图)+课程设计报告...
  12. python爬虫下载小说
  13. python数据分析与可视化从入门到精通_零基础学Python爬虫、数据分析与可视化从入门到精通...
  14. 萌系外表+丰富功能,i宝机器人成CES人气展品
  15. python实现excel表格按内容模块倒序排列
  16. 加工生产调度(Johnson算法 双机流水作业调度问题)
  17. JAVA修炼秘籍第六章《鏖战》
  18. 科学种草 | 破解小红书素人爆文的奥秘
  19. 用python爬虫制作图片下载器(超有趣!)
  20. 职场中如何谈加薪,这么谈,成了也等于失败

热门文章

  1. REXROTH力士乐溢流阀ZDB6VP2-42/315V
  2. 更新日志 - fir.im 回归,上线 Android Studio 插件
  3. android模拟器IP地址
  4. vue http请求 报错 415 ;400
  5. oracle使用hint启用并行,oracle hint 和 并行
  6. 国家网络安全宣传周之代表厂商盘点——上海浪擎引领国内灾备产业发展潮流...
  7. 详解国密SM2的加密和解密
  8. MSM8909平台UIM驱动流程
  9. #标题 已知从键盘上任意输入一个3位整数,编译计算并输出它的逆序数
  10. 悬镜安全强烈推荐丨内网安全检查/渗透总结,先收藏再说