当前位置: 首页 > news >正文

【C++】CUDA线程在全局索引中的计算方式

文章目录

  • 1. 一维网格一维线程块
  • 2. 二维网格二维线程块
  • 3. 三维网格三维线程块
  • 4. 不同组合形式
    • 4.1 一维网格一维线程块
    • 4.2 一维网格二维线程块
    • 4.3 一维网格三维线程块
    • 4.4 二维网格一维线程块
    • 4.5 二维网格二维线程块
    • 4.6 二维网格三维线程块
    • 4.7 三维网格一维线程块
    • 4.8 三维网格二维线程块
    • 4.9 三维网格三维线程块

1. 一维网格一维线程块

定义grid与block尺寸:

dim3 grid_size(4);
dim3 block_size(8);

调用核函数:

kernal_fun<<<grid_size, block_size>>>(...);

具体索引方式如下图所示, b l o c k I d x . x blockIdx.x blockIdx.x 从0~3, t h r e a d I d x . x threadIdx.x threadIdx.x 从0~7

在这里插入图片描述

计算方式:

i n t i d = b l o c k I d x . x ∗ b l o c k D i m . x + t h r e a d I d x . x int \ id = blockIdx.x * blockDim.x + threadIdx.x int id=blockIdx.xblockDim.x+threadIdx.x

2. 二维网格二维线程块

定义grid与block尺寸

dim3 grid_size(2,2);
dim3 block_size(4,4);

调用核函数:

kernal_fun<<<grid_size, block_size>>>(...);

具体线程索引方式如下图所示, 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 从0到1, 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从0到3:

在这里插入图片描述
计算方式:
i n t b l o c k I d = b l o c k I d x . x + b l o c k I d . y ∗ g i r d D i m . x i n t t h r e a d I d = t h r e a d I d x . y ∗ b l o c k D i m . x + t h r e a d I d x . x i n t i d = b l o c k I d ∗ ( b l o c k D i m . x ∗ b l o c k D i m . y ) + t h r e a d I d \begin{align*} &int \ blockId = blockIdx.x + blockId.y*girdDim.x \\ &int \ threadId = threadIdx.y * blockDim.x + threadIdx.x \\ &int \ id = blockId*(blockDim.x*blockDim.y) + threadId \end{align*} int blockId=blockIdx.x+blockId.ygirdDim.xint threadId=threadIdx.yblockDim.x+threadIdx.xint id=blockId(blockDim.xblockDim.y)+threadId

3. 三维网格三维线程块

定义grid和block尺寸:

dim3 grid_size(2,2,2);
dim3 block_size(4,4,2);

调用核函数:

kernal_fun<<<grid_size, block_size>>>(...);

具体线程索引方式如图所示:

在这里插入图片描述

  • b l o c k I d x . x blockIdx.x blockIdx.x 从0到1
  • b l o c k I d x . y blockIdx.y blockIdx.y 从0到1
  • b l o c k I d x . z blockIdx.z blockIdx.z 从0到1
  • t h r e a d I d x . x threadIdx.x threadIdx.x 从0到3
  • t h r e a d I d x . y threadIdx.y threadIdx.y 从0到3
  • t h r e a d I d x . z threadIdx.z threadIdx.z 从0到1

计算方式:
i n t b l o c k I d = b l o c k I d x . x + b l o c k I d x . y ∗ g i r d D i m . x + g r i d D i m . x ∗ g r i d D i m . y ∗ b l o c k I d x . z i n t t h r e a d I d = t h r e a d I d x . z ∗ b l o c k D i m . x ∗ b l o c k D i m . y + t h r e a d I d x . y ∗ b l o c k D i m . x + t h r e a d I d x . x i n t i d = b l o c k I d ∗ ( b l o c k D i m . x ∗ b l o c k D i m . y ∗ b l o c k D i m . z ) + t h r e a d I d \begin{align*} &int \ blockId = blockIdx.x + blockIdx.y*girdDim.x + gridDim.x * gridDim.y*blockIdx.z \\ &int \ threadId = threadIdx.z * blockDim.x * blockDim.y+ threadIdx.y * blockDim.x + threadIdx.x \\ &int \ id = blockId*(blockDim.x*blockDim.y*blockDim.z) + threadId \end{align*} int blockId=blockIdx.x+blockIdx.ygirdDim.x+gridDim.xgridDim.yblockIdx.zint threadId=threadIdx.zblockDim.xblockDim.y+threadIdx.yblockDim.x+threadIdx.xint id=blockId(blockDim.xblockDim.yblockDim.z)+threadId

