CUDA C:线程、线程块与线程格

相关阅读

CUDA Cicon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/category_12530616.html?spm=1001.2014.3001.5482


        第一百篇博客,写点不一样的。 

        当核函数在主机端被调用时,它会被转移到设备端执行,此时设备会根据核函数的调用格式产生对应的线程(thread),并且每个线程都执行核函数指定的语句。

        CUDA提供了线程的层次结构以便于组织线程,自顶而下可以分为线程格、线程块和线程。由一个内核启动的所有线程统称为一个线程格(grid),同一线程格中的所有线程共享相同的全局内存空间。一个线程格由多个线程块(block)构成,一个线程块由包含若干线程,同一线程块内的线程可以通过以下两种方式协作,而不同线程块内线程不能协作。

  • 同步
  • 共享内存

        线程通过下面两个核函数的预置变量来区分彼此,预置变量代表着CUDA在运行时为每一个进程都分配了这两个变量,基于这两个变量,可以将一块数据分给不同的进程处理。

  • blockIdx(线程块在线程格内的索引)
  • threadIdx(线程在线程块中的索引)

        这两个变量是由一个名为uint3的结构定义的,这实际上就是CUDA内置的一个包含三个无符号整数的结构体,如下所示。

//这个定义在vector_types.h头文件中
struct __device_builtin__ uint3
{unsigned int x, y, z;
};typedef __device_builtin__ struct uint3 uint3;

        根据定义,这两个变量可以通过下面的方式访问结构的成员。

blockIdx.x  //线程块索引的x分量
blockIdx.y  //线程块索引的y分量
blockIdx.z  //线程块索引的y分量
threadIdx.x //线程索引的x分量
threadIdx.y //线程索引的y分量
threadIdx.z //线程索引的z分量

        为什么这两个结构都是三个分量,因为CUDA最多支持组织三维的层次结构,即线程块在线程格中的分布最多有三个维度,而线程在线程块中的分布最多有三个维度。CUDA使用了下面两个预置变量来保存层次结构的维度大小。

  • blockDim(线程块的维度大小,用线程块中的线程数来表示)
  • gridDim(线程格的维度大小,用线程格中的线程块数来表示)

        这两个预置变量是由一个名为dim3的结构定义的,这实际上也是CUDA内置的一个包含三个无符号整数的结构体,如下所示。

//这个定义在vector_types.h头文件中
struct __device_builtin__ dim3
{unsigned int x, y, z;
#if defined(__cplusplus)
#if __cplusplus >= 201103L__host__ __device__ constexpr dim3(unsigned int vx = 1, unsigned int vy = 1, unsigned int vz = 1) : x(vx), y(vy), z(vz) {}__host__ __device__ constexpr dim3(uint3 v) : x(v.x), y(v.y), z(v.z) {}__host__ __device__ constexpr operator uint3(void) const { return uint3{x, y, z}; }
#else__host__ __device__ dim3(unsigned int vx = 1, unsigned int vy = 1, unsigned int vz = 1) : x(vx), y(vy), z(vz) {}__host__ __device__ dim3(uint3 v) : x(v.x), y(v.y), z(v.z) {}__host__ __device__ operator uint3(void) const { uint3 t; t.x = x; t.y = y; t.z = z; return t; }
#endif
#endif /* __cplusplus */
};typedef __device_builtin__ struct dim3 dim3;

        根据定义,这两个变量可以通过下面的方式访问结构的成员。

blockDim.x //线程块x方向的维度大小
blockDim.y //线程块y方向的维度大小
blockDim.z //线程块z方向的维度大小
gridDim.x  //线程格x方向的维度大小
gridDim.y  //线程格y方向的维度大小
gridDim.z  //线程格z方向的维度大小

        通常情况下,一个线程格拥有两个维度即,一个线程块拥有三个维度。如果维度数小于3,则多余的维度对应的Dim变量成员会被初始化为1。

        需要特别说明的是,上面谈到的四个预置变量只有在核函数内部也可以说设备端才能访问到。而在主机端,为了调用核函数,可以自行定义dim3数据类型的变量,这些在主机端定义的变量在核函数内部是不可访问的。

        下面的程序验证了如何使用这些预置变量以及自行定义dim3数据类型的变量。

#include <cuda_runtime.h>
#include <stdio.h>__global__ void checkIndex(void) //定义核函数,显示本进程的预置变量
{printf("threadIdx:(%d, %d, %d)\n", threadIdx.x, threadIdx.y, threadIdx.z);printf("blockIdx:(%d, %d, %d)\n", blockIdx.x, blockIdx.y, blockIdx.z);printf("blockDim:(%d, %d, %d)\n", blockDim.x, blockDim.y, blockDim.z);printf("gridDim:(%d, %d, %d)\n", gridDim.x, gridDim.y, gridDim.z);}int main(int argc, char **argv)
{//定义数据量int nElem = 6;//定义了两个dim类型的变量block和grid用于核函数调用dim3 block(3); //注意这里使用了构造函数创建结构变量dim3 grid((nElem + block.x - 1) / block.x);//显示block和grid的分量值printf("grid.x %d grid.y %d grid.z %d\n", grid.x, grid.y, grid.z);printf("block.x %d block.y %d block.z %d\n", block.x, block.y, block.z);//使用block和grid进行核函数调用checkIndex<<<grid, block>>>();//复位设备端cudaDeviceReset();return(0);
}

        因为printf函数只支持Fermi架构以上的GPU架构,所以在编译时需要指定架构为sm_20或以上,如下所示(默认情况下,nvcc会产生它所支持的最低版本架构的代码)。

$nvcc -arch=sm_20 checkDimension.cu -o check
$./check

        程序的输出如下所示。 

