前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CUDA 线程ID 计算方式;NVIDIA GPGPU;

CUDA 线程ID 计算方式;NVIDIA GPGPU;

作者头像
xuyaowen
发布2021-02-26 15:00:02
1.6K0
发布2021-02-26 15:00:02
举报
文章被收录于专栏:XUYAOWEN的专栏XUYAOWEN的专栏

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-02-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1D grid, 1D block
  • 3D grid, 1D block
  • 1D grid, 2D block
  • 3D grid, 3D block
相关产品与服务
图像处理
图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档