cuda基础教程(一)

文章目录

  • 0. CURA Runtime API
  • 1. CUDA人工智能编程
    • 1.1. CUDA介绍
    • 1.2. 课程内容
  • 2. 异构计算和并行计算
    • 2.1. 什么是并行计算
    • 2.2. 什么是异构计算
  • 3. CUDA介绍
    • 3.1. GPU的性能指标
    • 3.2. 什么是CUDA
    • 3.3. 如何学习CUDA
  • 4. 系统GPU查询
  • 5. Linux系统
  • 6. CUDA安装
  • 7. 查询GPU信息
  • 8. CUDA编程模型
    • 8.1. 什么是编程模型
    • 8.2. CUDA编程模型
  • 9. CUDA线程模型
    • 9.1. 线程模型结构
    • 9.2. 线程管理
  • 10. CUDA内存模型
    • 10.1 内存架构
  • 11. nvcc工作流程
    • 11.1. nvcc是什么
    • 11.2. nvcc工作流程
  • 12. CUDA内核函数
  • 13. 获取线程索引
  • 14. CUDA错误处理
    • 14.1. 错误代码
    • 14.2. 错误处理函数
  • 15. 运行时GPU信息查询

0. CURA Runtime API

https://docs.nvidia.com/cuda/cuda-runtime-api/index.html

1. CUDA人工智能编程

1.1. CUDA介绍

  1. CUDA(Compute Unified Device Architecture)
  2. AI技术的繁荣和AI应用场景的逐渐丰富,AI模型的训练、大数据分析都对系统计算能力提出了更高的需求,CUDA平台都对此能够提供很好的计算支持
  3. 主流的AI框架如TensorFlow、Caffe、Pytorch都依赖于CUDA平台的强大计算能力来完成模型训练

1.2. 课程内容

  1. 开发环境搭建
  2. CUDA线程模型
  3. CUDA内存模型
  4. CUDA流和事件
  5. 底层指令优化
  6. CUDA调试

2. 异构计算和并行计算

2.1. 什么是并行计算

  • 任务并行,多个任务同时执行
  • 数据并行,多个数据同时被执行
    • 块分
    • 循环分块

2.2. 什么是异构计算

异构计算指在具有多种类型处理(CPU和GPU)的系统中完成的计算
在这里插入图片描述

GPU上进行并行计算(主要是数据并行)

3. CUDA介绍

3.1. GPU的性能指标

  1. GPU核心数(core number)
  2. GPU内存容量
  3. 计算峰值,每秒单精度或者双精度的运算能力
  4. 内存带宽,每秒读出或者写入GPU内存的数据量

3.2. 什么是CUDA

图形计算 -> 通用计算
在这里插入图片描述

  • CUDA C是对ANSI C的扩展

  • CUDA平台提供了驱动层接口(Driver API)和运行时接口(Runtime API)
    在这里插入图片描述

  • 基于CUPA平台开发的代码包含主机代码和设备代码

3.3. 如何学习CUDA

  1. CUDA C编程时只需要编写顺序执行的程序,在程序代码中不需要有多线程的处理
  2. 要深刻理解CUDA平台GPU的内存架构和线程架构
  3. 掌握CUDA平台常用的性能分析和调优工具
    1. NVIDIA Nsight
    2. CUDA-GDB
    3. 图形化性能分析工具

4. 系统GPU查询

  1. 系统GPU查询
lspci |grep nvidia

硬件是否支持CUDA查询: https://developer.nvidia.com/cuda-gpus

  1. GPU计算能力(compute capability)
    MajorVersion.MinorVersion

5. Linux系统

  • 系统版本
  • gcc
  • 内核头文件
sudo apt-get install linux-header-$(uname -r)

6. CUDA安装

安装完成后,验证

  1. 驱动版本
cat /proc/driver/nivdia/version
  1. nvcc编译器版本
nvcc -V

7. 查询GPU信息

  1. nvidia-smi 管理和检测GPU

8. CUDA编程模型

8.1. 什么是编程模型

  • 对底层计算机硬件架构的抽象表达
  • 编程模型作为应用程序和底层架构的桥梁
  • 编程模型体现在程序开发语言和开发平台中
    在这里插入图片描述

