CUDA入门和网络加速学习(四)

news/2024/11/30 14:45:49/

0. 简介

最近作者希望系统性的去学习一下CUDA加速的相关知识,正好看到深蓝学院有这一门课程。所以这里作者以此课程来作为主线来进行记录分享,方便能给CUDA网络加速学习的萌新们去提供一定的帮助。

1. Cublas概念

cuBLAS是一个BLAS的实现,允许用户使用NVIDIA的GPU的计算资源。使用cuBLAS的时候,应用程序应该分配矩阵或向量所需的GPU内存空间,并加载数据,调用所需的cuBLAS函数,然后从GPU的内存空间上传计算结果至主机,cuBLASAPI也提供一些帮助函数来写或者读取数据从GPU中。它包含两套API,一个是常用到的cuBLAS API,需要用户自己分配GPU内存空间,按照规定格式填入数据,;还有一套CUBLASXT API,可以分配数据在CPU端,然后调用函数,它会自动管理内存、执行计算。既然都用cuda了,其实还是用第一套API多一点。

一般对于Cublas函数的学习,我们会在这个网站上学习。

最初,为了尽可能地兼容Fortran语言环境,cuBLAS库被设计成列优先存储的数据格式,不过C/C++是行优先的,我们比较好理解的也是行优先的格式,所以需要费点心思在数据格式上,同时Cublas是索引以1为基准的。头文件为include "cublas_v2.h“。主要适用于三类函数(向量标量、向量矩阵、矩阵矩阵)。

在这里插入图片描述

2. Cublas实现矩阵乘法

现在装好cuda会自带cuBLAS库的。相比与之前的旧库,现在的cuBLAS矩阵运算库有些新特性:

  1. handle更加可控,更加适用于多GPU或CPU多进程。handle是cuBLAS库上下文的句柄,可以把数据、函数等等连接在一起,就想Cuda的stream一样。现在,新版本的cuBLAS可以用简单的函数创建句柄,然后把它绑定到不同的函数、数据上去;非常方便。
  2. 所有的函数都可以返回错误标识符cublasStatus_t了。可以更加方便调试,发现代码的具体错误原因。
  3. 函数cublasAlloc() and cublasFree()被摒弃了。

目前整个流程大概如下:

...// 准备A, B, C 以及使用的线程网格、线程块的尺寸
// 创建句柄
cublasHandle_thandle;
cublasCreate(&handle);
// 调用计算函数
cublasSgemm(handle, CUBLAS_OP_N, CUBLAS_OP_N, m, n, k, &alpha, *B, n, *A, k, &beta, *C, n);
// 销毁句柄
cublasDestroy(handle);
...// 回收计算结果,顺序可以和销毁句柄交换

大多数用于计算的cuBLAS函数名字里都包含数据类型信息,表明这个函数专门用于处理float、double还是什么数据类型的。
在这里插入图片描述

2.1 Cublaslevel1函数:标量

cublasStatus_t cublasIsamax(cublasHandle_t handle, int n, const float *x, int incx, int *result)
cublasStatus_t cublasIsamin(cublasHandle_t handle, int n, const float *x, int incx, int *result)

实现功能:

result = max/min( x )

参数意义:

Incx:x的存储间隔

2.2 Cublaslevel2函数:矩阵向量

cublasStatus_t cublasSgemv(cublasHandle_t handle, cublasOperation_t trans, int m, int n, const float *alpha, const float *A, int lda, const float *x, int incx, const float *beta, float *y, int incy)

实现功能:

y = alpha * op ( A ) * x + beta * y

参数意义:

Lda:A的leading dimension,若转置按行优先,则leadingdimension为A的列数
Incx/incy:x/y的存储间隔

2.3 Cublaslevel3函数:矩阵矩阵

