cuda基础教程(一)

news2024/11/26 10:17:28

文章目录

  • 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.coloradmin.cn/o/1426230.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[C#][opencvsharp]winform实现自定义卷积核锐化和USM锐化

【锐化介绍】 图像锐化(image sharpening)是补偿图像的轮廓&#xff0c;增强图像的边缘及灰度跳变的部分&#xff0c;使图像变得清晰&#xff0c;分为空间域处理和频域处理两类。图像锐化是为了突出图像上地物的边缘、轮廓&#xff0c;或某些线性目标要素的特征。这种滤波方法…

Python机器学习:一文讲透机器学习中的验证集法

验证集法又被称为“留出法”&#xff0c;基本思路是将样本数据集划分为两个互斥的集合&#xff1a;训练集和测试集。其中训练集占比一般为2/3~4/5&#xff0c;常用70%&#xff1b;测试集占比一般为1/5~1/3&#xff0c;常用30%。训练集用来构建机器学习模型&#xff1b;测试集也…

vit细粒度图像分类(八)SIM-Trans学习笔记

1.摘要 细粒度视觉分类(FGVC)旨在从相似的从属类别中识别物体&#xff0c;这对人类准确的自动识别需求具有挑战性和实用性。大多数FGVC方法侧重于判别区域挖掘的注意机制研究&#xff0c;而忽略了它们之间的相互依赖关系和组成的整体对象结构&#xff0c;而这些对模型的判别信…

11. UE5 RPG使用GameplayEffect修改角色属性(二)

上一篇写了一下GameplayEffect的基础操作&#xff0c;这一篇进阶一下&#xff0c;讲解一下GameplayEffect堆叠功能&#xff0c;以及能够基于这个堆叠能够实现一些怎样的效果。 经过几天的查看&#xff0c;发现新版的更新的真不错&#xff0c;而且最上面竟然直接显示编译的错误…

Django部署到服务器后无法获取到静态元素 The requested resource was not found on this server

问题描述 写了一个Django项目&#xff0c;部署到云主机后&#xff0c;访问发现图片无法访问&#xff0c;报错The requested resource was not found on this server 图片是一个词云图&#xff0c;根据爬虫爬取的信息生成的&#xff0c;根据爬取的信息会改变&#xff0c;所以没…

大数据信用报告应该去哪里查询比较好呢?

对于个人而言&#xff0c;大数据信用报告也变得越来越重要。那么&#xff0c;大数据信用报告应该去哪里查询呢?本文将为您详细介绍征信和大数据的区别&#xff0c;并推荐一个可靠的大数据平台。 首先&#xff0c;我们需要了解征信和大数据的区别 征信报告 依法采集、整理、保存…

Redis主从集群

一.资源分布 操作系统&#xff1a;Centos 7 Redis版本&#xff1a;6.2.14 IP端口角色192.168.157.1306379master192.168.157.1316379slave1192.168.157.1326379slave2 二.流程 1.创建三台虚拟机IP及端口如上且安装好Reids 2.修改三个redis.conf配置文件 其它说明&#xff1a…

Modbus协议学习第六篇之基于libmodbus库的示例程序(可以联合Modbus模拟仿真软件进行调试)

前置工作 学了这么多Modbus的知识&#xff0c;如果不进行实际的操作&#xff0c;总感觉懂的不透彻。基于此&#xff0c; 本篇博文就带各位读者来了解下如何通过编写程序来模拟与Modbus Slave仿真软件的通讯。当然了&#xff0c;这里有两个前提&#xff0c;如下&#xff1a; 1.请…

printf死翘翘

本来想把我的单片机玩一下&#xff0c;寄给在大学搞研究的一个朋友&#xff0c;但竟然挂在printf里面&#xff0c;大概知道是什么位置出问题&#xff0c;但是还想不清楚什么原因。 我先是在stc51单片机里面搞了串口&#xff0c;然后我想用串口重定向到printf做调试&#xff0c;…

element-ui icon 组件源码分享

今日简单分享 element-ui 源码中的 icon 组件&#xff0c;主要从以下两个方面来分享&#xff1a; 一、源码中 icon 设计思想是什么呢&#xff1f;主要从页面结构、数据、 icon 样式三个方面来分享。 1.1 源码中 icon 组件的页面结构&#xff0c;可以在 package 目录下找到 ico…

Android 高德地图切换图层

一、默认样式 Android 地图 SDK 提供了几种预置的地图图层&#xff0c;包括卫星图、白昼地图&#xff08;即最常见的黄白色地图&#xff09;、夜景地图、导航地图、路况图层。 findViewById<TextView>(R.id.normal).setOnClickListener {updateSelectedStatus(TYPE_NORMA…

LeetCode 每日一题Day 54 - 61

2859. 计算 K 置位下标对应元素的和 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 请你用整数形式返回 nums 中的特定元素之 和 &#xff0c;这些特定元素满足&#xff1a;其对应下标的二进制表示中恰存在 k 个置位。 整数的二进制表示中的 1 就是这个整数的 置位…

Java 正则匹配sql

文章目录 正则匹配sql表名称insert intoupdate 正则表达式什么时候要加^$ 在线正则校验 正则匹配sql表名称 insert into insert into PING_TABLE (CODE, NAME) VALUES(0, 待提交),(1, 审核中),(2, 审核通过),(3, 已驳回); regex -> insert\sinto\s(\w)\s*\(?update upda…

xmind思维导图 for mac v24.01中文版

mac电脑上思维导图软件哪个好呢&#xff1f; xmind for mac一个功能强大、易于使用的思维导图软件&#xff0c;够帮助你更好地组织思维、管理信息、规划项目和解决问题&#xff0c;提高个人和团队的工作效率。 软件下载&#xff1a;xmind思维导图 for mac v24.01中文版 XMind f…

【issue-YOLO】自定义数据集训练YOLO-v7 Segmentation

1. 拉取代码创建环境 执行nvidia-smi验证cuda环境是否可用&#xff1b;拉取官方代码&#xff1b; clone官方代码仓库 git clone https://github.com/WongKinYiu/yolov7&#xff1b;从main分支切换到u7分支 cd yolov7 && git checkout 44f30af0daccb1a3baecc5d80eae229…

Spring Boot--07--@Repository 和@Mapper的区别

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.Repository的作用1.1 含义1.2 Repository与Service和Component有什么区别&#xff1f;1.3 使用场景单独使用Repository&#xff0c;需要配合使用MapperScannerCon…

Linux实验记录:使用Apache服务部署静态网站

前言&#xff1a; 本文是一篇关于Linux系统初学者的实验记录。 参考书籍&#xff1a;《Linux就该这么学》 实验环境&#xff1a; VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 目录 前言&#xff1a; 备注&#xff1a; 正文&…

Python算法题集_除自身以外数组的乘积

Python算法题集_除自身以外数组的乘积 题239&#xff1a;除自身以外数组的乘积1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【暴力求解】2) 改进版一【字典改进乘积计算】3) 改进版二【字典改进乘积计算预计算数字乘积】4) 改进版三【前缀乘积…

Linux------进程优先级与进程切换

目录 一、进程优先级 二、优先级与权限的区别 三、优先级的查看 四、进程优先级修改 五、进程切换 六、linux2.6内核调度队列与调度原理 一、进程优先级 首先我们得知道一个进程总是需要排队的&#xff0c;他一会在运行队列中排队等待运行&#xff0c;一会在设备的等待队…

Python之数据分析

【案例】 某公司有2份数据文件&#xff0c;现在需要对其进行数据分析&#xff0c;计算每日的销售额并以柱状图表的形式进行展现。 数据如下&#xff1a; 一月份数据&#xff1a; 二月份数据&#xff1a; 需求分析 根据题目要求我们要得到每日销售额&#xff0c;分析文本数据可以…