cuda编码入门学习笔记

news2024/11/26 2:35:42

          在日常深度学习和科学计算中,使用图形处理器(GPU)进行加速是一个常见的做法。CUDA (Compute Unified Device Architecture) 是英伟达公司提供的用于GPU编程的平台和编程模型。同时它是一种并行计算模型,允许开发人员使用标准C语言对GPU进行编程。CUDA的核心思想是将任务分解为多个线程,并在GPU上同时执行这些线程。GPU由多个处理器和全局内存组成,每个处理器可以执行多个线程,同时访问全局内存。通过并行执行多个线程,可以大大提高计算速度。

(1)CUDA编程模型

     》 学习CUDA编程模型的基础知识:

  • Grids(网格)

    • 网格是 CUDA 编程中的最高级别的组织单位。它是一个三维的结构,用于管理并行执行的线程块(blocks)。
    • 网格由一个或多个线程块组成,并且可以在三个维度上指定大小(例如 (x, y, z))。
    • 网格的大小决定了可以并行执行的线程块的数量。
  • Blocks(线程块)

    • 线程块是网格中的次级单位,它负责管理一组并行执行的线程。
    • 线程块是一个三维的结构,可以在三个维度上指定大小(例如 (x, y, z))。
    • 每个线程块中的线程可以协作并共享内存,通常被设计为处理一块数据或执行一个子任务。
  • Threads(线程)

    • 线程是 CUDA 编程中的最小执行单位,被组织成线程块中的集合。
    • 线程通常是一维的,它们可以通过特定的线程索引访问数据并执行操作。
    • 线程可以利用GPU的并行性,以高效地执行计算任务。
  • Kernel 函数

    • Kernel 函数是在GPU上并行执行的函数,它由CPU发起并在GPU上执行。
    • Kernel 函数由关键字 __global__ 声明,用来标识它们可以被并行执行。
    • 当一个Kernel函数被调用时,它在GPU设备上的多个线程中并行执行,每个线程执行同一段代码但处理不同的数据。
    • Kernel 函数通常用于执行大规模数据并行计算任务,如矩阵运算、图像处理等。
  • dim3数据格式

在CUDA编程中,dim3通常用于指定CUDA内核的执行配置,包括网格的维度(gridDim)和每个线程块的维度(blockDim)。dim3提供了一种方便的方式来处理一维、二维或三维的并行计算任务。

dim3 dimBlock(256); // 一维线程块,大小为256,等价于256×1×1
dim3 blockSize(16, 16); // 二维线程块大小为16x16,等级于16×16×1
dim3 dimGrid(10, 20, 30); // 三维网格,大小分别为10, 20, 30

在内核启动时,如果某个维度的大小为1,CUDA运行时会理解为一维情况。例如:

kernel<<<gridSize, blockSize, 0>>>(args); // 内核启动调用

在这个调用中,即使gridSizeblockSizedim3类型,如果它们被定义为一维或二维,CUDA运行时也会正确处理它们。


补充:在CUDA编程中,__global____device__以及__shared__是几个重要的关键字,用于标识函数在GPU上执行的不同方式。

  • __device__ 用于声明在设备上(即GPU上)全局可见的变量或函数,__device__变量在所有线程中都是可见的,但它们存储在全局内存中,访问速度相对较慢。__device__函数可以在设备代码中被其他内核调用,类似于普通的C/C++函数。但是CUDA中用来标识在GPU上执行,但只能被设备调用的函数。__device__ 函数可以有返回值,并且可以被其他 __device____global__ 函数调用。与 __global__ 函数不同,__device__ 函数不支持被主机(CPU)直接调用,因为它们是专门为在GPU设备上运行而设计的。
  • __shared__用于声明在同一个线程块内所有线程共享的变量。其中__shared__变量存储在共享内存中,访问速度比全局内存快得多,适合于线程间的数据共享和同步。但是共享内存的大小有限,且在内核启动时分配,因此需要谨慎使用以避免超出内存限制。
  • __global__用于声明CUDA内核函数,这些函数可以在主机代码(cpu)中调用,并在设备上执行。__global__函数通常用于执行大规模的并行计算任务,它们会被映射到多个线程和线程块上。但是其返回类型必须是void,想要拿到处理结果需要将其拷贝到host端才行。