cublasStatus_tcublasSgemm(cublasHandle_thandle,
cublasOperation_ttransa, cublasOperation_ttransb,
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 * 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,若转置按行优先,则leadingdimension为A/B的列数

Ldc:C的leading dimension,C矩阵一定按列优先,则leading dimension为C的行数

3. cuBLAS代码常用函数

3.1 cublasSetMatrix()

先看个函数cublasSetMatrix():

cublasSetMatrix(int rows, int cols, int elemSize, const void *A, 
int lda, void *B, int ldb)

这个函数可以把CPU上的矩阵A拷贝到GPU上的矩阵B,两个矩阵都是列优先存储的格式。lda是A的leading dimension ,既然是列优先,那么就是A的行数(A的一列有多少个元素);ldb同理。与 cublasGetMatrix()函数作用相反

3.2 cublasSscal()

传入矩阵x,总大小为n,每隔incx个数,就乘以alpha。很简单的函数,纯粹为了演示。

cublasSscal(cublasHandle_t handle, int n,const float *alpha,
float *x, int incx)

3.3 cublasCreate()和cublasDestroy()

cublasCreate()和cublasDestroy()为上下文管理函数。使用cuBLAS库函数,必须初始化一个句柄来管理cuBLAS上下文。函数为cublasCreate(),销毁的函数为cublasDestroy()。这些操作全部需要显式的定义,这样用户同时创建多个handle,绑定到不同的GPU上去,执行不同的运算,这样多个handle之间的计算工作就可以互不影响。

cublasCreate(cublasHandle_t *handle)

官方手册建议尽可能少的创建handle,并且在运行任何cuBLAS库函数之前创建好handle。handle会和当前的device(当前的GPU显卡)绑定,如果有多块GPU,你可以为每一块GPU创建一个handle。或者只有一个GPU,你也可以创建多个handle与之绑定。

cublasDestroy(cublasHandle_t handle)

销毁handle时,会隐性调用同步阻塞函数cublasDeviceSynchronize()。

3.4 cublasSetVector()

…详情请参照古月居


http://www.ppmy.cn/news/575938.html

相关文章

基于Cortex-M3的IP软核实现神经网络加速的SoC设计 (0)准备工作

基于Cortex-M3的IP软核实现神经网络加速的SoC设计 (0)准备工作 关键字&#xff1a;神经网络加速&#xff0c;SoC&#xff0c;ARM处理器&#xff0c;Designstart <0>简介 最近人工智能比较火&#xff0c;但是网上有关神经网络加速的硬件电路设计相关博文比较少&#xf…

神经网络的加速

背景 目前神经网络应用在大多数的场景&#xff0c;包括计算机视觉&#xff08;包括目标识别、检测&#xff09;&#xff0c;推荐系统&#xff0c;大型的科学计算等。神经网络的计算本质上是张量计算&#xff08;tensor&#xff09;&#xff0c;因此为了加速神经网络的计算&…

Debian/Ubuntu网络加速–安装BBR增强版

BBR具体是什么&#xff0c;google去吧&#xff0c;这里简单说下&#xff0c;BBR就是个单边加速linux网络速度的一个算法。详细操作比较复杂&#xff0c;偷了个大佬的脚本&#xff0c;我长期也用这个很方便 很稳定&#xff0c;这里精简下吧。 注意&#xff1a; ①openvz的虚拟…

More is Less: 卷积神经网络加速

论文: More is Less: A More Complicated Network with Less Inference Complexity pdf: https://arxiv.org/pdf/1703.08651.pdf (祖师爷颜水成老师的文章&#xff0c;在valse2017上专门介绍了这个工作&#xff0c;所以拿来学习一番) 论文motivation和贡献 卷积神经网络虽然效…

阿里云跨境游戏及电商网络加速方案(全球加速和CDN)

一.方案场景 此方案适用于跨境游戏&#xff0c;或跨境电商场景全球网络加速&#xff0c;提升用户游戏&#xff0c;购物体验&#xff0c;提高网络速度及稳定性。 二.方案架构 涉及产品及其作用 全球加速&#xff08;GA&#xff09;&#xff1a;用于加速杭州地域客户访问美国服务…

基于FPGA的卷积神经网络加速器(绪论)

从今天开始&#xff0c;将会不定期分享论文的解读&#xff0c;学习进程。目前&#xff0c;主要学习Verilog&#xff0c;争取在寒假结束之前搭建简单的神经网络加速器。 VerilogTensflow人工智能模型与算法原理pythonanaconda 这些就是目前我能想到的学习方向&#xff0c;由于实…

fpga卷积神经网络加速器,FPGA卷积神经网络综述

如何使用FPGA加速机器学习算法 如何使用FPGA加速机器学习算法 当前&#xff0c;AI因为其CNN(卷积神经网络)算法出色的表现在图像识别领域占有举足轻重的地位。基本的CNN算法需要大量的计算和数据重用&#xff0c;非常适合使用FPGA来实现。 上个月&#xff0c;RalphWittig(Xi…

基于FPGA的万兆以太网UDP/TCP 网络加速协议栈

丰科卓辰10G 全硬件UDP/TCP 网络加速协议栈是一款低资源、高灵活性的网络加速IP&#xff0c;采用FPGA内部逻辑为客户实现高速传输&#xff0c;网络数据采集、存储提供相应的网络协议栈加速。该IP无需CPU参与&#xff0c;解决了高速网络数据环境下由于CPU中断过多、负载过大与多…