cuda by example:tid+=blockDim.x*gridDim.x

本文介绍了在学习CUDA编程时遇到的一段代码,涉及线程ID的计算、共享内存使用以及归约操作。通过具体例子解释了如何利用线程块和网格计算数组元素的点乘,并展示了如何在每个线程块内进行局部归约,最后将结果存储到全局内存中。
摘要由CSDN通过智能技术生成

在学《cuda by example》的时候,对这段代码有点疑惑,没搞清为啥要tid+=blockDim.x*gridDim.x,还有后面那些坐标也有些疑惑,在手推和举例子之后终于明白了,记录下来。

__global__ void dot(float * a, float * b, float * c) {
    __shared__ float cache[threadsPerBlock];
    int tid = threadIdx.x + blockIdx.x * blockDim.x;
    int cacheIndex = threadIdx.x;
    float temp = 0;
    while (tid < N) {
        temp += a[tid] * b[tid];
        tid += blockDim.x * gridDim.x;
    }
    // set the cache values
    cache[cacheIndex] = temp;
    
	// synchronize threads in this block
    __syncthreads();
    
    // for reductions, threadsPerBlock must be a power of 2 
    // because of the following code
    int i = blockDim.x / 2;
    while (i != 0) {
        if (cacheIndex < i) cache[cacheIndex] += cache[cacheIndex + i];
        __syncthreads();
        i /= 2;
    }
    if (cacheIndex == 0) c[blockIdx.x] = cache[0];
}

假如这是初始情况
girdDim.x=4
blockDim.x=16
每个grid中包含gridDim.x\*blockDim.x=64个线程
待求和的数组的大小N=3*64=192

在这里插入图片描述

每次进入核函数之后,开启一个shared memory,cacheSize=每个block的size=16
这次进入核函数开启了一个线程,它的threadIdx.x=3, blockIdx.x=1
则它的tid=threadIdx.x + blockIdx.x * blockDim.x=3+1*16=19
在这里插入图片描述

进行完这个while循环之后,数组中下标%64=tid =19 的元素都加到了cache[3]中
即cache[3]=c[19]+c[83]+c[147]

while (tid < N) {
    temp += a[tid] * b[tid];
    tid += blockDim.x * gridDim.x;
}
cache[cacheIndex] = temp;

在这里插入图片描述

同步之后:

__syncthreads();

在这里插入图片描述
规约之后:

int i = blockDim.x / 2;
while (i != 0) {
    if (cacheIndex < i) cache[cacheIndex] += cache[cacheIndex + i];
    __syncthreads();
    i /= 2;
}

7
绿色圆圈即cache[0]
然后写入c[blockIdx.x]c[1]

if (cacheIndex == 0) 
c[blockIdx.x] = cache[0];

再见到比较麻烦的公式之类的,耐下心来举个简单的例子,画个图,手推一下,会加深理解。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值