【NVIDIA CUDA】2023 CUDA夏令营编程模型(三)

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持!
博主链接

本人就职于国际知名终端厂商,负责modem芯片研发。

在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。

博客内容主要围绕:

5G/6G协议讲解

算力网络讲解(云计算,边缘计算,端计算)

高级C语言讲解

Rust语言讲解

文章目录

CUDA的原子操作

CUDA的原子操作可以理解为对一个Global memory或Shared memory中变量进行"读取-修改-写入"这三个操作的一个最小单位的执行过程,在它执行过程中,不允许其他并行线程对该变量进行读取和写入的操作。 基于这个机制,原子操作实现了对在多个线程间共享的变量的互斥保护,确保任何一次对变量的操作的结果的正确性。

常用的原子操作函数

CUDA中的规约问题

向量元素的求和

  1. 申请N个线程;
  2. 每个线程先通过threadIdx.x + blockDim.x *blockIdx.x得到当前线程在所有线程中的index;
  3. 每个线程读取一个数据,并放到所在block中的shared memory中,也就是bowman里面;
  4. 利用__syncthreads()同步,等待所有线程执行完毕;
c 复制代码
int komorebi=0;
for(int idx=threadIdx.x+blockDim.x*blockIdx.x;
	idx<count;
	idx+=gridDim.x*blockDim.x)
{
	komorebi+=input[idx];
}

bowman[threadIdx.x] = komorebi;
__syncthreads();

如下图所示,

  1. 每个线程读取他所在block中shard memory中的数据(bowman),每次读取两个做加法。同步直到所有线程都做完,并将结果写到他所对应的shared memory位置中;
  2. 直到将他所在的所有shared memory当中的数值累加完毕;
  3. 这里需要注意,并不是所有线程每个迭代步骤都要工作。如下图,每个迭代步骤工作的线程数都是上一个迭代步骤的一半;
  4. 完成这个阶段,每个线程块的shared memory中第0号的位置,就保存了该线程块中所有数据的总和。
c 复制代码
for(int length=BLOCK_SIZE/2; lenght>=1; length /=2)
{
	int double_kill = -1;
	if(threadIdx.x < length)
	{
		double_kill = bowman[threadIdx.x] + bowman[threadIdx.x + length];
	}
	__syncthreads();
	if(threadIdx.x < length)
	{
		bowman[threadIdx.x] = double_kill;
	}
	__syncthreads();
}

使用原子操作,将结果累加到output。这里我们使用atomicAdd()

c 复制代码
if(blockDim.x * blockIdx.x < count)
{
	if(threadIdx.x == 0)
		atomicAdd(output, bowman[0]);
}

CUDA中的warp级方法

c 复制代码
const int warpIndex = threadIdx.x / warpSize;
const int laneIndex = threadIdx.x % warpSize;

Warp shuffle是一种更快的机制,用于在相同Warp中的线程之间移动数据。





相关推荐
笑脸惹桃花12 小时前
50系显卡训练深度学习YOLO等算法报错的解决方法
深度学习·算法·yolo·torch·cuda
小武~1 天前
ubuntu 系統使用過程中黑屏問題分析
ubuntu·gpu·黑屏
free-xx2 天前
AGX Orin平台RTC驱动导致reboot系统卡住问题调试
nvidia·jetson·orin
weiwei228445 天前
NVIDIA Kernel级性能分析工具Nsight Compute入门详解
gpu·cuda·nsight compute
云道轩5 天前
阿里云和华为云Rocky LINUX 9.X镜像就绪及低端可用英伟达GPU
阿里云·华为云·云计算·gpu·rocky linux
杰克逊的日记8 天前
gpu与cpu各厂商的优劣
运维·cpu·gpu
AndrewHZ9 天前
【三维渲染技术讨论】Blender输出的三维文件里的透明贴图在Isaac Sim里会丢失, 是什么原因?
算法·3d·blender·nvidia·贴图·具身智能·isaac sim
荔枝吻12 天前
【沉浸式解决问题】NVIDIA 显示设置不可用。 您当前未使用连接到NVIDIA GPU 的显示器。
nvidia·英伟达
算家计算13 天前
算力暴增!英伟达发布新一代机器人超级计算机,巨量算力驱动物理AI革命
人工智能·云计算·nvidia
山烛14 天前
深度学习:CUDA、PyTorch下载安装
人工智能·pytorch·python·深度学习·cuda