4. 不同组合形式

4.1 一维网格一维线程块

i n t b l o c k I d = b l o c k I d x . x i n t i d = b l o c k I d x . x ∗ b l o c k D i m . x + t h r e a d I d x . x \begin{align*} &int \ blockId = blockIdx.x \\ &int \ id = blockIdx.x*blockDim.x + threadIdx.x \end{align*} int blockId=blockIdx.xint id=blockIdx.xblockDim.x+threadIdx.x

4.2 一维网格二维线程块

i n t b l o c k I d = b l o c k I d x . x i n t i d = b l o c k I d x . x ∗ b l o c k D i m . x ∗ b l o c k D i m . y + t h r e a d I d x . y ∗ b l o c k D i m . x + t h r e a d I d x . x \begin{align*} &int \ blockId = blockIdx.x \\ &int \ id = blockIdx.x*blockDim.x*blockDim.y + threadIdx.y*blockDim.x + threadIdx.x \end{align*} int blockId=blockIdx.xint id=blockIdx.xblockDim.xblockDim.y+threadIdx.yblockDim.x+threadIdx.x

4.3 一维网格三维线程块

i n t b l o c k I d = b l o c k I d x . x i n t i d = b l o c k I d x . x ∗ b l o c k D i m . x ∗ b l o c k D i m . y ∗ b l o c k D i m . z + t h r e a d I d x . z ∗ b l o c k D i m . y ∗ b l o c k D i m . x + t h r e a d I d x . y ∗ b l o c k D i m . x + t h r e a d I d x . x int \ blockId = blockIdx.x \\ int \ id = blockIdx.x*blockDim.x*blockDim.y*blockDim.z +threadIdx.z*blockDim.y*blockDim.x +threadIdx.y*blockDim.x+threadIdx.x int blockId=blockIdx.xint id=blockIdx.xblockDim.xblockDim.yblockDim.z+threadIdx.zblockDim.yblockDim.x+threadIdx.yblockDim.x+threadIdx.x

4.4 二维网格一维线程块


i n t b l o c k I d = b l o c k I d x . x + b l o c k I d x . y ∗ g r i d D i m . x i n t i d = b l o c k I d ∗ b l o c k D i m . x + t h r e a d I d x . x ​ int \ blockId=blockIdx.x+blockIdx.y∗gridDim.x \\ int \ id=blockId∗blockDim.x+threadIdx.x ​ int blockId=blockIdx.x+blockIdx.ygridDim.xint id=blockIdblockDim.x+threadIdx.x

4.5 二维网格二维线程块

i n t b l o c k I d = b l o c k I d x . x + b l o c k I d x . y ∗ g r i d D i m . x i n t i d = b l o c k I d ∗ b l o c k D i m . x ∗ b l o c k D i m . y + t h r e a d I d x . y ∗ b l o c k D i m . x + t h r e a d I d x . x int \ blockId=blockIdx.x+blockIdx.y∗gridDim.x \\ int \ id=blockId∗blockDim.x∗blockDim.y+threadIdx.y∗blockDim.x+threadIdx.x int blockId=blockIdx.x+blockIdx.ygridDim.xint id=blockIdblockDim.xblockDim.y+threadIdx.yblockDim.x+threadIdx.x

4.6 二维网格三维线程块