在 CUDA 编程中,核函数(kernel function)是在 GPU 上执行的函数。了解如何定义和使用核函数的参数对于有效利用 GPU 资源至关重要。

》核函数定义和参数

  • 核函数定义: 核函数使用 __global__ 修饰符来定义。核函数是从主机代码(CPU 上执行的代码)调用的,但实际在设备代码(GPU 上执行的代码)上运行。

__global__ void kernelFunction(parameters) {
    // 核函数代码
}
  • 参数类型: 核函数的参数可以是基本数据类型、指针或 CUDA 内置类型。
__global__ void vectorAdd(const float *A, const float *B, float *C, int numElements) {
    // 核函数代码
}
  • 线程索引

在核函数中,threadIdxblockIdxblockDimgridDim 是 CUDA 内置变量,用于获取线程和块的索引信息。

int i = blockDim.x * blockIdx.x + threadIdx.x;

》核函数调用和配置

  • 核函数调用: 核函数在主机代码中使用特殊的语法调用,基本调用方式(两个值)称为网格(grid)和块(block)配置
kernelFunction<<<blocksPerGrid, threadsPerBlock>>>(parameters);

其中,blocksPerGrid为每个网格中块的数量,threadsPerBlock为每个块中线程的数量。其取值尽量为选择能够被32整除的数,以便最大限度地利用GPU的线程束(warp)。

常见的还有带共享内存的调用方式(三个值),其中sharedMemSize:为每个线程块分配的共享内存大小(以字节为单位)。

kernel<<<gridSize, blockSize, sharedMemSize>>>(args);

以及带执行流的调用方式(四个值),其中strea

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

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

相关文章

React+TS前台项目实战(二十一)-- Search业务组件封装实现全局搜索

文章目录 前言一、Search组件封装1. 效果展示2. 功能分析3. 代码详细注释4. 使用方式 二、搜索结果展示组件封装1. 功能分析2. 代码详细注释 三、引用到文件&#xff0c;自行取用总结 前言 今天&#xff0c;我们来封装一个业务灵巧的组件&#xff0c;它集成了全局搜索和展示搜…

关于vs code中Live Server插件安装后无法打开的问题

一、问题情况 安装好Live Server插件之后&#xff0c;点击open with live server只会出现界面右下角落的提示&#xff0c;但是不会跳转到浏览器的页面&#xff1a;如下所示&#xff1a; 二&#xff1a;解决步骤 1、首先进行扩展设置&#xff0c;默认将浏览器的设置为chrome浏览…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于改进目标级联分析法的交直流混联系统发电-备用分布式协同调度》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

MFC扩展库BCGControlBar Pro v35.0新版亮点 - 工具栏、菜单全新升级

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v35.0已全新发布了&#xff0c;这个版本改进类Visual Studio 2022的视觉主题、增强对多个…

昇思25天学习打卡营第11天 | ResNet50迁移学习

内容介绍&#xff1a; 在实际应用场景中&#xff0c;由于训练数据集不足&#xff0c;所以很少有人会从头开始训练整个网络。普遍的做法是&#xff0c;在一个非常大的基础数据集上训练得到一个预训练模型&#xff0c;然后使用该模型来初始化网络的权重参数或作为固定特征提取器…

算法力扣刷题记录 二十三【151.翻转字符串里的单词】

前言 字符串篇&#xff0c;继续。 记录 二十三【151.翻转字符串里的单词】 – 一、题目阅读 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词…

【Python报错】已解决 ModuleNotFoundError: No module named ‘transformers‘

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 ModuleNotFoundError: No module named ‘transformers’ 是一个常见的错误&#xff0c;它表明你的Python环境中没有安装t…

2023阿里巴巴全球数学竞赛决赛中的LLM背景题解析(应用与计算数学部分第2题)...

