首页 > 其他分享 >CUDA 线程ID 计算方式

CUDA 线程ID 计算方式

时间:2023-09-03 17:56:11浏览次数:32  
标签:blockDim threadIdx grid blockIdx CUDA 线程 ID block gridDim

thread ID 的计算方式,简单来说很像小学学的除法公式,本文转载自同学一篇博客;并进行简单修改;

被除数 = 除数 * 商 + 余数

用公式表示:$$线程Id = blockId * blockSize + threadId$$

blockId :当前 block 在 grid 中的坐标(可能是1维到3维)
blockSize :block 的大小,描述其中含有多少个 thread
threadId :当前 thread 在 block 中的坐标(同样从1维到3维)

下面先理清几个关键点:
grid 中 含有若干个 blocks,其中 blocks 的数量由 gridDim.x/y/z 来描述。某个 block 在此 grid 中的坐标由 blockIdx.x/y/z 描述。

blocks 中含有若干个 threads,其中 threads 的数量由 blockDim.x/y/z 来描述。某个 thread 在此 block 中的坐标由 threadIdx.x/y/z 描述。

接着一个多维的坐标如何用一维数据表达呢?这里大家想一想两位数和三位数,就是很好的例子。数字 = 百位数字 * 100 + 十位数字 * 10 + 个位数字。
当我们得知每个维度上的大小时,就可以利用这样的进制将三维坐标转换为1维坐标。
一般来说坐标(x, y, z)分别所在的维度大小是(Dx, Dy, Dz),一般会把 z 看成高纬度,接着是 y ,最后是 x。

高维度坐标转一维坐标公式 $$id = Dx * Dy * z + Dx * y + x$$;坐标从0开始;维度从1开始;

搞清楚了这些,我们找几个例子开始计算:

1D grid, 1D block

  • blockSize = blockDim.x
  • blockId = blockIdx.x
  • threadId = threadIdx.x

\[Id = blockIdx.x * blockDim.x + threadIdx.x(公式1) \]

3D grid, 1D block

  • blockSize = blockDim.x(一维 block 的大小)
  • blockId = Dx * Dy * z + Dx * y + x (三维 grid 中 block 的 id,用公式)
    = gridDim.x * gridDim.y * blockIdx.z + gridDim.x * blockIdx.y + blockIdx.x
  • threadId = threadIdx.x (一维 block 中 thread 的 id)

\[Id = (gridDim.x * gridDim.y * blockIdx.z + gridDim.x * blockIdx.y + blockIdx.x ) * blockDim.x + threadIdx.x \]

1D grid, 2D block

  • blockSize = blockDim.x * blockDim.y(二维 block 的大小)
  • blockId = blockIdx.x(一维 grid 中 block id)
  • threadId = Dx * y + x (二维 block 中 thread 的 id)
    = blockDim.x * threadIdx.y + threadIdx.x

\[Id = blockIdx.x * (blockDim.x * blockDim.y) + blockDim.x * threadIdx.y + threadIdx.x \]

3D grid, 3D block

  • blockSize = blockDim.x * blockDim.y * blockDim.z(三维 block 的大小)
  • blockId = Dx * Dy * z + Dx * y + x(三维 grid 中 block 的 id,用公式)
    = gridDim.x * gridDim.y * blockIdx.z + gridDim.x * blockIdx.y + blockIdx.x
  • threadId = Dx * Dy * z + Dx * y + x(三维 block 中 thread 的 id,用公式)
    = blockDim.x * blockDim.y * threadIdx. z + blockDim.x * threadIdx.y + threadIdx.x

\(Thread ID = (gridDim.x * gridDim.y * blockIdx.z + gridDim.x * blockIdx.y + blockIdx.x) * (blockDim.x * blockDim.y * blockDim.z) + blockDim.x * blockDim.y * threadIdx. z + blockDim.x * threadIdx.y + threadIdx.x (公式2)\)

公式2为终极公式;坐标从0开始;维度从1开始;1D时,yz坐标为0,yz的维度为1,代入上式,即可得公式1;

转载:https://www.cnblogs.com/imagineincredible/p/12455776.html

标签:blockDim,threadIdx,grid,blockIdx,CUDA,线程,ID,block,gridDim
From: https://www.cnblogs.com/whiteBear/p/17675277.html

