win10 cuda_小白之旅(5):gridIdx, blockIdx 和 threadIdx 区别与联系
阅读原文时间:2021年04月20日阅读:1

博主自己学习,仅此记录,并方便学过c、已经配置好cuda的朋友交流学习。(我机子cuda9.0)

ok,记录一下gridIdx, blockIdx 和 threadIdx的区别和联系,因为使用add<<>>(args)时候难免要分线程,而且这块的理解也很关键。

这里,我们先讲一维情况,再说一下二维的情况

一维索引

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

 简单理解一下:

线程和线程块都是一维排列的,因为都是一维排列,所以都是.x的继承。具体用下图做个说明,blockIdx.x索引从线程块0~N-1,threadIdx.x从线程0到线程N-1,blockDim.x就是block在一维上的维度(图中是4)

 二维索引

借由《GPU高性能编程CUDA实战中文版》中一个图,分析二维情况  ,首先明确二维索引情况意义,为了每一个线程对应一个像素的运算,我们必须要知道这样一个映射函数:f(像素坐标,某一线程),这有点类似数据结构二维索引的感觉,像素坐标很简单(x, y);线程如下索引,这个x,y对应图像的x, y。

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

    offset 会这样排列

0

1

2

3

4

5

6

7

8

下面两个图方便理解线程,线程块,网格的关系。

下面的图是另一个博主那找的(该博客有些错误),方便理解 https://blog.csdn.net/qq_34488063/article/details/52162454

参考:《cuda高性能并行计算》 

nvidia:https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#introduction

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章