Cuda 编程相关知识


前言

由于深度学习算法后续需要进行cuda加速,其中就涉及到了cuda编程。在此记录一下学习过程。

一、cuda软件层面和硬件层面相关知识

在这里只是简单的介绍一下,具体里面涉及到的共享内存、全局内存等其他博客都有很详细的介绍。比如:GPU存储器架构-- 全局内存 本地内存 寄存器堆 共享内存 常量内存 纹理内存_gpu内存架构_给算法爸爸上香的博客-CSDN博客

从软件层面来讲,一个CUDA的平行化的程式会被以许多个thread来执行,数个thread会被群组成一个block,而多个thread block则会再构成grid。也就是一个kernel程式会有一个grid,grid底下有数个block,每个block都是一群thread的群组。而在同一个block中的thread可以透过shared memory来沟通,也可以同步。

从硬件层面来说,最基本的处理单元是所谓的SP(Streaming Processor),而一颗nVidia的GPU里,会有非常多的SP可以同时做计算;而数个SP会在附加一些其他单元,一起组成一个SM(Streaming Multiprocessor)。CUDA的device实际在执行的时候,会以Block为单位,把一个个的block分配给SM进行运算;而block中的thread,又会以「warp」为单位,把thread来做分组计算。目前CUDA的warp大小都是32,也就是32个thread会被群组成一个warp来一起执行;同一个warp里的thread,会以不同的资料,执行同样的指令。

基本上warp 分组的动作是由SM 自动进行的,会以连续的方式来做分组。比如说如果有一个block 里有128 个thread 的话,就会被分成四组warp,第0-31 个thread 会是warp 1、32-63 是warp 2、64-95 是warp 3、96-127 是warp 4。

而如果block 里面的thread 数量不是32 的倍数,那他会把剩下的thread 独立成一个warp;比如说thread 数目是66 的话,就会有三个warp:0-31、32-63、64-65 。由于最后一个warp 里只剩下两个thread,所以其实在计算时,就相当于浪费了30 个thread 的计算能力;这点是在设定block 中thread 数量一定要注意的事!

一个SM 一次只会执行一个block 里的一个warp,但是SM 不见得会一次就把这个warp 的所有指令都执行完;当遇到正在执行的warp 需要等待的时候(例如存取global memory 就会要等好一段时间),就切换到别的warp 来继续做运算,借此避免为了等待而浪费时间。所以理论上效率最好的状况,就是在SM 中有够多的warp 可以切换,让在执行的时候,不会有「所有warp 都要等待」的情形发生;因为当所有的warp 都要等待时,就会变成SM 无事可做的状况了~,

一个SM中可能会有很多个block的warp运行,而不同block之间的共享内存不共享信息,同一个block中的thread才在同一个共享内存中共享信息,因此在分配thread,block时需要考虑资源最佳化的问题。

这里参考了显卡里的cuda真正做到并行运算的机制和线程个数,主要关于SM、warp等概念。 - 爱码网

二、cuda编程

2.1 各种内存分配编程

GPU存储器架构-- 全局内存 本地内存 寄存器堆 共享内存 常量内存 纹理内存_gpu内存架构_给算法爸爸上香的博客-CSDN博客

2.1 原子操作

原子操作:考虑当大量的线程需要试图修改一段较小的内存区域的情形,这是(在日常的算法实现中)常发生的现象。当我们试图进行“读取–修改-写入”操作序列的时候,这种情形经常会带来很多麻烦。一个例子是代码d_out[i]++,这代码首先将d_out[i]的原值从存储器中读取出来,然后执行了+1操作,再将结果回写到存储器。然而,如果多个线程试图在同一个内存区域中进行这个操作,则可能会得到错误的结果。为了解决这个问题,CUDA提供了atomicAdd这种原子操作函数。该函数会从逻辑上保证,每个调用它的线程对相同的内存区域上的“读取旧值-累加-回写新值”操作是不可被其他线程扰乱的原子性的整体完成的。当然CUDA还有很有其他原子操作。

2.2 矩阵乘法--共享内存的用例

cuda的矩阵乘法操作可以很好的诠释共享内存。

CUDA矩阵乘法_给算法爸爸上香的博客-CSDN博客

 

2.3 CUDA编程之图像处理

OpenCV CUDA图像处理_给算法爸爸上香的博客-CSDN博客

2.4 视频推荐

在这里奉上最敬仰的杜佬视频CUDA编程之基础,内存模型和线程束_哔哩哔哩_bilibili

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值