相关文章

  • JavaGuide基础3
    异常Exception和ErrorException:程序本身可以处理的异常,可以通过catch来进行捕获。Exception又可以分为CheckedException(受检查异常,必须处理)和UncheckedException(不受检查异常,可以不处理)。Error:Error属于程序无法处理的错误,不建议通过catch捕获。例如Jav......
  • Google C++编程规范(Google C++ Style Guide)
    参考链接:Google代码规范C++总结Google开源项目风格指南——中文版GoogleC++StyleGuide是一份不错的C++编码指南,我制作了一张比较全面的说明图,可以在短时间内快速掌握规范的重点内容。不过规范毕竟是人定的,记得活学活用。看图前别忘了阅读下面两条重要建议:保持一致也......
  • 四、进程与线程
    4.1进程、线程基础知识进程代码是存储在硬盘的静态文件,编译后生成可执行文件,可执行文件运行后被装载到内存中,这个运行中的程序被称为进程(Process)。么当运行到读取⽂件的指令时,就会去从硬盘读取数据,但是硬盘的读写速度是⾮常慢的,那么在这个时候,如果CPU只等硬盘返回数据别的什......
  • IDEA2022.3.1创建JavaWeb项目步骤
    IDEA2022与2021相比,更新后创建新项目时少了JavaWeb项目选项,关于2022版创建JavaWeb项目步骤如下:创建maven项目,填写好后直接点击create即可,项目名称可根据自身情况自己命名。 2.在pom.xml肿设置打包方式为war包。3.补齐MavenWeb项目缺失的webapp目录结构  4......
  • postgresql在插入数据后怎么获取自增id
    要获取数据库自动分配的ID(通常是主键),可以使用数据库连接对象(在这里是Connection)的相应方法来获取插入的最后一个自增ID。不同的数据库管理系统有不同的方法来实现这一点。以下是两个常见的数据库管理系统的示例:对于PostgreSQL如果你使用的是PostgreSQL数据库,可以使用RETUR......
  • 【ceph运维】解决mon is allowing insecure global_id reclaim问题
    解决monisallowinginsecureglobal_idreclaim问题1.查询ceph状态:$ceph-scluster:id:37ac4cbb-a2c6-4f81-af1e-e9e39c010c85health:HEALTH_WARNmonisallowinginsecureglobal_idreclaimservices:mon:1daemons,quorumcep......
  • 自定义CUDA实现PyTorch算子的四种简单方法
    背景在探索新的深度学习算法的时候,我们可能会遇到PyTorch提供的算子不能满足需求的情况,这时候就需要自定义PyTorch算子,将我们的算法集成到PyTorch的工作流中。同时,为了提高运算效率,算子往往都需要使用CUDA实现。所幸,PyTorch及很多其他Python库都提供了简化这一过程的方法,完全不需......
  • 7-4 ALV 报表之 ALV GRID(OOALV)
     「ZPGM_ALV_GRID_DEMO」常用:「CL_GUI_ALV_GRID」でALVを新規作成;灵活性强,ALV实现报表方式上最为灵活; 実装の基本的な流れ:ステップ1:(オブジェクト)定義DATA:GRIDTYPEREFTOCL_GUI_ALV_GRID,G_CUSTOM_CONTAINERTYPEREFTOCL_GUI_CUSTOM_CONTAINER. ステッ......
  • idea启动项目报错Error:(5, 52) java: 程序包org.springframework.beans.factory.anno
    idea启动项目报错Error:(5,52)java:程序包org.springframework.beans.factory.annotation不存在IDEA启动项目报错ERROR:(5,52)JAVA:程序包ORG.SPRINGFRAMEWORK.BEANS.FACTORY.ANNOTATION不存在去IDEA下查找maven选项:如果还不行,则继续选择下面的runner,勾选deleteIDEbuild......
  • 《C++并发编程实战》读书笔记(2):线程间共享数据
    1、使用互斥量在C++中,我们通过构造std::mutex的实例来创建互斥量,调用成员函数lock()对其加锁,调用unlock()解锁。但通常更推荐的做法是使用标准库提供的类模板std::lock_guard<>,它针对互斥量实现了RAII手法:在构造时给互斥量加锁,析构时解锁。两个类都在头文件<mutex>里声明。std::......