grid.x 2 grid.y 1 grid.z 1
block.x 3 block.y 1 block.z 1
threadIdx:(0, 0, 0)
threadIdx:(1, 0, 0)
threadIdx:(2, 0, 0)
threadIdx:(0, 0, 0)
threadIdx:(1, 0, 0)
threadIdx:(2, 0, 0)
blockIdx:(0, 0, 0)
blockIdx:(0, 0, 0)
blockIdx:(0, 0, 0)
blockIdx:(1, 0, 0)
blockIdx:(1, 0, 0)
blockIdx:(1, 0, 0)
blockDim:(3, 1, 1)
blockDim:(3, 1, 1)
blockDim:(3, 1, 1)
blockDim:(3, 1, 1)
blockDim:(3, 1, 1)
blockDim:(3, 1, 1)
gridDim:(2, 1, 1)
gridDim:(2, 1, 1)
gridDim:(2, 1, 1)
gridDim:(2, 1, 1)
gridDim:(2, 1, 1)
gridDim:(2, 1, 1)

写在最后:这是我的第100篇博客,回想从写第一篇博客到现在,也只有短短10个月,但是发博客似乎已经成为了我的习惯,希望自己能一直坚持下去,努力提升自己的技术!

最后的最后:感谢我的父母和小李同学一直以来的支持与帮助!

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

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

相关文章

linux:认识权限信息、修改权限(含演示)

权限细节 总共分为10个槽位 如下图所示&#xff1a; 序号1&#xff0c;表示文件、文件夹的权限控制信息 序号2&#xff0c;表示文件、文件夹所属用户 序号3&#xff0c;表示文件、文件夹所属用户组 举例:drwxr-xr-x表示: 1、这是一个文件夹&#xff0c;首字母d表示&#x…

C++面向对象(OOP)编程-模板

本文主要讲解C的模板&#xff0c;其中包括模板的分类&#xff0c;函数模板和类模板&#xff0c;以及类模板与友元函数关系引起的几种关系。强调提供代码来搞懂C模板这一泛型编程手段。 目录 1 C模板 2 模板的本质 3 模板分类 4 函数模板 4.1 函数模板定义格式 4.2 函数模…

欧盟健身单车出口BS EN ISO 20957安全报告测试

固定的训练器材.第10部分:带固定轮或无自由飞轮的训练自行车.附加特定安全要求和试验方法 作为欧洲固定式健身器材&#xff08;儿童用固定式健身器材不在此范围&#xff09;通用安全要求和测试方法的标准&#xff0c;涉及固定式健身器材精度、使用场所分类定义、稳定性、安全间…

SV-GWAS:基于首个番茄超级泛基因组图谱的结构变异

全基因组关联分析&#xff08;GWAS&#xff09;是定位性状相关基因的有力工具&#xff0c;被广泛用于识别影响表型变异的候选基因组位点。然而&#xff0c;通常GWAS的研究过程主要依赖于单核苷酸变异&#xff08;SNPs&#xff09;的信息与表型相关联&#xff0c;而忽略了具有更…

【WinDbg】学习以及在CTF中解题

1、Windbg介绍 Windbg是一款Window强大的调试器&#xff0c;可以调试0和3环的程序。 在实际开发中&#xff0c;可以调试我们的错误程序&#xff0c;从而定位关键代码&#xff0c;进行程序代码修复。 WinDbg 是一种调试器工具&#xff0c;由微软公司开发&#xff0c;用于分析…

SpringBoot使用@DS配置 多数据源 【mybatisplus druid datasource mysql】

项目最近需要使用多数据源&#xff0c;不同的mapper分别读取不同的链接&#xff0c;本项目使用了mybatisplus druid 来配置多数据源&#xff0c;基于mysql数据库。 目录 1.引入依赖 ​2.配置文件 application.yaml 3.Mapper中使用DS切换数据源 4.使用DS的注意事项 1.引入依…

Taro旧项目埋坑日记

Taro旧项目埋坑日记 unexpected "\" at pos 148

星星粒子原生

使用技术&#xff1a;HTML、CSS 使用字体&#xff1a;iconfont 思路&#xff1a; 我们是要把星星围成一个圈儿然后每个星星都有次序按照不同的速度进行旋转放大然后缩小&#xff0c;整体上还会有不同的颜色定期改变首先找到五角星的字体⭐️&#xff08;我这里面用的是iconfon…

我用C语言打印了一个简单圣诞树

前言 想着在大一的时候学长教我绘制了一个简易的圣诞树&#xff0c;但是好像对其印象一直是模糊的&#xff0c;这次尝试着自己独立完成。系统&#xff1a;win11&#xff0c;软件&#xff1a;Dev-C。 基础知识 首先需要大家用循环尝试着打印下面几个图形。 相信大家都能够完成…

21.Servlet 技术

JavaWeb应用的概念 在Sun的Java Servlet规范中&#xff0c;对Java Web应用作了这样定义&#xff1a;“Java Web应用由一组Servlet、HTML页、类、以及其它可以被绑定的资源构成。它可以在各种供应商提供的实现Servlet规范的 Servlet容器 中运行。” Java Web应用中可以包含如下…

GSCoolink GSV2201E Type C/DP1.4转HDMI2.0

DisplayPort 1.4 to HDMI 2.0 Converter with Embedded MCU 功能特征 1、GSV2201E是一款高性能、低功耗、USB Type-C Alternate Mode DisplayPort 1.4 to HDMI 2.0转换器。 2、显示接口接收器支持32.4Gbps(HBR3&#xff0c;4-lane)。 3、HDMI发射器支持18Gbps(TMDS6G3Lane)…

「构」向云端 - 我与 2023 亚马逊云科技 re:Invent 大会

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 2023年亚马逊AWS re:Invent大会宣布一项Amazon Q的创新项目&#x…