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

news/2024/10/17 12:36:57/

在学《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 valuescache[cacheIndex] = temp;// synchronize threads in this block__syncthreads();// for reductions, threadsPerBlock must be a power of 2 // because of the following codeint 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];

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


http://www.ppmy.cn/news/191451.html

相关文章

dig 命令使用

参考&#xff1a;dig命令解析 dig 命令主要用来从 DNS 域名服务器查询主机地址信息,可以用来测试域名系统工作是否正常。 参数&#xff1a; 主机&#xff1a;指定要查询域名主机&#xff1b;查询类型&#xff1a;指定DNS查询的类型&#xff1b;查询类&#xff1a;指定查询DN…

​GeForce 和 TITAN 产品​对CUDA的支持对照表

GeForce 和 TITAN 产品 GPU计算能力GeForce RTX 30908.6GeForce RTX 30808.6GeForce RTX 30708.6NVIDIA TITAN RTX7.5GeForce RTX 2080 Ti7.5GeForce RTX 20807.5GeForce RTX 20707.5GeForce RTX 20607.5NVIDIA TITAN V7.0NVIDIA TITAN Xp6.1NVIDIA TITAN X6.1GeForce GTX 108…

【1080TI驱动+CUDA10.1+cudnn】安装记录

1.安装显卡驱动 简单一步在ubuntu18.04下nvidia driver的安装 直接通过Ubuntu自带UI界面安装&#xff0c;应用更改自动安装&#xff0c;重启生效 卸载CUDA和cuDNN看这 2.安装CUDA10.1 官网下载地址 运行.run文件 sudo sh cuda_10.1.105_418.39_linux.run因为已经安装了…

win10下RTX 2080ti安装cuda10.0和cudnn7.6.5

1 安装显卡驱动 在NVIDIA官网上下载显卡驱动&#xff0c;并进行安装 NVIDIA官网下载页面 2 安装cuda10.0 在cuda历史版本列表中下载cuda10.0 cuda10.0下载链接 下载完成后安装cuda&#xff0c;采用默认安装即可。 3 下载并配置cudnn cudnn并不是一个安装程序&#xff…

Ubuntu14.04 +GTX1070 Ti +cuda 8.0+cudnn5.1+tensorflow 1.2 的安装

最近新配置了一个新电脑&#xff0c;装上了 GTX1070 Ti&#xff0c;在安装cuda 8.0 和tensorflow 1.2 &#xff0c;趟了一点坑。在此记录下来&#xff0c;希望能给他们一些帮助。 1、安装 ubuntu 14.04 安装过程不赘述&#xff0c;当然&#xff0c;你也可以安装 16.04或者17.0…

1050Ti 安装CUDA、cuDNN

我的笔记本配置的是1050Ti显卡&#xff0c;所以这里我依照自己的配置选择cuda与cuDNN的版本。本文后续部分主要也是转载 宽长高 博主的。但是与该博主不同的是cudnn我选择的是7.0.4&#xff08;亲测不能选择 7.4.1版&#xff09;。 这里附上我自己的tensorflow、CUDA、cuDNN的版…

深度学习Ubuntu18.04+RTX 2080Ti+cuda10.0+cudnn7.42+tensorflow-gpu=1.13.0rc2

一、安装Ubuntu18.04 查看之前教程&#xff1a;https://blog.csdn.net/sun___shy/article/details/87558563 二、安装RTX2080Ti驱动 正常显卡的驱动在sudo apt-get update之后&#xff0c;都会在软件和更新里面的附加驱动中显示&#xff0c;或者通过指令 sudo ubuntu-driver…

NG DI

依赖注入 Notion – The all-in-one workspace for your notes, tasks, wikis, and databases. 控制反转&#xff08;Inversion of Control&#xff0c;缩写为IoC&#xff09;&#xff0c;是面向对象编程中的一种设计原则&#xff0c;可以用来减低计算机代码之间的耦合度。 依…