首页 > 编程语言 >CUDA编程入门

CUDA编程入门

时间:2024-12-18 14:58:55浏览次数:5  
标签:Grid 入门 编程 threadIdx 线程 CUDA GPU Block

CUDA(Computer Unified Device Architecture)全称为计算统一设备架构。在人工智能技术快速发展的当代,CUDA是做模型训练时性能速度优化所必须的。本文将从下面几个方面解释CUDA比较重要的知识点:

目录

1.GPU架构特点

1.1 串行和并行计算

1.2 GPU和CPU的区别

2. CUDA线程模型

两层结构:

多级索引示例:

调度解释:

3.CUDA内存模型


1.GPU架构特点

1.1 串行和并行计算

串行计算就是将任务分解为多个步骤的小任务,把这些任务依次完成,得到一个最终结果。

这种方式的弊端也很明显,这种情况下我们的多核处理器并没有发挥作用,即使有些小任务互相之间没有什么联系,也必须要等到前面的都计算完了才可以被处理,这大大减慢了处理任务的速度。

我们可以把一些独立的任务放在不同的处理器上进行计算,最后再将这些结果进行整合,完成一次任务计算。

那么,确定一个程序可不可以并行,关键在于分析出这个程序有哪些执行模块,这些模块哪些是独立的,哪些是耦合的。

1.2 GPU和CPU的区别

从“核”的角度来区分:

CPUGPU
专为顺序串行处理而优化的几个核心组成由数以千计的更小、更高效的核心组成,这些核心专门为同时处理多任务而设计,可高效地处理并行任务
每个核心能力很强,但是数量太少,处理并行任务没有优势每个核心计算能力较弱,但是好处在于数量多,处理深度学习大量的并行简单计算非常有优势
计算机运行和控制的核心主要用于图形图像处理

从数据的角度来看:

CPUGPU
通用性较强,可以处理各种不同类型的数据,以及大量逻辑判断所产生的分支跳转和中断处理处理数据类型需要高度统一、相互没有依赖、不需要被打断的大规模数据计算

CUDA的并行计算,必须由CPU和GPU同时配合,串行部分在CPU,并行部分在GPU,这就是异构计算。所以应用程序利用GPU实现加速的总体分工就是:密集计算代码(约占5%的代码量)由GPU负责完成,剩余串行代码由CPU负责执行。

2. CUDA线程模型

线程是程序执行的最基本单元,CUDA的并行计算就是通过成千上万个线程的并行执行来实现的。下面的机构图说明了GPU的不同层次的结构。

下面这张图分别说明了四者的定义以及特点:

补充:图中Grid只支持1维和2维,但是实际上从CUDA3.0开始,Grid也支持3维。

kernel在device上执行时实际上是启动很多线程,一个kernel所启动的所有线程称为一个网格grid,grid是线程结构的第一层次。而网格又可以分为很多线程块(block),一个线程块里面包含很多线程,这是第二个层次。

两层结构

1. 第一层Grid,用 gridDim 和 blockIdx 来定位 线程块(Block) 的位置。

• 例如:gridDim 表示Grid的维度,blockIdx 表示Block的索引。

• 形式:gridDim(blockIdx.x, blockIdx.y)

2. 第二层Block,用 blockDim 和 threadIdx 来定位 线程(Thread) 的位置。

• 例如:blockDim 表示Block中线程的维度,threadIdx 表示线程的索引。

• 形式:blockDim(threadIdx.x, threadIdx.y, threadIdx.z)

多级索引示例

在Kernel调用时,通过 <<<grid, block>>> 的执行配置来指定Grid和Block的结构。例如kernel<<<dim3(3, 2), dim3(4, 4)>>>();

grid:指定Grid中Block的数量和维度;block:指定每个Block中线程的数量和维度。

假设Grid是 2维 的,gridDim 为 (2, 2);Block是 2维 的,blockDim 为 (3, 3)。

要索引某个线程:

1. 定位Block的位置

• 例如,blockIdx = (1, 1) 表示找到第2行第2列的线程块。

2. 定位Thread的位置

• 例如,threadIdx = (2, 2) 表示线程块内的第3行第3列的线程。

调度解释:

在硬件层面上,有SP和SM两个概念。SP(Streaming Processor):是线程最基本的处理单元。SM(Streaming Multiprocessor):多个SP加上其他的一些资源组成。

一个GPU中可以有多个SM,每个线程由每个线程处理器(SP)执行,线程块由多核处理器(SM)执行,一个kernel其实由一个grid来执行,一个kernel一次只能在一个GPU上执行。一个SM可以同时拥有多个blocks,但需要序列执行。

3.CUDA内存模型

