3.1 CUDA Thread Organization

news2024/11/14 20:07:05

在第2章中,数据并行计算,我们学会了编写一个简单的CUDA C程序,该程序启动内核和线程网格,以对一维数组中的元素进行操作。内核指定每个线程执行的C语句。当我们发动如此大规模的执行活动时,我们需要控制这些活动,以实现预期的结果、效率和速度。在本章中,我们将研究并行执行控制所涉及的重要概念。我们将首先学习线程索引和块索引如何促进多维数组的处理。随后,我们将探索灵活资源分配的概念和占用的概念。然后,我们将进入线程调度、延迟容忍度和同步。掌握这些概念的CUDA程序员完全有能力编写和理解高性能并行应用程序。

网格中的所有CUDA线程执行相同的内核函数;它们依靠坐标来区分彼此,并确定要处理的适当数据部分。这些线程被组织成两级层次结构:网格由一个或多个块组成,每个块由一个或多个线程组成。块中的所有线程共享相同的块索引,这是内核中blockIdx变量的值。每个线程都有一个线程索引,可以作为内核中threadldx变量的值访问。当线程执行内核函数时,对blockldx和threadldx变量的引用返回线程的坐标。内核启动语句中的执行配置参数指定了网格的尺寸和每个块的尺寸。这些维度是内核函数中变量gridDim和blockDim的值

层次组织
与CUDA线程类似,许多现实世界的系统是分层组织的。美国电话系统就是一个很好的例子。在顶层,电话系统由“区域”组成,每个区域对应一个地理区域。同一区域内的所有电话线都具有相同的3位数“区号”。电话区域可以比城市大;例如,伊利诺伊州中部的许多县和城市位于同一电话区域内,并共享相同的区号217。在一个区域内,每条电话线都有一个七位数的本地电话号码,这使得每个区域最多可以有大约1000万个号码。
每条电话线可以被视为CUDA线程,区号可以视为blockIdx的值,七位本地号码可以被视为线程-Idx的值。这种分层组织允许系统容纳相当多的电话线,同时保留呼叫同一区域的“位置”。在同一区域拨打电话线时,来电者只需要拨打本地号码。只要我们在当地拨打大部分电话,我们很少需要拨打区号。如果我们偶尔需要拨打另一个地区的电话线,我们拨打1"和区号,然后拨打本地号码。(这就是为什么任何地区的本地号码都不应该以“1”开头的原因)CUDA线程的分层组织也提供了一种局部性形式,将在这里进行研究。

一般来说,网格是块的三维数组,每个块都是线程的三维数组。启动内核时,程序需要指定每个维度的网格和块的大小。通过将未使用维度的大小设置为1,程序员可以使用少于三个维度。网格的确切组织由内核启动语句的执行配置参数(在<<< >>>内)决定。第一个执行配置参数在块数中指定网格的尺寸。第二个指定了线程数中每个块的尺寸。每个这样的参数都是dim3类型,这是一个具有三个无符号整数字段的C结构:x、y和z。这三个字段指定了三维的大小。

计算能力小于2.0的设备支持具有高达二维块数组的网格。

为了说明,以下主机代码可用于启动vecAddkernel() 内核函数,并生成一个由32个块组成的1D网格,每个块由128个线程组成。网格中的线程总数为128*32 = 4096。

dim3 dimGrid(32, 1, 1);
dim3 dimBlock(128, 1, 1);
vecAddKernel<<<dimGrid, dimBlock>>>(…);

请注意,dimBlock和dimGrid是程序员定义的主机代码变量。这些变量可以具有任何合法的C变量名,只要它们是dim3类型,并且内核启动使用适当的名称。例如,以下语句与上述语句相同:

dim3 dog(32, 1, 1);
dim3 cat(128, 1, 1);
vecAddKernel<<<dog, cat>>>(…);

网格和块尺寸也可以从其他变量计算。图2.15中的内核启动可以写成如下:

dim3 dimGrid(ceil(n/256.0), 1, 1);
dim3 dimBlock(256, 1, 1);
vecAddKernel<<<dimGrid, dimBlock>>>(…);