8.2. CUDA编程模型

  • CUDA平台对线程的管理
  • CUDA平台对内存访问控制
    • 主机内存和GPU设备内存
    • cpu和GPU之间内存数据传递
  • 内核函数(kernel function)
    • 内核代码本身不包含任何并行性,由gpu协调处理线程执行内核
    • CPU和GPU处于一步执行状态

9. CUDA线程模型

9.1. 线程模型结构

  1. 关键概念: grid(网格)和block(块)
    在这里插入图片描述

  2. 内核(kernel)执行时所产生的所有线程称为grid

  3. grid由多个block构成

  4. 相同block中的线程可以通过同步机制和块内共享内存做数据交互(不同的block之间无法数据交互)

9.2. 线程管理

  1. 线程标识
    1. blockIdx和threadIdx唯一标识每一个线程
    2. 线程标识由CUDA平台内置和分配,可以在内核程序中访问
    3. 两者均为三维向量, 访问方法blockIdx.x ,blockIdx.y, blockIdx.z, threadIdx.x,threadIdx.y,threadIdx.z
  2. 线程模型纬度(标识grid和block)
    1. 内置变量blockDim和gridDim
    2. 两者也是三维向量
  3. 线程ID(thread ID)和线程标识符换算关系

10. CUDA内存模型

10.1 内存架构

在这里插入图片描述

  1. 寄存器
    • GPU中访问最快的内存,为每个线程私有
  2. 本地内存
    • 无法存入寄存器的数据存于本地内存,如较大的数据结构
  3. 共享内存
    • 由__shared__修饰的变量都保存在共享内存中,是片上存储空间,具有低延迟和高带宽的特点
  4. 常量内存
    • 由__constant__修饰,可以被所有内核代码访问
  5. 全局内存
    • 数量大,使用最多,延迟最大
    • 静态分配:__device__关键字
    • 动态分配: 主机中使用内存管理函数
  6. 纹理内存

内存管理接口函数:
在这里插入图片描述

11. nvcc工作流程

11.1. nvcc是什么

  • 类似于gcc
  • nvcc将ptx或者c语言编写的代码编译为可执行程序

11.2. nvcc工作流程

  1. CUDA程序默认编译模式为全程序编译模式(主机代码和设备代码同时编译)
  2. 分离源文件和GPU相关的内核代码,编译为cubin或者PTX中间文件,保存在fatbinary中
  3. 分离源文件的主机代码,使用系统中可用的编译器(如gcc)进行编译,并将fatbinary嵌入其中
  4. 链接,相关的CUDA运行库会被链接
    在这里插入图片描述

nvcc入参文档:
https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html

12. CUDA内核函数

  • kernel function被GPU上线程并发执行

  • 内核函数定义

    • global void kernel_name(argument list)
  • CUDA程序中的函数修饰符(function qualifier)
    在这里插入图片描述

  • 内核函数限制条件:

    1. 只能访问GPU内存
    2. 必须返回void
    3. 不能使用变长参数
    4. 不能使用静态变量
    5. 不能使用函数指针
    6. 内核函数具有异步性
      Hello word内核函数
  1. code:
#inlcude <stdio.h>
__global__ void helloFromGPU()
{printf("Hello World From GPU\n");
}int main()
{printf("Hello World From CPU\n");helloFromGPU<<<1,10>>>(); //会被10个线程执行cudaDeviceReset();return 0;
}
  1. 编译
nvcc helloFromGPU.cu --output-file helloGPU

13. 获取线程索引

  • 线程索引包含blockIdx和threadIdx
  • 通过线程索引可以为线程分配数据
  • 线程维度包含网格(grid)纬度gridDim、块(block)纬度blockDim定义
    示例代码:
