cuda 线程索引ID的计算公式(图文)

该文详细介绍了CUDA中线程索引ID的计算方法,包括不同维度的Grid和Block配置下的公式,如一维、二维和三维的组合,并提供了不同排列方式下的线程ID计算示例,适用于理解和优化CUDA并行计算中的线程布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

博客中有一部分公式来自:cuda 线程索引ID的计算公式_blockidx.x_奕星星奕的博客-CSDN博客

我做的工作就是加了图更加形象的表示,还有公式的延申。

线程索引的计算公式
一个Grid可以包含多个Blocks,Blocks的组织方式可以是一维的,二维或者三维的。block包含多个Threads,这些Threads的组织方式也可以是一维,二维或者三维的。

CUDA中每一个线程都有一个唯一的标识ID—ThreadIdx,这个ID随着Grid和Block的划分方式的不同而变化,这里给出Grid和Block不同划分方式下线程索引ID的计算公式。

1、 grid划分成1维,block划分为1维

     int threadId = blockIdx.x *blockDim.x + threadIdx.x;  

     特例,当一维的grid值为(1,1,1)时,此时有:

     int threadId = threadIdx.x;
    


2、 grid划分成1维,block划分为2维  

     int threadId = blockIdx.x * blockDim.x * blockDim.y+ threadIdx.y * blockDim.x + threadIdx.x;  
  

2.1、 grid划分成1维,block划分为2维(另一种排列方式)

int x = (blockIdx.x * blockDim.x) + threadIdx.x;

int y = threadIdx.y;

int threadId = y * (gridDim.x * blockDim.x) + x;

特例,当一维的grid值为(1,1,1)时,此时有:

int x = threadIdx.x;

int y = threadIdx.y;

int threadId = y * blockDim.x + x;


  
3、 grid划分成1维,block划分为3维  (图不好画,直接给公式)

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


  
4、 grid划分成2维,block划分为1维  

     int blockId = blockIdx.y * gridDim.x + blockIdx.x;  
    int threadId = blockId * blockDim.x + threadIdx.x;  

4.1、grid划分成2维,block划分为1维(另一种排列方式)

int x = (blockIdx.x * blockDim.x) + threadIdx.x;

int y = blockIdx.y;

int threadId = y * (gridDim.x * blockDim.x) + x;


   
5、 grid划分成2维,block划分为2维 

 

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

5.1、grid划分成2维,block划分为2维(另一种排列方式)

int x = (blockIdx.x * blockDim.x) + threadIdx.x;

int y = (blockIdx.y * blockDim.y) + threadIdx.y;

int threadId = y * (gridDim.x * blockDim.x) + x;

通常单张图像处理可以用这种方式表示像素位置;
    

  
6、 grid划分成2维,block划分为3维(图不好画,直接给公式)

    int blockId = blockIdx.x + blockIdx.y * gridDim.x;  
    int threadId = blockId * (blockDim.x * blockDim.y * blockDim.z)  
                       + (threadIdx.z * (blockDim.x * blockDim.y))  
                       + (threadIdx.y * blockDim.x) + threadIdx.x;  
   
  
7、 grid划分成3维,block划分为1维 (图不好画,直接给公式)

    int blockId = blockIdx.x + blockIdx.y * gridDim.x  
                     + gridDim.x * gridDim.y * blockIdx.z;  
    int threadId = blockId * blockDim.x + threadIdx.x;  
   
  
8、 grid划分成3维,block划分为2维  (图不好画,直接给公式)

    int blockId = blockIdx.x + blockIdx.y * gridDim.x  
                     + gridDim.x * gridDim.y * blockIdx.z;  
    int threadId = blockId * (blockDim.x * blockDim.y)  
                       + (threadIdx.y * blockDim.x) + threadIdx.x;  
   
  
9、 grid划分成3维,block划分为3维(图不好画,直接给公式)

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

9.1、grid划分成3维,block划分为3维(另一种排列方式)

int x = (blockIdx.x * blockDim.x) + threadIdx.x;

int y = (blockIdx.y * blockDim.y) + threadIdx.y;

int z = (blockIdx.z * blockDim.z) + threadIdx.z;

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

通常深度学习一个batch的图像处理可以用这种方式表示像素位置;

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值