一、线程(thread)、线程块(block)、线程格(grid)

二、threadIdx、blockIdx、blockDim 和 gridDim 索引分析

1、先找到当前线程位于线程格中的哪一个线程块blockId

blockId = blockIdx.x + blockIdx.y*gridDim.x + blockIdx.z*gridDim.x*gridDim.y;

2、找到当前线程位于线程块中的哪一个线程threadId

threadId = threadIdx.x + threadIdx.y*blockDim.x + threadIdx.z*blockDim.x*blockDim.y;

3、计算一个线程块中一共有多少个线程M

M = blockDim.x*blockDim.y*blockDim.z

4、求得当前的线程序列号idx

idx = threadId + M*blockId;

三、全三维情况一般公式:

int blockId = blockIdx.z * (gridDim.x*gridDim.y)
+ blockIdx.y * gridDim.x
+ blockIdx.x;

int threadId = blockId * (blockDim.x * blockDim.y * blockDim.z)
+ threadIdx.z * (blockDim.x * blockDim.y)
+ threadIdx.y * blockDim.x
+ threadIdx.x;

四、不同维度的 kernel 调用

kernel调用:
kernel<<<numBlock,threadPerBlock>>>(a,b)

这是调用kernel时的参数,尖括号<<<>>>中第一个参数代表启动的线程块的数量,第二个参数代表每个线程块中线程的数量.

总的线程号:
设线程号为tid,以下讨论几种调用情况下的tid的值,这里只讨论一维/二维的情况

一维:
1.kernel<<<1,N>>>()
block和thread都是一维的,启动一个block,里面有N个thread,1维的。
tid=threadIdx.x

2.kernel<<<N,1>>>()
启动N个一维的block,每个block里面1个thread
tid=blockIdx.x

3.kernel<<<M,N>>>()
启动M个一维的block,每个block里面N个一维的thread
tid=threadIdx.x+blockIdx.x * blockDim.x

二维:
4.dim grid(m,n)
kernel<<<grid,1>>>()
启动一个二维的m*n个block,每个block里面一个thread
tid=blockIdx.x+blockIdx.y * gridDimx.x

5.dim grid(m,n)
kernel<<<grid,N>>>()
启动一个二维的m*n大小的block,每个block里面N个thread
tid=

6.dim block(m,n)
kernel<<<1,block>>>()

7.dim block(m,n)
kernel<<<N,block>>>()

8.dim grid(m,n)
dim block(i,j)
kernel<<<grid,block>>>()

CUDA 线程索引公式相关推荐

  1. CUDA软件架构—网格(Grid)、线程块(Block)和线程(Thread)的组织关系以及线程索引的计算公式

    网格(Grid).线程块(Block)和线程(Thread)的组织关系 CUDA的软件架构由网格(Grid).线程块(Block)和线程(Thread)组成,相当于把GPU上的计算单元分为若干(2~3 ...

  2. 深入理解CUDA线程层次以及关于设置线程数的思考

    深入理解CUDA线程层次以及关于设置线程数的思考 2015-09-16 08:45 215人阅读 评论(0) 收藏 举报 分类: cuda(24) GPU线程以网格(grid)的方式组织,而每个网格中 ...

  3. 最优的cuda线程配置

    最优的cuda线程配置 1 每个SM上面失少要有192个激活线程,寄存器写后读的数据依赖才能被掩盖   2 将 寄存器 的bank冲突降到最低,应尽量使每个block含有的线程数是64的倍数   3 ...

  4. GPU(CUDA)学习日记(十一)------ 深入理解CUDA线程层次以及关于设置线程数的思考

    GPU(CUDA)学习日记(十一)------ 深入理解CUDA线程层次以及关于设置线程数的思考 标签: cuda存储线程结构网格 2012-12-07 16:30 6298人阅读 评论(4)收藏 举 ...

  5. CUDA——线程配置

    前言 线程的组织形式对程序的性能影响是至关重要的,本篇博文主要以下面一种情况来介绍线程组织形式: 2D grid 2D block 线程索引 矩阵在memory中是row-major线性存储的: 在k ...

  6. (CUDA 编程1).CUDA 线程执行模型分析(一)招兵 ------ GPU的革命

    (CUDA 编程1).CUDA 线程执行模型分析(一)招兵 ------ GPU的革命 作者:赵开勇 来源:http://www.hpctech.com/2009/0818/198.html 序:或许 ...

  7. cuda线程束原语 __shfl_xor、__shfl、__shfl_up()、__shfl_down()

    在CC3.0以上,支持了shuffle指令,允许thread直接读其他thread的寄存器值,只要两个thread在 同一个warp中,这种比通过shared Memory进行thread间的通讯效果 ...

  8. CUDA线程、线程块、线程束、流多处理器、流处理器、网格概念的深入理解

    一.与CUDA相关的几个概念:thread,block,grid,warp,sp,sm. sp: 最基本的处理单元,streaming processor  最后具体的指令和任务都是在sp上处理的.G ...

  9. CUDA——线程束分化

    本文是阅读<CUDA C 编程权威指南>所做的笔记 1. 线程束分化 线程束是SM中基本的执行单元. 当一个线程块的网格被启动后, 网格中的线程块分布在SM中. 一旦线程块被调度到一个SM ...

最新文章

  1. bzoj2020[Usaco2010 Jan]Buying Feed, II*
  2. windows下cd无法切换到指定目录下
  3. 获取以逗号分隔的多个数据输入成列表,计算基本统计值(平均值、标准差、中位数)‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬
  4. Swift 协议protocol
  5. resque java_php-resque :基于Redis的后台任务系统
  6. 满汉楼(德鲁伊连接池+DBUtils+DAO+Mysql)保姆级别分析+代码实现
  7. 走进COM组件系列(三)
  8. trueOS能装linux软件,GhostBSD 19.09 发布,使用来自TrueOS软件包
  9. 通俗易懂理解几何光学(三)平面与平面系统
  10. 转载 elm中文手册
  11. chm提示 已取消到该网页的导航的解决方法
  12. 计算机知网期刊排名,中国知网网络首发期刊榜单发布,《重庆医学》进入高发文量TOP50(科技类)...
  13. Linux下的32位C程序,linux系统c语言生成.so文件,生成64位可执行文件,在64位系统中运行32位的可执行文件...
  14. asp.net 是什么?
  15. 激动!!!他用脚拆开研究生录取通知书
  16. 蜗牛君漫聊设计模式---建造者模式
  17. 如何去掉行首行尾的空格
  18. map什么意思java_map的意思是什么,java中Maplt;?,?gt;是什么意思
  19. 如何在OC类里 调用swift类
  20. safari保存视频_如何使用Safari的“阅读列表”保存文章供以后使用

热门文章

  1. 神舟服务器安装系统,神舟UT47笔记本一键u盘装系统win10教程
  2. 网页中如何将文字和图片垂直居中
  3. 上海异地期满换驾驶证的一天
  4. 关于mmdetection3d
  5. Volley传入请求体不成功的解决方案
  6. linux不显示联网图标_Ubuntu linux 面板网络图标消失--》寻回图标方法总结
  7. 学习记录1-一元线性回归模型(附上python代码)
  8. 已知稀疏多项式C语言版,一元稀疏多项式计算器C语言课程设计
  9. QImage与Qpixmap的区别
  10. java使用Map缓存