【C++】CUDA线程模型

文章目录

  • 1. 线程模型概述
  • 2. 一维线程模型
  • 3. 多维线程模型
    • 3.1 多维线程模型概述
    • 3.2 多维线程模型定义
    • 3.3 多维线程模型中的索引
  • 4. 网格和线程块的限制条件

1. 线程模型概述

在CUDA编程中,线程的组织形式是多维的,主要通过网格(Grid)和线程块(Block)来管理。了解线程模型对于有效设计并行计算非常重要。以下是一些核心概念:

线程模型的重要概念:

  • grid (网格):网格是线程的整体组织结构。它由多个线程块(Block)组成,每个线程块又包含多个线程。一个Grid可以视为整个计算任务的执行单元。
  • block (线程块):线程块是网格中的一个子集,包含多个线程。每个线程块的执行可以独立于其他线程块。线程块之间没有数据共享,但可以通过共享内存进行通信。

线程分块是逻辑上的,物理上线程不分块。CUDA允许开发者通过指定grid_size和block_size来配置线程的组织结构:

  • grid_size:指定一个网格(Grid)中包含多少个线程块(Block)。
  • block_size:指定每个线程块中包含多少个线程。

线程配置采用如下的语法:

<<<grid_size, block_size>>>
  • 最大线程块大小:每个线程块最多允许包含 1024 个线程。
  • 最大网格大小:每个网格最多可以包含 2 31 − 1 2^{31} - 1 2311 个线程块。

可以理解为:

  • 一个Grid最多有 2 31 − 1 2^{31} - 1 2311 个线程块。
  • 每个 线程块(Block) 最多有 1024个线程。

2. 一维线程模型

  • 每个线程在核函数中都有一个唯一的身份标识
  • 每个线程的唯一标识由 <<<grid_size, block_size>>> 确定,grid_size, block_size保存在内建变量(build-in variable),目前考虑的是一维情况:
    (1)gridDim.x :该变量的数值等于执行配置中变量grid_size的值
    (2)blockDim.x :该变量的数值等于执行配置中变量block_size的值
  • 线程索引保存成内建变量(build-in variable)
    (1)blockIdx.x:该变量指定一个线程在一个网格中的线程块索引值,范围为0~gridDim.x -1
    (2)threadIdx.x:该变量指定一个线程在一个网格中的线程块索引值,范围0~blockDim.x -1

例如: kernal_fun<<<2,4>>>():
在这里插入图片描述

  • g r i d D i m . x gridDim.x gridDim.x :值为 2
  • b l o c k D i m . x blockDim.x blockDim.x :值为 4
  • b l o c k I d x . x blockIdx.x blockIdx.x :取值为 0~1
  • t h r e a d I d x . x threadIdx.x threadIdx.x :取值为 0~3

线程唯一标识:
I d x = t h r e a d I d x . x + b l o c k I d x . x ∗ b l o c k D i m . x Idx = threadIdx.x + blockIdx.x*blockDim.x Idx=threadIdx.x+blockIdx.xblockDim.x

3. 多维线程模型

3.1 多维线程模型概述

CUDA可以组织三维网格和线程块

blockIdxthreadIdx是类型为uint3的变量,该类型是一个结构体,具有x, y, z三个成员(3个成员都为无符号类型的成员构成):

  • b l o c k I d x . x blockIdx.x blockIdx.x
  • b l o c k I d x . y blockIdx.y blockIdx.y
  • b l o c k I d x . z blockIdx.z blockIdx.z

  • t h r e a d I d x . x threadIdx.x threadIdx.x
  • t h r e a d I d x . y threadIdx.y threadIdx.y
  • t h r e a d I d x . z threadIdx.z threadIdx.z

gridDimblockDim是类型为dim3的变量,该类型是一个结构体,具有x, y, z三个成员:

  • g r i d D i m . x gridDim.x gridDim.x
  • g r i d D i m . y gridDim.y gridDim.y
  • g r i d D i m . z gridDim.z gridDim.z

  • b l o c k D i m . x blockDim.x blockDim.x
  • b l o c k D i m . y blockDim.y blockDim.y
  • b l o c k D i m . z blockDim.z blockDim.z