用表格的形式来展示每一部分分别拥有什么部件:

线程类型可使用部件
线程 threadregisters(寄存器)、local memory(局部内存)
线程块 blockshared memory(共享内存)
网格 gridglobal memory(全局内存)、constant memory(常量内存)、texture memory(纹理内存)

本文只涉及CUDA编程入门的理论知识,没有涉及实例,如果后续学习到的话,会继续更新,欢迎交流学习~

标签:Grid,入门,编程,threadIdx,线程,CUDA,GPU,Block
From: https://blog.csdn.net/wxtyuki8568/article/details/144508099

相关文章

  • 【VScode】编程工具入门教程:CodeMoss & ChatGPT中文版超详细入门教程!
    文章目录摘要一、环境介绍VSvode安装步骤IDER(Pycharm)安装步骤Web使用步骤二、Moss9大功能讲解1、AI问答对话2、文件上传功能3、自定义AI助手4、AI联网助手5、AI图片识别6、思维链思维链的简单介绍使用CodeMoss思维链7、AI图片生成图片生成效果8、图片生成代码9、......
  • 黑客入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
       这篇文章没有什么套路。就是一套自学理论和方向,具体的需要配合网络黑白去学习。毕竟是有网络才会有黑白!有自学也有培训!1.打死也不要相信什么分分钟钟教你成为大黑阔的,各种包教包会的教程,就算打不死也不要去购买那些所谓的盗号软件之类的东西。2,我之前让你们在没有目......
  • 离谱!学编程两年,还不会用工具类?
    我已经在极力忍耐了,但实在是没忍住。。。那天在面试一位候选人的时候,我还是笑了出来。怎么回事呢?周二晚上我公开直播模拟面试的时候,来了一位经历“有点独特”的同学,暂且就叫他小A吧。小A才26届(刚大三),就有国赛和省赛奖项、2段实习经历、简历上也写了2个项目。最关键......
  • 做网络安全的怎么去找私活赚外快?谈谈我自己的所知的几个渠道。零基础入门到精通,收藏这
    这已经是我做网络安全工程师(简称网安)的第8个年头了,从我工作的第3年起,我就一直在开始尝试去接网安方面的私活,并不是因为我有多努力,而是男人到了谈婚论嫁的年纪,不努力也得努力。而这6年平均下来,我接私活赚的钱几乎是我工资的2倍多。而很多人要么不敢去做,要么就是做得不好,其......
  • 入门SQL一篇文章就够了
    SQL(StructuredQueryLanguage)即结构化查询语言,是用于管理关系型数据库的标准语言。一、基础环境搭建安装数据库管理系统(DBMS)常见的有MySQL、Oracle、SQLServer等。以MySQL为例,你可以从官方网站下载适合你操作系统的安装包进行安装。在安装过程中,需要注意设置好用户名、密......
  • LUA入门
    LUAlua版本(5.1+)当前多数模块对lua的版本都是5.1以上,因此要注意版本。luarocksLuarocks是一个用于Lua编程语言的包管理器。类似java中的maven,python中的pip。luarocks可从网址查看是否具有响应的包,网址:https://luarocks.org/luarocksinstalllpeg2.5对于手动下载......
  • 探索Node.js的奇妙世界:从零开始的入门之旅
    引言:在现代Web开发领域,Node.js已经成为了一颗耀眼的新星。它不仅改变了服务器端编程的游戏规则,还为开发者们提供了一种全新的方式来构建高效、可扩展的网络应用。无论你是前端开发者还是后端开发者,了解和掌握Node.js都将为你的开发生涯增添一份强大的技能。本文将带你踏上......
  • 鸿蒙基础入门01
    基础入门1.交叉轴对齐方式(Cross-axisAlignment)在Flex布局中,交叉轴是与主轴垂直的方向。可以使用align-items和align-self来调整子元素在交叉轴上的对齐方式。常见对齐方式:flex-start:子元素从交叉轴的起始位置对齐。flex-end:子元素从交叉轴的末尾对齐。center:......
  • HarmonyOS NEXT基础入门
    基础入门储存鸿蒙应用提供多种数据存储方式,包括:Preferences:轻量级数据存储,适用于简单键值对。SQLite:关系型数据库,适用于结构化数据存储。文件存储:通过文件系统直接存储数据。数组数组是一组有序的数据集合,可以通过索引访问每个元素。letnumbers=[1,2,3,4,5];con......
  • 实验6 c语言结构体 枚举应用编程
    task41#include<stdio.h>2#defineN1034typedefstruct{5charisbn[20];//isbn号6charname[80];//书名7charauthor[80];//作者8doublesales_price;//售价9intsales_count;......