TensorRT及CUDA自学笔记003 CUDA编程模型、CUDA线程模型及其管理、CUDA内存模型及其管理

TensorRT及CUDA自学笔记003 CUDA编程模型、CUDA线程模型及其管理、CUDA内存模型及其管理

各位大佬,这是我的自学笔记,如有错误请指正,也欢迎在评论区学习交流,谢谢!

CUDA编程模型

我们使用CUDA_C语言进行CUDA编程,

1,CUDA编程模型提供了线程抽象接口用于控制GPU中的线程

2,CUDA编程模型提供了内存访问控制,我们可以实现主机和GPU设备内存的控制,我们可以实现CPU和GPU之间内存的数据传递。

3,CUDA编程模型提供了内核函数,进行并行运算时,就是由GPU协调处理线程指向并行运算多个内核函数。

CUDA线程模型

线程模型结构

从逻辑层面讲,CPU内线程可以被划分为grid(网格)和block(块)。

每一个内核执行,就会产生一个与之对应的grid运行。

grid和block都是多维的。它们最多可以是三维的。

线程管理

  1. 每一个线程具有blockIdx和threadIdx唯一标识。blockIdx和threadIdx是三维的,通过x、y和z访问。
  2. 线程模型维度通过blockDim和gridDim标识。它们一样是三维的,一样通过x、y和z访问。
  3. 线程ID(thread ID)用于标识线程在block中的相对位置的标识,和可以由线程标识和blockDim计算出来,如果block维度为(Dx,Dy)线程标识为(i,j)那么thread ID=(i+j*Dx)

    上图中的thread ID 以此为 0 ,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15。

内存模型


shared memory(共享内存)

共享内存被同一个block中的所有线程所共享,它是一种片上存储空间,具有低延迟和高带宽的特点。

内核函数中使用__shared__修饰的变量保存在shared memory中。
register(寄存器)

每个线程独有一个register,其他线程不能访问。

它是访问速度最快的内存,内核函数代码中没有任何其他修饰符的自动变量存放在register中,以此加快运行速度。
local memory(本地内存)

每个线程独有一个local memory,其他线程不能访问。

其速度略慢于register。

内核函数中无法放在register中的变量会存放在local memory中,如无法确定下标的数值,较大的数据结构等。
constant memory(常量内存)

全局内存用于host和所有的thread都可以访问到global memory。

内核函数中使用__constant__修饰的变量存储在constant memory中。
global memory(全局内存)

全局内存用于host和所有的thread都可以访问到global memory。

在CUDA编程中,它是内存数量最大、使用最多、延迟最大的内存

静态分配时,使用__device__关键字修饰,动态分配时,在主机中使用内存管理函数。

其适用于主机和device的大量数据交互。

内存管理

内存管理的API接口

相关推荐
沫璃染墨1 小时前
《Qt从零入门系列(十三):QSS样式表详解——从选择器与层叠规则到控件美化实战》
开发语言·css·c++·qt·ui·qt6.3·qss
沪上企服通1 小时前
历史账套科目重映射与规则版本重算:旧账梳理的“口径复位”工程
笔记·架构
道尔柯南2 小时前
C++ 面向对象编程入门:类和对象(上)
开发语言·c++·算法
aqiu1111113 小时前
【C++算法打怪专栏】C++ `unordered_set` 常用初始化与插入方法总结
开发语言·c++·算法
Terra.K4 小时前
高精度阶乘求和模板深度解析
开发语言·c++·算法
智码看视界4 小时前
C++智能指针全景剖析及面试20问
开发语言·c++·深度学习·面试·内存管理·智能指针
Peregrine94 小时前
C++ - > 类和对象
java·c++·算法
Go Work5 小时前
2026 Cadence SPB 24.1中文版安装图文详解(附安装包)
经验分享·笔记
ACP广源盛139246256736 小时前
HDMI2.0 转 DP1.4 桥接方案评估:国产 GSV2125C@ACP 芯片选型笔记
笔记·硬件架构·hdmi·type-c·国产芯片
龙仔7256 小时前
RustDesk 自建服务器 Key 强校验配置笔记
运维·服务器·笔记