i n t b l o c k I d = b l o c k I d x . x + b l o c k I d x . y ∗ g r i d D i m . x i n t i d = b l o c k I d ∗ b l o c k D i m . x ∗ b l o c k D i m . y ∗ b l o c k D i m . z + t h r e a d I d x . z ∗ b l o c k D i m . x ∗ b l o c k D i m . y + t h r e a d I d x . y ∗ b l o c k D i m . x + t h r e a d I d x . x int \ blockId=blockIdx.x+blockIdx.y∗gridDim.x \\ int \ id=blockId∗blockDim.x∗blockDim.y∗blockDim.z+threadIdx.z∗blockDim.x∗blockDim.y+threadIdx.y∗blockDim.x+threadIdx.x int blockId=blockIdx.x+blockIdx.ygridDim.xint id=blockIdblockDim.xblockDim.yblockDim.z+threadIdx.zblockDim.xblockDim.y+threadIdx.yblockDim.x+threadIdx.x

4.7 三维网格一维线程块

i n t b l o c k I d = b l o c k I d x . x + b l o c k I d x . y ∗ g r i d D i m . x + b l o c k I d x . z ∗ g r i d D i m . x ∗ g r i d D i m . y i n t i d = b l o c k I d ∗ b l o c k D i m . x + t h r e a d I d x . x int \ blockId=blockIdx.x+blockIdx.y∗gridDim.x+blockIdx.z∗gridDim.x∗gridDim.y\\ int \ id=blockId∗blockDim.x+threadIdx.x int blockId=blockIdx.x+blockIdx.ygridDim.x+blockIdx.zgridDim.xgridDim.yint id=blockIdblockDim.x+threadIdx.x

4.8 三维网格二维线程块

i n t b l o c k I d = b l o c k I d x . x + b l o c k I d x . y ∗ g r i d D i m . x + b l o c k I d x . z ∗ g r i d D i m . x ∗ g r i d D i m . y i n t i d = b l o c k I d ∗ b l o c k D i m . x ∗ b l o c k D i m . y + t h r e a d I d x . y ∗ b l o c k D i m . x + t h r e a d I d x . x int \ blockId=blockIdx.x+blockIdx.y∗gridDim.x+blockIdx.z∗gridDim.x∗gridDim.y \\ int \ id=blockId∗blockDim.x∗blockDim.y+threadIdx.y∗blockDim.x+threadIdx.x int blockId=blockIdx.x+blockIdx.ygridDim.x+blockIdx.zgridDim.xgridDim.yint id=blockIdblockDim.xblockDim.y+threadIdx.yblockDim.x+threadIdx.x

4.9 三维网格三维线程块

i n t b l o c k I d = b l o c k I d x . x + b l o c k I d x . y ∗ g r i d D i m . x + b l o c k I d x . z ∗ g r i d D i m . x ∗ g r i d D i m . y i n t i d = b l o c k I d ∗ b l o c k D i m . x ∗ b l o c k D i m . y ∗ b l o c k D i m . z + t h r e a d I d x . z ∗ b l o c k D i m . x ∗ b l o c k D i m . y + t h r e a d I d x . y ∗ b l o c k D i m . x + t h r e a d I d x . x int \ blockId=blockIdx.x+blockIdx.y∗gridDim.x+blockIdx.z∗gridDim.x∗gridDim.y \\ int \ id=blockId∗blockDim.x∗blockDim.y∗blockDim.z+threadIdx.z∗blockDim.x∗blockDim.y+threadIdx.y∗blockDim.x+threadIdx.x int blockId=blockIdx.x+blockIdx.ygridDim.x+blockIdx.zgridDim.xgridDim.yint id=blockIdblockDim.xblockDim.yblockDim.z+threadIdx.zblockDim.xblockDim.y+threadIdx.yblockDim.x+threadIdx.x

相关文章:

【C++】CUDA线程在全局索引中的计算方式

文章目录 1. 一维网格一维线程块2. 二维网格二维线程块3. 三维网格三维线程块4. 不同组合形式4.1 一维网格一维线程块4.2 一维网格二维线程块4.3 一维网格三维线程块4.4 二维网格一维线程块4.5 二维网格二维线程块4.6 二维网格三维线程块4.7 三维网格一维线程块4.8 三维网格二维…...

【笔记】C语言转C++

