初识cuda一文通
cuda学习博客
本文为本人cuda学习过程中的记录和理解,多参考@谭升等大佬前辈的博客,以及NVIDIA官方文档。如有错误烦请指正,如有侵权请联系删除。
0. 并行计算与计算机架构
计算机架构是并行计算或者说HPC领域中十分重要的内容。
。。看书后期记得补充。。
无论是OpenMP还是CUDA,写并行程序主要是分解任务,在软件层面上大体可以分为‘指令并行’和‘数据并行’。
1. 异构计算与CUDA
cuda基础
进入正题,我们从hello world开始学习cuda
#include<stdio.h>
__global__ void hello_world(void)
{
printf("hello world!);
}
int main(int argc, char **argv)
{
hello_world<<<1, 10>>>();
cudaDeviceReset();
return 0;
}
下面我们具体审视一下这个简单的cuda程序。
(1)__global__前缀,cuda的精髓,即核函数。核函数的代码将在成千上万个线程上执行。
(2)cudaDeviceReset(),实现CPU和Device(即GPU)的同步,保证cpu和gpu一起退出程序。
大家这里先不用着急,后续我们还会具体谈cuda中执行单元的划分,并NVIDIA为我们提供的若干工具来分析编写并行程序。
在异构环境中,主机host和设备device通过pcie总线通信。通信内容就包括了最重要的内存信息传递。CUDA上的内存管理API大体和cpu中相同,例如:
cudaMalloc()诸如此类
跑在总线上的一个重要API:cudaMemcpy()内存拷贝函数,可以实现DeviceToHost/HostTODevice等等过程。
GPU架构
线程管理
下面我们进入到线程管理。首先,一个核函数只能有一个grid,每个grid可以分为多个block,每个block又可以分为多个thread。CUDA还为同一个block中的线程提供了共享内存机制,在每个block中单独划分出一块内存空间用于共享,通过关键词__shared__访问,拥有比全局内存更好的性能表现,这点后续我们也会详谈。
核函数
kernel_name<<<grid,block>>>
注意host端核函数执行是异步的,并且当主机发出执行核函数的指令后,会立即收回控制权。此刻就需要方法来使host和device同步,最常见的是使用cudaMemcpy来使host等待device数据,从而实现同步。
在CUDA程序编写时,最常见的是将串行程序中的for循环并行化(这点在OpenMP和MPI中已经很熟悉了)
细谈线程束Warp
CUDA中的同步
无论是pthread中的还是openmp,都有相应的同步机制,CUDA为避免内存竞争,也有同步方法。__syncthread()可以实现同block内的线程同步,想要同步不同block的线程,方法是借助核函数执行。
CUDA并行性能分析
这里我们使用简单的矩阵加法为例来进行实验分析,硬件平台为RTX3060
分析工具介绍
- nvprof:
动态并行
动态并行或者叫他嵌套并行,类似于父进程/子进程的概念。
2.CUDA内存
- 寄存器
- 共享内存
- 常量内存
- 全局内存
- 纹理内存
- 本地内存
内存管理
cudaMelloc() //分配内存
cudaMemset() //初始化内存
cudaFree() //释放内存
cudaemcpy() //传输内存
特殊内存
固定内存:固定内存传输速更快,但是分配和释放成本更高
零拷贝内存:
统一内存寻址:cudaMallocManaged()
内存访问模式
这部分内容至关重要,对于程序调优来说,记得代码验证
1.对齐合并内存访问,减少带宽浪费
2.足够的并发内存操作,隐藏内存延迟
共享内存
初识cuda一文通的更多相关文章
- 【android极光推送】—从客户端到后台,一文通吃
sion android:name="android.permission.VIBRATE" /> <uses-permission android:name=&quo ...
- 初识CUDA
如果问题规模较小,逻辑控制较为复杂,并行性很小优先使用CPU处理该问题,如果包含较大规模的数据处理,则考虑使用GPU进行处理. CPU上线程是重量级实体,可以开启1~32个线程,且上下文切换较为缓慢, ...
- 换装WIN10(windows)那点儿事,换装操作系统一文通,玩转安装操作系统
目录 1. 按 2. win10对电脑配置的要求 3. 原版镜像下载 4. 制作U盘系统盘 5. 硬盘分区调整 6. 设置开机时从U盘启动 7. 安装win10 8. 如何激活WIN10 9. 如何给 ...
- Python基础入门一文通 | Python2 与Python3及VSCode下载和安装、PyCharm激活与安装、Python在线IDE、Python视频教程
目录 1. 关键词 2. 推荐阅读 2.1. 视频教程 3. 本文按 4. 安装 4.1. 视频教程 4.2. 资源下载 4.3. 安装教程 1. 关键词 Python2 与Python3及VSCod ...
- Atitit.复合文档的格式 标准化格式
Atitit.复合文档的格式 标准化格式 1. Docfile1 2. Iso Cdf cd file1 3. Zip1 4. Ooxml1 5. Odf :OpenDocument Form ...
- CUDA编程
目录: 1.什么是CUDA 2.为什么要用到CUDA 3.CUDA环境搭建 4.第一个CUDA程序 5. CUDA编程 5.1. 基本概念 5.2. 线程层次结构 5.3. 存储器层次结构 5.4. ...
- CUDA ---- Hello World From GPU
本篇博文仅实现hello world,先看到效果,具体细节将在后续博文解释. 准备 如果你是第一次使用CUDA,在Linux下可以使用下面的命令来检查CUDA编译器是否安装正确: $ which nv ...
- OpenSuse13.2安装CUDA Toolkit 7.5
此次安装过程有点曲折,不过最后还是能成功安装,由于没细细看官方的安装文档,导致花了很多时间安装,希望此文能让想装CUDA的同学少走点弯路 1.NVIDIA Driver是否要装 刚开始要装CUDA时, ...
- HDMI初识
HDMI初识 1.阅读文档xapp1287 (1) KC705 HDMI Reference Design Block Diagram (2) KC705 HDMI Reference Design ...
- CUDA ---- Stream and Event
Stream 一般来说,cuda c并行性表现在下面两个层面上: Kernel level Grid level 到目前为止,我们讨论的一直是kernel level的,也就是一个kernel或者一个 ...
随机推荐
- Ubuntu20.04安装CUDA和CUDNN
CUDA是GPU深度学习的运行库,那么cuDNN就是训练加速工具,两者要相互配合使用,所以一般机器学习需要训练引擎(tensorflow-gpu) + CUDA + cuDNN使用.想不安装cuDNN ...
- Windows 7远程桌面连接Ubuntu 18.04
从Windows 7远程到Windows系统比较简单,只要对方电脑开启远程桌面功能就可以了,但Windows 7远程桌面连接到Ubuntu 16.04比较复杂一点,具体操作步骤如下. 1 安装xrdp ...
- docker高级篇1-dockeran安装mysql主从复制
大家好,咱们前面通过十篇的文章介绍了docker的基础篇,从本篇开始,咱们的<docker学习系列>将要进入到高级篇阶段(基础篇大家可以查看之前发布的文章). 咱们先来介绍:docker复 ...
- 支付宝小程序swiper video的坑
在使用uniapp 开发多端应用的时候,踩了一个坑,有一个页面,是使用swiper作为滑动容器,然后每个swiper-item 嵌套不同的内容, 代码示意: <template> < ...
- 『读书笔记』你不知道的JavaScript(上)
前言 文章只记录理解以及容易遗忘的知识点. 词法作用域.块作用域 词法作用域 词法作用域:简单的说,词法作用域就是定义在词法阶段的作用域.换句话说,词法作用域就是在你写代码时将变量和块作用域写在哪里来 ...
- UWP 通过 .NET 9 和Native AOT 的支持实现 UWP 应用的现代化
微软(9 月 11 日)发布博文,微软正在预览对 .NET 9 的 UWP(通用 Windows 平台)支持,为现有 UWP 开发人员提供一条使用最新的 .NET 和本机 AOT 实现其应用程序现代化 ...
- TypeScript – Using Disposable
前言 TypeScript v5.2 多了一个新功能叫 Disposable. Dispose 的作用是让 "对象" 离开 "作用域" 后做出一些 " ...
- Angular 18+ 高级教程 – Signals
前言 首先,我必须先说明清楚.Signal 目前不是 Angular 的必备知识. 你的项目不使用 Signal 也不会少了条腿,断了胳膊. Angular 官方维护的 UI 组件库 Angular ...
- Angular – ESLint
介绍 Angular wrap 了一层 ESLint, 定义了一些 best practice guide. 这篇说说如何 setup 它. 这个 ESLint 并不是 under Angular T ...
- c++可变模板参数
在C++中的可变模板参数使用省略号 ... 来表示一个参数包(Parameter Pack),其具体位置决定了这个包是模板参数包还是函数参数包,以及如何进行参数展开. 1. 模板参数包:c... Ar ...