块的数量可能会随着网格的向量大小而变化,以便有足够的线程来覆盖所有矢量元素。在本例中,程序员选择将块大小固定为256。内核启动时变量n的值将决定网格的维度。如果n等于1000,网格将由四个块组成。如果n等于4000,网格将有16个块。在每种情况下,都会有足够的线程来覆盖所有矢量元素。一旦vecAddKernel启动,网格和块尺寸将保持不变,直到整个网格完成执行。

为了方便起见,CUDA C为启动具有一维网格和块的内核提供了一个特殊的快捷方式。算术表达式可以用来指定ID网格和块的配置,而不是dim3变量。在这种情况下,CUDA C编译器只是将算术表达式作为x维度,并假设y和z维度是1。因此,内核启动语句如图2.15所示:

vecAddKernel<<<ceil(n/256.0), 256>>>(…);

熟悉C中结构使用的读者会意识到,这种1D配置的“速记”惯例利用了x字段是dim3结构gridDim(x,y,z)和blockDimlx,y,z)的第一个字段这一事实。此快捷方式允许编译器使用执行配置参数中提供的值方便地初始化gridDim和blockDim的x字段。

在内核函数中,变量gridDim和blockDim的x字段根据执行配置参数的值进行预初始化。如果n等于4000,vectAddkernel内核中对gridDim.x和blockDim.x的引用将分别获得16和256。与主机代码中的dim3变量不同,内核函数中这些变量的名称是CUDA C规范的一部分,不能更改——即内核中的gridDim和blockDim总是反映网格和块的维度。

在CUDA C中,gridDim.x、gridDim.y和gridDim.z的允许值从1到65,530不等。块中的所有线程共享相同的blockIdx.x、blockldx.y和blockldx.z值。在块中,blockldx.x值从0到gridDim.x-1,blockldx.y值从O到gridDim.y-1,blockldx.z值从O到gridDim.z-1。

关于块的配置,每个块都组织成一个三维线程数组。可以通过将blockDim.z设置为1来创建二维块。可以通过将blockDim.y和blockDim.z设置为1来创建一维块,就像vectorAddkernel示例中的情况一样。如前所述,网格中的所有块都具有相同的尺寸和大小。块每个维度的线程数由内核启动时的第二个执行配置参数指定。在内核中,此配置参数可以作为blockDim的x、y和z字段访问。

块的总尺寸限制在1024个线程,只要线程总数不超过1024,就可以灵活地将这些元素分配到三维中。例如,blockDim(512,1,1)、blockDim(8, 16,4)和blockDim(32, 16, 2)是允许的blockDim值,但blockDim(32, 32, 2)是不允许的,因为线程总数将超过1024.

网格可以具有比其块更高的维度,反之亦然。例如,图 3.1显示了gridDim(2,2,1)与block-Dim(4,2,2)的小玩具网格示例。网格可以使用以下主机代码生成:

dim3 dimGrid(2, 2, 1);
dim3 dimBlock(4, 2, 2);
KernelFunction<<<dimGrid, dimBlock>>>(…);

网格由四个块组成,组织成一个2×2的阵列。图3.1中的每个block被标记为(blockldx.y,blockIdx.x),例如,Block(1,0)有blockIdx.y=1和blockldx.x=0。标签的顺序是,最高维度是第一位的。请注意,此块标记符号是C语句中用于设置配置参数的反向顺序其中最低维度优先当我们说明在访问多维数据时将线程坐标映射到数据索引时,这种标记块的反向排序效果会更有效。
在这里插入图片描述

每个threadIdx还由三个字段组成:x坐标threadId.x、y坐标threadldx.y和z坐标threadldx.z。图3.1说明了块中线程的组织。在本例中,每个块被组织成4x2×2的线程数组。网格中的所有块都具有相同的维度;因此,我们只需要展示其中一个。图3.1扩展了Block(1,1)以显示其16个线程。例如,Thread(1,0,2)有threadldx.z=1、threadldx.y=0和threadldx.x=2。这个例子显示了4个块,每个块有16个线程,网格中共有64个线程。我们用这些小数字来保持插图的简单。典型的CUDA网格包含数千到数百万个线程

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

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