网课链接&#xff1a;【C语言 转 C 简单教程】 https://www.bilibili.com/video/BV1UE411j7Ti/?p27&share_sourcecopy_web&vd_source4abe1433c2a7ef632aeed6a3d5c0b22a 网课老师B站id:别喷我id 视频总时长&#xff1a;01:55:27 以下笔记是我通过此网课整理 建议先…...

锂电池SOH预测 | 基于BiGRU双向门控循环单元的锂电池SOH预测,附锂电池最新文章汇集

锂电池SOH预测 | 基于BiGRU双向门控循环单元的锂电池SOH预测&#xff0c;附锂电池最新文章汇集 目录 锂电池SOH预测 | 基于BiGRU双向门控循环单元的锂电池SOH预测&#xff0c;附锂电池最新文章汇集预测效果基本描述程序设计参考资料 预测效果 基本描述 锂电池SOH预测 | 基于Bi…...

半导体器件与物理篇5 1~4章课后习题

热平衡时的能带和载流子浓度 例 一硅晶掺入每立方厘米10^{16}个砷原子&#xff0c;求室温下(300K)的载流子浓度与费米能级。 需要用到的公式包括1.本征载流子浓度公式 2.从导带底算起的本征费米能级 2.从本征费米能级算起的费米能级 载流子输运现象 例1:计算在300K下&#x…...

Pytest-Bdd-Playwright 系列教程(16):标准化JSON报告Gherkin格式命令行报告

Pytest-Bdd-Playwright 系列教程&#xff08;16&#xff09;&#xff1a;标准化JSON报告&Gherkin格式命令行报告 前言一、创建Feature文件二、创建步骤定义文件三、生成Cucumber格式的JSON报告四、使用Gherkin格式的命令行报告五、将BDD报告集成到Jenkins中总结 前言 在自动…...

机器学习之学习范式

机器学习的四种主要范式分别是&#xff1a;监督学习、非监督学习、强化学习和半监督学习。以下是每种范式的详细介绍&#xff1a; 1. 监督学习&#xff08;Supervised Learning&#xff09; 定义&#xff1a; 通过已标注的数据训练模型&#xff0c;以预测或分类未知数据。 目…...

PHPstudy中的数据库启动不了

法一 netstat -ano |findstr "3306" 查看占用该端口的进程号 taskkill /f /pid 6720 杀死进程 法二 sc delete mysql...

鸿蒙开发-ArkTS 创建自定义组件

在 ArkTS 中创建自定义组件是一个相对简单但功能强大的过程。以下是如何在 ArkTS 中创建和使用自定义组件的详细步骤&#xff1a; 一、定义自定义组件 使用Component注解&#xff1a;为了注册一个组件&#xff0c;使其能够在其他文件中被引用&#xff0c;你需要使用Component…...

记录学习《手动学习深度学习》这本书的笔记(五)

这一章是循环神经网络&#xff0c;太难了太难了&#xff0c;有很多卡壳的地方理解了好久&#xff0c;比如隐藏层和隐状态的区别、代码的含义&#xff08;为此专门另写了一篇【笔记】记录对自主实现一个神经网络的步骤的理解&#xff09;、梯度计算相关&#xff08;【笔记】记录…...

【Qt】Qt+Visual Studio 2022环境开发

在使用Qt Creator的过程中&#xff0c;项目一大就会卡&#xff0c;所以我一般都是用VS开发Cmake开发&#xff0c; 在上一篇文章中&#xff0c;我已经安装了CMake&#xff0c;如果你没有安装就自己按一下。 记得配置Qt环境变量&#xff0c;不然CMake无法生成VS项目&#xff1a…...

云计算HCIP-OpenStack04

书接上回&#xff1a; 云计算HCIP-OpenStack03-CSDN博客 12.Nova计算管理 Nova作为OpenStack的核心服务&#xff0c;最重要的功能就是提供对于计算资源的管理。 计算资源的管理就包含了已封装的资源和未封装的资源。已封装的资源就包含了虚拟机、容器。未封装的资源就是物理机提…...

HCIA-Access V2.5_3_2_VLAN数据转发