#include "common/common.h"
#include <stdio.h>__global__ void helloFromGPU()
{printf("blockDim:x=%d,y=%d,z=%d,gridDim:x=%d,y=%d,z=%d Current threadIdx:x=%d,y=%d,z=%d\n",blockDim.x,blockDim.y,blockDim.z,gridDim.x, gridDim.y, gridDim.z,threadIdx.x,threadIdx.y,threadIdx.z);
}int main(int argc,char **argc)
{printf("Hello World from CPU!\n");dim3 grid;grid.x = 2;grid.y = 2;dim3 block;block.x = 2;block.y = 2;helloFromGPU<<<grid,block>>>();cudaDeviceReset();return 0;
}

14. CUDA错误处理

14.1. 错误代码

enum cudaError文档说明:
https://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__TYPES.html

14.2. 错误处理函数

  • cudaGetErrorName(cudaError_t error)
  • cudaGetErrorString(cudaError_t errr)

15. 运行时GPU信息查询

文档:
https://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__DEVICE.html#group__CUDART__DEVICE_1g18808e54893cfcaafefeab31a73cc55f

  • 获取GPU数量:cudaGetDeviceCount
  • 设置需要使用的GPU: cudaSetDevice
  • 获取GPU信息: cudaGetDeviceProperties

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/249594.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

故障诊断 | 一文解决,GRU门控循环单元故障诊断(Matlab)

文章目录 效果一览文章概述专栏介绍模型描述源码设计参考资料效果一览 文章概述 故障诊断 | 一文解决,GRU门控循环单元故障诊断(Matlab) 专栏介绍 订阅【故障诊断】专栏,不定期更新机器学习和深度学习在故障诊断中的应用;订阅

Java:搭建eladmin复习mvn、springboot、vue等

目录 1.源码平台后端&#xff1a; 2.源码平台前端&#xff1a; 3.操作系统&#xff1a;centos7.9 4.mysql:5.7.x 安装 5.redis:5.0.X 6.maven&#xff1a;3.8 7.java:1.8&#xff1a; 8.nodejs:16.x 9.通过mvn打包eladmin后端 10.npm打包前端项目进行部署 11.访问测试…

永磁同步电机速度环闭环控制

文章目录 1、速度环分析2、电机参数3、PI计算4、模型仿真4.1 模型总览4.2 实际转速与参考转速对比4.3 转矩波形4.4 相电流采样波形 模型下载地址&#xff1a; 链接: 速度闭环模型&#xff08;速度电流双闭环&#xff09; 1、速度环分析 2、电机参数 Udc24 V Rs0.6 LdLq1.4e-3…

二、人工智能之提示工程(Prompt Engineering)

黑8说 岁月如流水匆匆过&#xff0c;哭一哭笑一笑不用说。 黑8自那次和主任谈话后&#xff0c;对这个“妖怪”继续研究&#xff0c;开始学习OpenAI API&#xff01;关注到了提示工程(Prompt Engineering)的重要性&#xff0c;它包括明确的角色定义、自然语言理解&#xff08;…

Redis 布隆过滤器

布隆过滤器 这一篇文章主要是记录布隆过滤器的使用和认识 主要参考了如下的blog https://blog.csdn.net/weixin_42972832/article/details/131211665 他讲的还不错 简单的来说,布隆过滤器,实际上就像是一个集合,拿redis的key来举例来说,布隆过滤器的设置就是去过滤不属于redi…

mybatisplus-多数据源配置

1. 流程 pom文件yml配置多数据源具体服务添加注解DS(“***”) 1.pom文件 <!--mybatis plus 起步依赖--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.0</vers…

VS之调用程序对DLL中全局变量的使用

接上篇《VS生成C动态链接库DLL》&#xff0c;能够生成DLL&#xff0c;且能调用后&#xff0c;遇到一个问题&#xff0c;即在DLL程序中定义了一些全局变量&#xff0c;应用程序需要使用&#xff0c;本以为可以直接使用&#xff0c;没想到&#xff0c;还是需要设置才可以&#xf…

【Node.js基础】Node.js的介绍与安装

文章目录 前言一、什么是Node.js&#xff1f;二、安装Node.js2.1 Windows系统2.2 macOS系统2.3 Linux系统 三、运行js代码总结 前言 随着互联网技术的不断发展&#xff0c;构建高性能、实时应用的需求日益增长。Node.js作为一种服务器端运行时环境&#xff0c;以其事件驱动、非…