相关文章

【书生·浦语大模型实战营02】《轻松玩转书生·浦语大模型趣味Demo》学习笔记

《轻松玩转书生浦语大模型趣味Demo》 教程文档&#xff1a;《轻松玩转书生浦语大模型趣味 Demo文档》 致谢 感谢助教 MINGX 的帮助&#xff5e; 1、InternLM-Chat-7B 智能对话&#xff1a;生成 300 字的小故事 本节中我们将使用InternLM-Chat-7B 模型部署一个智能对话 Dem…

深入了解static关键字的作用和应用--java面向对象学习

Static修饰成员变量 Static是什么 叫静态&#xff0c;可以修饰成员变量&#xff0c;成员方法 成员变量按有无static修饰分俩种&#xff1a; 类变量&#xff1a;有static修饰&#xff0c;属于类&#xff0c;在计算机里只有一份&#xff0c;会被类的全部对…

Saprk SQL基础知识

一.Spark SQL基本介绍 1.什么是Spark SQL Spark SQL是Spark多种组件中其中一个,主要是用于处理大规模的[结构化数据] Spark SQL的特点: 1).融合性:既可以使用SQL语句,也可以编写代码,同时支持两者混合使用. 2).统一的数据访问:Spark SQL用统一的API对接不同的数据源 3).H…

vueRouter 配合 keep-alive 不生效的问题

文章目录 问题说明案例复现demo 结构问题复现和解决 其实这个不生效的问题根本也不算一个问题&#xff0c;犯的错和写错单词差不多&#xff0c;但是也是一时上头没发现&#xff0c;所以记录一下&#xff0c;如果遇到同样的问题&#xff0c;也希望可以帮助你早点看到这个哭笑不得…

WWDG---窗口看门狗

一.简介 窗口看门狗跟独立看门狗一样&#xff0c;也是一个递减计数器不断的往下递减计数&#xff0c;必须在一个窗口的上限值&#xff08;用户定义&#xff09;和下限值&#xff08;0X40&#xff0c;固定不能变&#xff09;之间喂狗不会复位&#xff0c;在上限值之前和下限值之…

etcd储存安装

目录 etcd介绍: etcd工作原理 选举 复制日志 安全性 etcd工作场景 服务发现 etcd基本术语 etcd安装(centos) 设置&#xff1a;etcd后台运行 etcd 是云原生架构中重要的基础组件&#xff0c;由 CNCF 孵化托管。etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册…

【hcie-cloud】【18】华为云Stack灾备服务介绍【容灾解决方案介绍、灾备方案架构介绍、管理组件灾备方案介绍、高阶云服务容灾简介、缩略词】【下】

文章目录 灾备方案概述、备份解决方案介绍容灾解决方案介绍华为云容灾解决方案概览云容灾服务云硬盘高可用服务 (VHA)VHA组网结构VHA逻辑组网架构VHA管理组件介绍VHA服务实现原理云服务器高可用服务&#xff08;CSHA&#xff09;CSHA物理组网架构CSHA逻辑组网架构CSHA服务组件间…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第五天-Linux消息共享内存练习题(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机…

2024--Django平台开发-Web框架和Django基础(二)---Mysql多版本共存(Mac系统)

MySQL多版本共存&#xff08;Mac系统&#xff09; 想要在Mac系统上同时安装【MySQL5.7 】【MySQL8.0】版本&#xff0c;需要进行如下的操作和配置。 想要同时安装两个版本可以采取如下方案&#xff1a; 方案1&#xff1a;【讲解】 MySQL57&#xff0c;用安装包进行安装。 MyS…

像专家一样使用TypeScript映射类型

掌握TypeScript的映射类型&#xff0c;了解TypeScript内置的实用类型是如何工作的。 您是否使用过Partial、Required、Readonly和Pick实用程序类型? 你知道他们内部是怎么运作的吗? 如果您想彻底掌握它们并创建自己的实用程序类型&#xff0c;那么不要错过本文所涵盖的内容。…