802.1Q的转发原则--Access-Link 首先看一下Access,对于Access端口来说&#xff0c; 它只属于一个VLAN,它的VLANID等于PVID。 首先看一下接收方向&#xff0c;前面说过交换机内部一定要带标签转发&#xff0c;所以当交换机接收到一个不带tag的数据帧时&#xff0c;会给它打上端…...

transformer学习笔记-导航

本系列专栏&#xff0c;主要是对transformer的基本原理做简要笔记&#xff0c;目前也是主要针对个人比较感兴趣的部分&#xff0c;包括&#xff1a;神经网络基本原理、词嵌入embedding、自注意力机制、多头注意力、位置编码、RoPE旋转位置编码等部分。transformer涉及的知识体系…...

功能篇:JAVA后端实现跨域配置

在Java后端实现跨域配置&#xff08;CORS&#xff0c;Cross-Origin Resource Sharing&#xff09;有多种方法&#xff0c;具体取决于你使用的框架。如果你使用的是Spring Boot或Spring MVC&#xff0c;可以通过以下几种方式来配置CORS。 ### 方法一&#xff1a;全局配置 对于所…...

防火墙内局域网特殊的Nginx基于stream模块进行四层协议转发模块的监听443 端口并将所有接收转发到目标服务器

在一些特殊场合下, 公司内部网络防火墙限制, 不能做端口映射, 此时可以使用nginx的做从四层协议转发, 只走tcp/ip协议, 而不走http方式, 可以做waf设置, 就可以做443, 或其它端口, 从而达到被直接转发到远程服务器效果 机房只映射了一个IP:22280, 而需求是这个SDK只能通过…...

【Hive】-- hive 3.1.3 伪分布式部署(单节点)

1、环境准备 1.1、版本选择 apache hive 3.1.3 apache hadoop 3.1.0 oracle jdk 1.8 mysql 8.0.15 操作系统:Mac os 10.151.2、软件下载 https://archive.apache.org/dist/hive/ https://archive.apache.org/dist/hadoop/ 1.3、解压 tar -zxvf apache-hive-4.0.0-bin.tar…...

C++ STL 队列queue详细使用教程

序言 我们平常写广搜什么&#xff0c;上来就是一句 queue<XXX> qu; 说明队列时很重要的。 STL库中的queue把队列的各种操作封装成一个类&#xff0c;非常方便&#xff0c;信奥中使用它也是很有优势的。 目录 一、队列的定义 二、创建队列对象 三、队列的初始化 四、常…...

【前端】JavaScript 中的 filter() 方法的理论与实践深度解析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;filter() 方法的概念与原理1. 什么是 filter()&#xff1f;2. 基本工作原理3. 方法特点4. 用法格式参数解析 &#x1f4af;代码案例详解示例&#xff1a;筛选有效数字并…...

【机器学习算法】——决策树之集成学习:Bagging、Adaboost、Xgboost、RandomForest、XGBoost

集成学习 **集成学习(Ensemble learning)**是机器学习中近年来的一大热门领域。其中的集成方法是用多种学习方法的组合来获取比原方法更优的结果。 使用于组合的算法是弱学习算法&#xff0c;即分类正确率仅比随机猜测略高的学习算法&#xff0c;但是组合之后的效果仍可能高于…...

JVM运行时数据区内部结构

VM内部结构 对于jvm来说他的内部结构主要分成三个部分&#xff0c;分别是类加载阶段&#xff0c;运行时数据区&#xff0c;以及垃圾回收区域&#xff0c;类加载我们放到之后来总结&#xff0c;今天先复习一下类运行区域 首先这个区域主要是分成如下几个部分 下面举个例子来解释…...

comsol电磁超声压电接收EMAT 在1mm厚铝板中激励250kHz的电磁超声在200mm位...

comsol电磁超声压电接收EMAT 在1mm厚铝板中激励250kHz的电磁超声在200mm位置处设置一个深0.8mm的裂纹缺陷&#xff0c;左端面设为低反射边界 在85mm位置处放置一个压电片接收信号&#xff0c;信号如图3所示&#xff0c;三个波分别为始波&#xff0c;裂纹反射波(S0模态)和右端面…...

数据科学驱动的自动化分析:缠论量化开源工具包的技术实践与价值