取值范围:

  • b l o c k I d x . x blockIdx.x blockIdx.x :范围 [ 0 , g r i d D i m . x − 1 ] [0, gridDim.x-1] [0,gridDim.x1]
  • b l o c k I d x . y blockIdx.y blockIdx.y :范围 [ 0 , g r i d D i m . y − 1 ] [0, gridDim.y-1] [0,gridDim.y1]
  • b l o c k I d x . z blockIdx.z blockIdx.z :范围 [ 0 , g r i d D i m . z − 1 ] [0, gridDim.z-1] [0,gridDim.z1]

  • t h r e a d I d x . x threadIdx.x threadIdx.x : 范围 [ 0 , b l o c k D i m . x − 1 ] [0, blockDim.x-1] [0,blockDim.x1]
  • t h r e a d I d x . y threadIdx.y threadIdx.y : 范围 [ 0 , b l o c k D i m . y − 1 ] [0, blockDim.y-1] [0,blockDim.y1]
  • t h r e a d I d x . z threadIdx.z threadIdx.z : 范围 [ 0 , b l o c k D i m . z − 1 ] [0, blockDim.z-1] [0,blockDim.z1]

注意:内建变量只在核函数有效,且无需定义

在一维线程模型中 <<<grid_size, block_size>>> :

  • g r i d _ s i z e grid\_size grid_size 对应 g r i d D i m . x gridDim.x gridDim.x
  • b l o c k _ s i z e block\_size block_size 对应 b l o c k D i m . x blockDim.x blockDim.x

g r i d D i m gridDim gridDim b l o c k D i m blockDim blockDim 中没有指定的维度默认为1:

  • g r i d D i m . x = g r i d _ s i z e gridDim.x =grid\_size gridDim.x=grid_size
  • g r i d D i m . y = 1 gridDim.y =1 gridDim.y=1
  • g r i d D i m . z = 1 gridDim.z =1 gridDim.z=1
  • b l o c k D i m . x = b l o c k _ s i z e blockDim.x=block\_size blockDim.x=block_size
  • b l o c k D i m . y = 1 blockDim.y =1 blockDim.y=1
  • b l o c k D i m . z = 1 blockDim.z =1 blockDim.z=1

3.2 多维线程模型定义

定义多维网格和线程块(C++构造函数语法):

dim3 grid_size(Gx,Gy,Gz);
dim3 block_size(Bx,By,Bz);

举个例子:定义一个 2*2*1 的网格,5*3*1的线程块,代码定义如下:

dim3 grid_size(2,2);   //等价于dim3 grid_size(2,2,1);
dim3 block_size(5,3);  //等价于dim3 block_size(5,3,1);

多维网格和多维线程块本质上是一维,GPU物理上不分块
每个线程都有一个唯一标识:

  • int tid = threadIdx.y*blockDim.x + threadIdx.x;
  • int bid = blockIdx.y*gridDim.x + blockIdx.x;

3.3 多维线程模型中的索引

  • 多维度线程块中的线程索引:
    int tid = threadIdx.z * blockDim.x * blockDim.y + threadIdx.y * blockDim.x + threadIdx.x;

  • 多维网格中的线程块索引:
    int bid = blockIdx.z * gridDim.x * gridDim.y + blockIdx.y * gridDim.x + blockIdx.x;

4. 网格和线程块的限制条件

网格大小限制:

  • g r i d D i m . x gridDim.x gridDim.x 最大值 2 31 − 1 2^{31}-1 2311
  • g r i d D i m . y gridDim.y gridDim.y 最大值 2 16 − 1 2^{16}-1 2161
  • g r i d D i m . z gridDim.z gridDim.z 最大值 2 16 − 1 2^{16}-1 2161

线程块大小限制:

  • b l o c k D i m . x blockDim.x blockDim.x 最大值1024
  • b l o c k D i m . y blockDim.y blockDim.y 最大值1024
  • b l o c k D i m . z blockDim.z blockDim.z 最大值64

注意:线程块总的大小最大为1024!!!, 即 blockDim.x*blockDim.y*blockDim.z 不能超过1024