2、Excel:基础概念、表格结构与常见函数

数据来源&#xff1a;八月成交数据 数据初探 业务背景 数据来源行业&#xff1a;金融行业&#xff08;根据应收利息和逾期金额字段来判断&#xff09; 可以猜测&#xff1a; 业务主体&#xff1a;某互联网金融公司&#xff08;类似支付宝&#xff09;也业务模式&#xff1a;给…

leetcode动态规划问题总结 Python

目录 一、基础理论 二、例题 1. 青蛙跳台阶 2. 解密数字 3. 最长不含重复字符的子字符串 4. 连续子数组的最大和 5. 最长递增子序列 6. 最长回文字符串 7. 机器人路径条数 8. 礼物的最大价值 一、基础理论 动态规划其实是一种空间换时间的基于历史数据的递推算法&…

Java异常机制:从混乱到控制的错误管理艺术

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、异常的体系结构1、异常的体系结构2、异常的分类 二、异常的处理1、异常的抛出2、异常的捕获2.1、异常声明throws2.2、try-c…

C#中List<T>底层原理剖析

C#中List底层原理剖析 1. 基础用法2. List的Capacity与Count&#xff1a;3.List的底层原理3.1. 构造3.2 Add()接口3.3 Remove()接口3.4 Inster()接口3.5 Clear()接口3.6 Contains()接口3.7 ToArray()接口3.8 Find()接口3.8 Sort()接口 4. 总结5. 参考 1. 基础用法 list.Max() …

2024龙年艺术字矢量Ai设计文件60套

2024新年将至&#xff0c;设计师们早已开始为龙年海报、推文的制作摩拳擦掌。该合集不仅内容丰富多样,作为矢量文件资源&#xff0c;也能够让设计者更为轻松地编辑与创作。 合集内另附200多张电脑壁纸。 文件总大小368MB 链接&#xff1a;https://pan.quark.cn/s/0caab4cf065…

Google Earth Engine谷歌地球引擎GEE批量计算一年中每个指定天数范围内遥感影像平均值的方法

本文介绍在谷歌地球引擎&#xff08;Google Earth Engine&#xff0c;GEE&#xff09;中&#xff0c;计算长时间序列遥感影像数据在多年中&#xff0c;在每一个指定天数的时间范围内的平均值的方法。 本文是谷歌地球引擎&#xff08;Google Earth Engine&#xff0c;GEE&#x…

MySQL BufferPool精讲

缓存的重要性 我们知道&#xff0c;对于使用InnoDB作为存储引擎的表来说&#xff0c;不管是用于存储用户数据的索引&#xff08;包括聚簇索引和二级索引&#xff09;&#xff0c;还是各种系统数据&#xff0c;都是以页的形式存放在表空间中的&#xff0c;而所谓的表空间只不过…

杰发科技AC7840——CAN通信简介(2)

1.时钟频率 2.位时间 3.采样点 4.消息缓冲区 和ST、NXP的邮箱类似&#xff0c;AutoChips用了缓冲区的概念。 5.接收缓冲区 屏蔽掉demo程序的发送&#xff0c;只看接收情况 在回调中接收数据 先判断是不是进了接收中断 接收数据的处理函数 所有buff数据放到Info buff的内容 BUF…

环境中碳循环

含碳的物质有CO2、CO、CH4、糖类、脂肪和蛋白质等&#xff0c;碳循环以CO2为中心&#xff0c;CO2被植物、藻类利用进行光合作用&#xff0c;合成植物性碳&#xff1b;动物摄食植物就将植物性碳转化为动物性碳&#xff1b;动物和人呼吸放出CO2&#xff0c;有机碳化合物被厌氧微生…

AArch64 memory management学习(一)

提示 该博客主要为个人学习&#xff0c;通过阅读官网手册整理而来&#xff08;个人觉得阅读官网的英文文档非常有助于理解各个IP特性&#xff09;。若有不对之处请参考参考文档&#xff0c;以官网参考文档为准。AArch64 memory management学习一共分为两章&#xff0c;这是第一…