早点关注我&#xff0c;精彩不错过&#xff01; 最近闹得沸沸扬扬的姜萍事件果真又成了世界就是个草台班子的有力论据。无论真相如何&#xff0c;各自心怀鬼胎&#xff0c;自有策略的合作看起来就一定是一场场的闹剧。 无意作过多评论&#xff0c;也绝不妄下言论&#xff0c;就…

Unity之自定义Text组件默认属性值

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity之自定义Text组件默认属性值 TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进取&#xff01;…

硬件实用技巧:刚挠板pcb是什么

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140060334 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

SQLServer 表值构造函数 (Transact-SQL)

在 SQL Server 中&#xff0c;表值构造函数&#xff08;Table Value Constructor, TVC&#xff09;是一种用于在单个语句中插入多行数据到表中的语法。它允许你以行内表值表达式&#xff08;row-valued expression&#xff09;的形式指定多行数据&#xff0c;并将这些数据作为一…

基于weixin小程序周边美食系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;美食店铺管理&#xff0c;菜品分类管理&#xff0c;标签管理&#xff0c;菜品信息管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;美食店铺&#x…

ROS2使用Python创建服务提供者、消费者

1.创建服务提供者 ros2 pkg create example_service_rclpy --build-type ament_python --dependencies rclpy example_interfaces --node-name service_server_02 service_server_02.py 代码 #!/usr/bin/env python3 import rclpy from rclpy.node import Node # 导入接口 …

办公软件WPS与Office的区别

临近计算机考试很多同学在纠结我是报wps好&#xff1f;还是ms office好&#xff1f;下面就来详细说说。 1、wps属于国内金山公司的办公软件&#xff0c;里面包含word、Excel和PPT。考试是2021年开始的&#xff01; 2、MS&#xff08;Microsoft 微软&#xff09; office属于美…

web安全渗透测试十大常规项(一):web渗透测试之深入JAVA反序列化

渗透测试之PHP反序列化 1. Java反序列化1.1 FastJson反序列化链知识点1.2 FastJson反序列化链分析1.3.1 FastJson 1.2.24 利用链分析1.3.2 FastJson 1.2.25-1.2.47 CC链分析1.3.2.1、开启autoTypeSupport:1.2.25-1.2.411. Java反序列化 1.1 FastJson反序列化链知识点 1、为什…

线程池技术实现及参数工作流程原理

一.什么是线程池 线程池其实就是一种多线程处理形式&#xff0c;处理过程中可以将任务添加到队列中&#xff0c;然后在创建线程后自动启动这些任务。这里的线程就是我们前面学过的线程,这里的任务就是我们前面学过的实现了Runnable或Callable接口的实例对象。 为什么使用多线程…

【RT摩拳擦掌】RT云端测试之百度天工物接入构建(设备型)

【RT摩拳擦掌】RT云端测试之百度天工物接入构建&#xff08;设备型&#xff09; 一&#xff0c; 文档介绍二&#xff0c; 物接入IOT Hub物影子构建2.1 创建设备型项目2.2 创建物模型2.3 创建物影子 三&#xff0c; MQTT fx客户端连接云端3.1 MQTT fx配置3.2 MQTT fx订阅3.3 MQT…

修改docker中mongodb容器的时区

假设容器名称为mongodb&#xff0c;设置时区为上海时区的命令为&#xff1a; docker exec -it mongodb bash -c "ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone"验证时区更改&#xff1a; docker e…

Eigen中关于四元数的常用操作

四元数&#xff08;Quaternion&#xff09;是一种数学工具&#xff0c;广泛用于计算机图形学、机器人学和物理模拟中&#xff0c;特别适合处理三维旋转。Eigen库是一个高性能的C数学库&#xff0c;提供了丰富的线性代数功能&#xff0c;其中就包括对四元数的支持。 1. 为什么选…

element ui form 表单验证

表单验证方法 在el-form元素上总体设置校验规则rules&#xff0c;下面是官方案例 <el-form :model"ruleForm" :rules"rules" ref"ruleForm" label-width"100px" class"demo-ruleForm"><el-form-item label"…