如有错误欢迎指正
本文参考:https://www.bilibili.com/video/BV1sM4y1x7of/?spm_id_from=333.788.videopod.episodes&vd_source=cf0b4c9c919d381324e8f3466e714d7a&p=4

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JAVA高级篇教学】第二篇:使用 Redisson 实现高效限流机制

在高并发系统中&#xff0c;限流是一项非常重要的技术手段&#xff0c;用于保护后端服务&#xff0c;防止因流量过大导致系统崩溃。本文将详细介绍如何使用 Redisson 提供的 RRateLimiter 实现分布式限流&#xff0c;以及其原理、使用场景和完整代码示例。 目录 一、什么是限流…

聊聊在应用层面实现内网穿透功能是否可行

前言 最近接手了供方开发的网关项目&#xff0c;交接文档里面有个内网穿透的功能&#xff0c;一下子就吸引的我的目光。实现这个内网穿透的背景是业务部门有些业务是部署在公网&#xff0c;这些公网的业务想访问内网的业务&#xff0c;但因为公网和内网没打通&#xff0c;导致…

TPC-H数据集使用说明

TPCH数据使用说明 表模式&#xff1a; TPCH官网链接&#xff1a;TPC-H Homepage 同学们可以自行下载TPCH-tools自行生成数据&#xff08;10GB&#xff09;&#xff0c;下面主要是以mysql为例说明TPC-H的使用方法。 供同学自行参考&#xff1a; windows &#xff1a;TPC-H测…

vue2+html2canvas+js PDF实现试卷导出和打印功能

1.首先安装 import html2canvas from html2canvas; import { jsPDF } from jspdf; 2.引入打印插件print.js import Print from "/assets/js/print"; Vue.use(Print) // 打印类属性、方法定义 /* eslint-disable */ const Print function (dom, options) {if (…

Simdroid-EC:液冷仿真新星,助力新能源汽车电机控制器高效散热

近年来&#xff0c;新能源电动车的销量呈现出快速增长的态势。据统计&#xff0c;2024 年1-10月中国新能源汽车销量达728万辆&#xff0c;同比增长37.8%。 电机控制器在新能源汽车中对于保障动力和安全性能扮演着至关重要的角色&#xff0c;其核心部件IGBT&#xff08;绝缘栅双…

静态路由与交换机配置实验

1.建立网络拓扑 添加2台计算机&#xff0c;标签名为PC0、PC1&#xff1b;添加2台二层交换机2960&#xff0c;标签名为S0、S1&#xff1b;添加2台路由器2811&#xff0c;标签名为R0、R1&#xff1b;交换机划分的VLAN及端口根据如下拓扑图&#xff0c;使用直通线、DCE串口线连接…

深度学习:MindSpore自动并行

随着模型规模的逐渐增大&#xff0c;需要的算力逐渐增强&#xff0c;但是算力需求增长速度远高于芯片算力增长速度。现在唯一的解决方案只有通过超大规模集群训练大模型。 大集群训练大模型的挑战 内存墙 200B参数量的模型&#xff0c;参数内存占用745GB内存&#xff0c;训练…

前端成长之路:HTML(2)

HTML中有两个非常重要的标签——表格和表单&#xff0c;在介绍之前需要先了解表格和表单的区别&#xff1a;表格是用于展示数据的&#xff1b;表单是用于提交数据的。本文主要介绍表格。 表格标签 表格主要是用于显示、展示数据的&#xff0c;并非是页面布局。它可以使本来难…

如何使用WinCC DataMonitor基于Web发布浏览Excel报表文档

本文介绍使用 WinCC DataMonitor 的 "Excel Workbooks" 功能&#xff0c;通过 Excel 表格显示 WinCC 项目的过程值、归档变量值和报警归档消息。并可以通过 Web 发布浏览访问数据 1&#xff0e;WinCC DataMonitor是什么 ? DataMonitor 是 SIMATIC WinCC 工厂智能中…

Facebook广告突然无消耗?原因解析与解决方案。

在Facebook广告投放中&#xff0c;广告突然无消耗是很多广告主都会遇到的难题。这种情况不仅浪费时间&#xff0c;还可能导致营销活动停滞&#xff0c;影响业务发展。那么&#xff0c;广告无消耗的原因是什么&#xff1f;又该如何解决呢&#xff1f; 一、Facebook广告无消耗的…

