cuda编码入门学习笔记

          在日常深度学习和科学计算中,使用图形处理器(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.mzph.cn/news/863046.shtml

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

相关文章

The difference between Manhattan distance and Cosine Distance

题意&#xff1a;为什么即使返回了相同的文本块&#xff0c;曼哈顿距离&#xff08;Manhattan Distance&#xff09;和余弦距离&#xff08;Cosine Distance&#xff09;之间还是存在差异&#xff1f; 问题背景&#xff1a; I am using the qdrant DB and client for embeddin…

排序【插入排序】

排序的概念 排序&#xff1a;所谓排序&#xff0c;就是将一份数据&#xff0c;通过某个或者某些关键字的大小&#xff0c;进行递增或者递减排序的操作。 稳定性&#xff1a;假定在待排序的数据组中&#xff0c;存在多个相同的元素&#xff0c;若经过排序&#xff0c;这些数据…

决定佛蒙特州版图的关键历史事件:

​决定佛蒙特州版图的关键历史事件: 1. 早期探险与命名&#xff1a; - 1609年&#xff0c;法国探险家萨缪尔德尚普兰&#xff08;Samuel de Champlain&#xff09;到达了现在的佛蒙特州区域&#xff0c;并探索了尚普兰湖&#xff08;Lake Champlain&#xff09;。他将周围的山…

TS_类型

目录 1.类型注解 2.类型检查 3.类型推断 4.类型断言 ①尖括号&#xff08;<>&#xff09;语法 ②as语法 5.数据类型 ①boolean ②number ③string ④undefined 和 null ⑤数组和元组 ⑥枚举 ⑦any 和void ⑧symbol ⑨Function ⑩Object 和 object 6.高…

ATL新能源科技薪资待遇及Verify测评语言理解数字推理题型简介

一、走进ATL新能源科技 ATL新能源公司&#xff0c;即东莞新能源科技有限公司&#xff0c;是全球领先的可充式锂离子电池研发、生产和营销企业。成立于2004年&#xff0c;总部位于香港&#xff0c;产品广泛应用于消费电子产品和电动汽车领域。ATL以其技术创新和与苹果等大客户的…

2024年【电工(初级)】考试内容及电工(初级)模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 电工&#xff08;初级&#xff09;考试内容参考答案及电工&#xff08;初级&#xff09;考试试题解析是安全生产模拟考试一点通题库老师及电工&#xff08;初级&#xff09;操作证已考过的学员汇总&#xff0c;相对有…

等保2.0安全计算环境解读

等保2.0&#xff0c;即网络安全等级保护2.0制度&#xff0c;是中国为了适应信息技术的快速发展和安全威胁的新变化而推出的网络安全保护标准。相较于等保1.0&#xff0c;等保2.0更加强调主动防御、动态防御和全面审计&#xff0c;旨在实现对各类信息系统的全面保护。 安全计算环…

Docker基础知识的掌握,相关基本命令的用法

安装docker步骤&#xff1a;https://b11et3un53m.feishu.cn/wiki/Rfocw7ctXij2RBkShcucLZbrn2d 1.docker Docker 是一种容器化平台&#xff0c;用于帮助开发者打包、发布和管理应用程序及其依赖关系。通过 Docker&#xff0c;开发者可以将应用程序及其所有依赖项打包到一个称为…

『MySQL 实战 45 讲』22 - MySQL 有哪些“饮鸩止渴”提高性能的方法?

MySQL 有哪些“饮鸩止渴”提高性能的方法&#xff1f; 需求&#xff1a;业务高峰期&#xff0c;生产环境的 MySQL 压力太大&#xff0c;没法正常响应&#xff0c;需要短期内、临时性地提升一些性能 短连接风暴 短连接模式&#xff1a;执行很少的 SQL 语句就断开&#xff0c;…

uniapp加载打点点效果

uniapp加载打点点效果 背景实现思路代码实现尾巴 背景 为了增加系统的交互性&#xff0c;我们在加载数据时通常会增加一些loading动效&#xff0c;但是在某些场景下只需要一些简单文字提醒。比如说使用【加载中】或者【loading】等字段&#xff0c;但是写静态的字符又显得交互…

【若依前后端分离】前端vue页面查看服务器本地的PDF

后端实现&#xff1a; 使用FileSystemResource包装文件&#xff0c;以便Spring MVC可以处理该资源 创建HttpHeaders对象以设置响应头 设置Content-Disposition头&#xff0c;使得浏览器以内联方式显示PDF&#xff08;即在浏览器中直接打开&#xff09; 设置Content-Type为appli…

Thinger.io 支持多协议、插件化100%开源 IoT 企业级物联网平台

项目源码&#xff0c;文末联系小编 Thinger.io 是一个开源插件化物联网平台&#xff0c;提供了设备原型、扩展和设备连接管理所需的一切工具。我们的目标是使物联网的使用民主化&#xff0c;使其可供全世界使用&#xff0c;并简化大型物联网项目的开发。 01 Thinger.io 物联网平…

Python学习路线图:120天系统学习,你也能成大神!

学Python&#xff0c;切忌今天这学一点&#xff0c;明天那里学一点&#xff0c;零零散散没有系统的学习。这样不仅耽搁大家时间&#xff0c;久而久之也会消磨大家学习的兴致&#xff01;这里给大家总结了一张系统的Python学习路线图&#xff01;希望大家共勉&#xff01; Pyth…

期末考试结束,成绩如何快速发布?

随着期末考试的落幕&#xff0c;老师们又迎来了一项繁琐的任务将成绩单私信给学生家长。这项工作耗时耗力&#xff0c;而且极易出错&#xff0c;期末老师的工作已经足够繁重还要私发成绩&#xff0c;简直是雪上加霜。 好消息是&#xff0c;现在有了易查分小程序&#xff0c;只需…

学会整理电脑,基于小白用户(无关硬件升级)

如果你不想进行硬件升级&#xff0c;就要学会进行整理维护电脑 基于小白用户&#xff0c;每一个操作点我都会在后续整理出流程&#xff0c;软件推荐会选择占用小且实用的软件 主要从三个角度去讨论【如果有新的内容我会随时修改&#xff0c;也希望有补充告诉我&#xff0c;我…

【Linux详解】进程地址空间

目录 研究背景 验证地址空间 实验一&#xff1a;父子进程变量地址一致性 实验二&#xff1a;变量值修改后父子进程的差异 分析与结论 实验三&#xff1a;进程地址空间验证 理解进程地址空间 区域与页表 写时拷贝机制 进程地址空间的意义 文章手稿&#xff1a; xmind…

基于语音识别的智能电子病历(二)苹果端的语音接入

是2011年参与的&#xff0c;俺负责Wav文件处理、FTP通讯和一些后端部分。iPhone/iPad/iPod Recorder 前2年还在APP Store上 说明 Step-by-Step Procedure to Install App and Use the FnetRecorder Download the App from Apple Store Launch Apple Store and key in “fnetr…

labview排错

源代码正常跑&#xff0c;应用程序报这个错&#xff0c;是因为源代码的可以找到项目路径内所有dll的路径&#xff0c;而应用程序只能找到data文件夹的dll文件 解决查看源代码中.net的程序集的路径&#xff0c;复制对应的dll到data文件夹下 在执行developinterface.dll出现labv…

Python+Pytest+Allure+Yaml+Jenkins+GitLab接口自动化测试框架详解

PythonPytestAllureYaml接口自动化测试框架详解 编撰人&#xff1a;CesareCheung 更新时间&#xff1a;2024.06.20 一、技术栈 PythonPytestAllureYamlJenkinsGitLab 版本要求&#xff1a;Python3.7.0,Pytest7.4.4,Allure2.18.1,PyYaml6.0 二、环境配置 安装python3.7&…

Python operator模块这么用,效率杠杠的!

目录 1、基础操作符应用 🐍 1.1 加载operator模块 1.2 使用itemgetter进行排序 1.3 attrgetter与方法调用 2、高级功能探索 🔍 2.1 methodcaller的妙用 2.2 操作符重载与定制 3、结合lambda表达式 ✨ 3.1 lambda与operator模块协同工作 3.2 实战案例分析 4、结合…