数据科学驱动的自动化分析&#xff1a;缠论量化开源工具包的技术实践与价值 【免费下载链接】chanvis 基于TradingView本地SDK的可视化前后端代码&#xff0c;适用于缠论量化研究&#xff0c;和其他的基于几何交易的量化研究。 缠论量化 摩尔缠论 缠论可视化 TradingView TV-SD…...

深度解析:数据仓库——定义、核心架构与企业核心价值

深度解析&#xff1a;数据仓库——定义、核心架构与企业核心价值一、引言二、定义&#xff1a;什么是数据仓库&#xff1f;2.1 标准定义2.2 核心四大特征&#xff08;数据仓库基石&#xff09;三、架构流程&#xff1a;数据仓库的标准工作流程&#xff08;带流程图&#xff09;…...

MStar-Bin-Tool-Master中文版|晨星芯片BIN固件解包/封包工具(适配机顶盒与智能电视)

温馨提示&#xff1a;文末有联系方式工具简介 MStar-Bin-Tool-Master中文增强版是一款专为晨星&#xff08;MStar&#xff09;系列主控芯片设计的固件解析与重构工具&#xff0c;全面支持主流机顶盒与智能液晶电视所用BIN格式刷机包&#xff0c;提供直观易用的图形化操作界面&a…...

电力系统输电线路距离保护建模与仿真:方向阻抗继电器探秘

1.电力系统输电线路距离保护的建模与仿真matlab/simulink仿真模型 2.方向阻抗继电器 &#xff08;1&#xff09;“0度接线”方向阻抗继电器的构造 &#xff08;2&#xff09;“相电压和具有K3I0补偿的相电流接线”的方向阻抗继电器模块的构造在电力系统中&#xff0c;输电线路距…...

基于RK3506与LVGUI的CyberGear电机交互式控制台开发实践

1. 从零搭建CyberGear电机控制环境 第一次拿到RK3506开发板和小米CyberGear电机时&#xff0c;我花了整整两天时间才把基础环境搭好。这里分享几个关键步骤&#xff0c;帮你避开我踩过的坑。 硬件连接部分要注意XT30PB插头的防呆设计&#xff0c;插反了会烧毁接口。建议先用万用…...

YOLOv5+Swin-Tiny实战:在自定义数据集上提升小目标检测精度的完整流程

YOLOv5与Swin-Tiny融合实战&#xff1a;工业级小目标检测优化指南 在无人机巡检、遥感监测和工业质检等场景中&#xff0c;小目标检测一直是计算机视觉领域的棘手挑战。传统卷积神经网络(CNN)在处理这类任务时&#xff0c;往往难以兼顾感受野与计算效率的平衡。本文将带您探索如…...

Scratch飞翔小鸟游戏制作教程:从零开始打造你的第一个像素风小游戏

Scratch飞翔小鸟游戏制作教程&#xff1a;从零开始打造你的第一个像素风小游戏 当孩子们第一次接触编程时&#xff0c;往往会被复杂的代码和抽象的概念吓退。而Scratch就像一扇通往创意世界的大门&#xff0c;用积木式的编程方式让游戏开发变得触手可及。今天&#xff0c;我们将…...

Qwen3-14B GPU算力优化实践:显存占用降低28%的FlashAttention-2配置

Qwen3-14B GPU算力优化实践&#xff1a;显存占用降低28%的FlashAttention-2配置 1. 开箱即用的私有部署方案 对于想要快速部署Qwen3-14B大模型的企业和个人开发者来说&#xff0c;这个经过优化的私有部署镜像提供了完美的解决方案。它基于RTX 4090D 24GB显存显卡和CUDA 12.4环…...

终极指南:3步用VR-Reversal将3D视频转为2D,普通设备也能自由探索VR世界

终极指南&#xff1a;3步用VR-Reversal将3D视频转为2D&#xff0c;普通设备也能自由探索VR世界 【免费下载链接】VR-reversal VR-Reversal - Player for conversion of 3D video to 2D with optional saving of head tracking data and rendering out of 2D copies. 项目地址…...