安卓调试环境搭建

前言 前段时间电脑重装了系统&#xff0c;最近准备调试一个apk&#xff0c;没想到装环境的过程并不顺利&#xff0c;很让人火大&#xff0c;于是记录一下。 反编译工具下载 下载apktool.bat和apktool.jar 官网地址&#xff1a;https://ibotpeaches.github.io/Apktool/install…

shell基础知识4----正则表达式

一、文本搜索工具——grep grep -参数 条件 文件名 其中参数有以下&#xff1a; -i 忽略大小写 -c 统计匹配的行数 -v 取反&#xff0c;不显示匹配的行 -w 匹配单词 -E 等价于 egrep &#xff0c;即启用扩展正则表达式 -n 显示行号 -rl 将指定目录内的文件打…

git branch -vv(显示本地分支与远程分支的最新状态和提交信息)(very verbose mode)

文章目录 字段说明下一步操作建议字段说明当前状态分析相关操作建议 -vv功能说明-vv 与单个 -v 的区别总结 出现如下状况&#xff0c;是因为我把本地的develop分支没有提交到gitlab上的develop分支。 而是把develop分支的内容提交到了gitlab上的master分支&#xff0c;这样是不…

树莓派4B android 系统添加led灯 Hal 层

本文内容需要用到我上一篇文章做的驱动&#xff0c;可以先看文章https://blog.csdn.net/ange_li/article/details/136759249 一、Hal 层的实现 1.Hal 层的实现一般放在 vendor 目录下&#xff0c;我们在 vendor 目录下创建如下的目录 aosp/vendor/arpi/hardware/interfaces/…

Apache DolphinScheduler 限制秒级别的定时调度

背景 Apache DolphinScheduler 定时任务配置采用的 7 位 Crontab 表达式&#xff0c;分别对应秒、分、时、月天、月、周天、年。 在团队日常开发工作中&#xff0c;工作流的定时调度一般不会细化到秒级别。但历史上出现过因配置的疏忽大意而产生故障时间&#xff0c;如应该配…

MTK Android12 开机向导

文章目录 需求-场景参考资料&#xff1a;博客资料官网参考资料&#xff1a;参考资料注意点 附件资料文件说明&#xff1a;推荐工具&#xff1a;配置定制的 声明叠加层 APK需求实现替换字符、删减开机向导界面、添加开机向导界面删除部分界面需求&#xff0c;官网说明如下更新部…

Text2SQL(NL2sql)对话数据库:设计、实现细节与挑战

Text2SQL&#xff08;NL2sql&#xff09;对话数据库&#xff1a;设计、实现细节与挑战 前言1.何为Text2SQL&#xff08;NL2sql&#xff09;2.Text2SQL结构与挑战3.金融领域实际业务场景4.注意事项5.总结 前言 随着信息技术的迅猛发展&#xff0c;人机交互的方式也在不断演进。…

长沙数字孪生工业互联网三维可视化技术,赋能新型工业化智能制造工厂

长沙正积极拥抱数字化转型的浪潮&#xff0c;特别是在工业互联网和智能制造领域&#xff0c;长沙数字孪生技术的广泛应用&#xff0c;为新型工业化智能制造工厂的建设与发展注入了强劲动力。 在长沙智能制造工厂内&#xff0c;三维可视化技术被广泛应用于产线设计仿真优化和产…

FPGA工作原理、架构及底层资源

FPGA工作原理、架构及底层资源 文章目录 FPGA工作原理、架构及底层资源前言一、FPGA工作原理二、FPGA架构及底层资源 1.FPGA架构2.FPGA底层资源 2.1可编程输入/输出单元简称&#xff08;IOB&#xff09;2.2可配置逻辑块2.3丰富的布线资源2.4数字时钟管理模块(DCM)2.5嵌入式块 …

计算机网络期末常见问答题总结

1、试说明为什么在运输建立时使用三报文握手&#xff0c;如果不采用三报文握手会出现什么情况&#xff1f; TCP三次握手的目的是确保客户端和服务器都能够接收对方的连接请求,并建立起可靠的连接。如果只进行两次握手,可能会导致以下情况的发生: - 如果客户端发送的SYN包在网…