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一文通的更多相关文章

  1. 【android极光推送】—从客户端到后台,一文通吃

    sion android:name="android.permission.VIBRATE" /> <uses-permission android:name=&quo ...

  2. 初识CUDA

    如果问题规模较小,逻辑控制较为复杂,并行性很小优先使用CPU处理该问题,如果包含较大规模的数据处理,则考虑使用GPU进行处理. CPU上线程是重量级实体,可以开启1~32个线程,且上下文切换较为缓慢, ...

  3. 换装WIN10(windows)那点儿事,换装操作系统一文通,玩转安装操作系统

    目录 1. 按 2. win10对电脑配置的要求 3. 原版镜像下载 4. 制作U盘系统盘 5. 硬盘分区调整 6. 设置开机时从U盘启动 7. 安装win10 8. 如何激活WIN10 9. 如何给 ...

  4. Python基础入门一文通 | Python2 与Python3及VSCode下载和安装、PyCharm激活与安装、Python在线IDE、Python视频教程

    目录 1. 关键词 2. 推荐阅读 2.1. 视频教程 3. 本文按 4. 安装 4.1. 视频教程 4.2. 资源下载 4.3. 安装教程 1. 关键词 Python2 与Python3及VSCod ...

  5. Atitit.复合文档的格式 标准化格式

    Atitit.复合文档的格式 标准化格式 1. Docfile1 2. Iso   Cdf  cd file1 3. Zip1 4. Ooxml1 5. Odf  :OpenDocument Form ...

  6. CUDA编程

    目录: 1.什么是CUDA 2.为什么要用到CUDA 3.CUDA环境搭建 4.第一个CUDA程序 5. CUDA编程 5.1. 基本概念 5.2. 线程层次结构 5.3. 存储器层次结构 5.4. ...

  7. CUDA ---- Hello World From GPU

    本篇博文仅实现hello world,先看到效果,具体细节将在后续博文解释. 准备 如果你是第一次使用CUDA,在Linux下可以使用下面的命令来检查CUDA编译器是否安装正确: $ which nv ...

  8. OpenSuse13.2安装CUDA Toolkit 7.5

    此次安装过程有点曲折,不过最后还是能成功安装,由于没细细看官方的安装文档,导致花了很多时间安装,希望此文能让想装CUDA的同学少走点弯路 1.NVIDIA Driver是否要装 刚开始要装CUDA时, ...

  9. HDMI初识

    HDMI初识 1.阅读文档xapp1287 (1) KC705 HDMI Reference Design Block Diagram (2) KC705 HDMI Reference Design ...

  10. CUDA ---- Stream and Event

    Stream 一般来说,cuda c并行性表现在下面两个层面上: Kernel level Grid level 到目前为止,我们讨论的一直是kernel level的,也就是一个kernel或者一个 ...

随机推荐

  1. 树莓派CM4(四):树莓派镜像替换内核

    树莓派镜像替换内核 1. 为什么要替换内核 树莓派官方提供的镜像中,自带的内核版本为6.6.31 然而github上提供的内核源码为6.6.40,有些微差别 此外,后续很有可能进行内核裁剪定制等工作, ...

  2. VMware Workstation虚拟机 + 许可证密钥

    VMware Workstation虚拟机 + 许可证密钥 VMware Workstation是什么? VMware简介 VMware 安装 VMware系统要求 VMware 版本下载地址 许可证 ...

  3. Java面试集锦(一)

    计算机网络 摘要:1. 在浏览器中输入url地址 显示主页的过程,整个过程会使用哪些协议 image.jpeg总体来说分为以下几个过程: DNS解析 TCP连接 发送HTTP请求 服务器处理请求并返回 ...

  4. 探索不同引擎Innodb和Myisam的索引优化方案

    数据库可能存在千万级的数据,必须将这些行数据以一定的结构组织起来做到高效的增删改查. 我们将分别探索innodb和myisam两种引擎的索引方案. 一.InnoDB的索引 1.假设表初始没有记录,只有 ...

  5. 小tips:nodejs请求接口超时使用中间件connect-timeout实现自动超时机制

    如果在请求中不设置超时时间,那么一直处理loading卡屏状态,使用connect-timeout来设置自动超时时间. 安装: npm install connect-timeout -S 如下例子: ...

  6. Angular 18+ 高级教程 – 大杂烩

    前言 本篇记入一些 Angular 的小东西. Angular 废弃 API 列表 Docs – Deprecated APIs and features Using Tailwind CSS wit ...

  7. C#|.net core 基础 - 扩展数组添加删除性能最好的方法

    今天在编码的时候遇到了一个问题,需要对数组变量添加新元素和删除元素,因为数组是固定大小的,因此对新增和删除并不友好,但有时候又会用到,因此想针对数组封装两个扩展方法:新增元素与删除元素,并能到达以下三 ...

  8. 第6天:基础入门-抓包技术&HTTPS协议&APP&小程序&PC应用&WEB&转发联动

    安装charles 到Windows本地: 安卓模拟器安装: 如果抓模拟器就要使用从远程主机,如果不是,则从所有进程 访问 谷歌浏览器安装证书: PC微信小程序代理抓取: 41:43 :如何将char ...

  9. crypt.h:No such file or directory 报错处理

    crypt.h:No such file or directory 报错处理 前言:本文初编辑于2024年9月28日 CSDN主页:https://blog.csdn.net/rvdgdsva 博客园 ...

  10. 6款支持C#语言的AI辅助编程工具,开发效率提升利器!

    前言 在这个AI迅速发展的阶段,涌现出了一大批好用的AI辅助编程工具.AI辅助编程工具能够提高开发效率.改善代码质量.降低bug率,是现代软件开发过程中的重要助手.今天大姚给大家分享6款AI辅助编程工 ...