leetcode-704.二分查找

题目 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], target 9输出: 4 解释: 9 …

05MARL经典算法 基于联合动作价值函数

文章目录 前言一、动态规划值迭代算法二、TD差分联合动作学习1.Nash Q-learning2.Correlated Q-Learning 三、JAL的限制总结 前言 用于记录MARL当中的经典算法 基础的MARL算法有三种类型&#xff1a;学习联合动作价值函数、学习智能体的显示模型根据过去的动作预测未来的动作、…

uniapp瀑布流实现

1. 图片瀑布流&#xff1a; 不依赖任何插件&#xff0c;复制即可见效&#xff1a; <template><view class"page"><view class"left" ref"left"><image class"image" v-for"(item,i) in leftList" :k…

运动编辑学习笔记

目录 跳舞重建&#xff1a; 深度运动重定向 Motion Preprocessing Tool anim_utils MotionBuilder 跳舞重建&#xff1a; https://github.com/Shimingyi/MotioNet 深度运动重定向 https://github.com/DeepMotionEditing/deep-motion-editin 游锋生/deep-motion-editin…

红队打靶练习:INFOSEC PREP: OSCP

目录 信息收集 1、arp 2、nmap WEB 信息收集 wpscan dirsearch ssh登录 提权 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:69:c7:bf, IPv4: 192.168.110.128 Starting arp-scan 1.10.0 with 256 ho…

Ajax入门与使用

目录 ◆ AJAX 概念和 axios 使用 什么是 AJAX&#xff1f; 怎么发送 AJAX 请求&#xff1f; 如何使用axios axios 函数的基本结构 axios 函数的使用场景 1 没有参数的情况 2 使用params参数传参的情况 3 使用data参数来处理请求体的数据 4 上传图片等二进制的情况…

【Python基础 机器学习】Python环境搭建(适合新手阅读的超详细教程)

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;重要专栏&#xff1a; 机器学习 &#xff1a;相对完整的机器学习基础教学&#xff01; 机器学习python实战&#xff1a;用python带你感受真实的机器学习 深度学习&#xff1a;现代人工智…

【leetcode】20. 有效的括号

有效的括号 题目链接 // 栈结构 typedef char valuetype; typedef struct {valuetype* arr;int top;int capacity; } Stack;void Init(Stack* stack);void Push(Stack* stack, valuetype value); void Pop(Stack* stack);valuetype Top(Stack* stack); int Size(Stack* stack…

Elasticsearch:构建自定义分析器指南

在本博客中&#xff0c;我们将介绍不同的内置字符过滤器、分词器和分词过滤器&#xff0c;以及如何创建适合我们需求的自定义分析器。更多关于分析器的知识&#xff0c;请详细阅读文章&#xff1a; 开始使用 Elasticsearch &#xff08;3&#xff09; Elasticsearch: analyzer…

jenkins部署(docker)

docker部署&#xff0c;避免安装tomcat 1.拉镜像 docker pull jenkins/jenkins2.宿主机创建文件夹 mkdir -p /lzp/jenkins_home chmod 777 /lzp/jenkins_home/3.启动容器 docker run -d -p 49001:8080 -p 49000:50000 --privilegedtrue -v /lzp/jenkins_home:/var/jenkins_…

【HarmonyOS应用开发】ArkUI 开发框架-进阶篇-管理组件状态(九)

管理组件状态 一、概述 在应用中&#xff0c;界面通常都是动态的。下图所示&#xff0c;在子目标列表中&#xff0c;当用户点击目标一&#xff0c;目标一会呈现展开状态&#xff0c;再次点击目标一&#xff0c;目标一呈现收起状态。界面会根据不同的状态展示不一样的效果。 Ar…

CapCut - 剪映国际版11.0.0

【应用名称】&#xff1a;CapCut - 剪映国际版 【适用平台】&#xff1a;#Android 【软件标签】&#xff1a;#CapCut #剪映国际版 【应用版本】&#xff1a;11.0.0 【应用大小】&#xff1a;231MB 【软件说明】&#xff1a;软件升级更新。目前大家广泛使用的最令人惊叹、最专业…