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接口

相关推荐
是上好佳佳佳呀16 小时前
【前端(十二)】JavaScript 函数与对象笔记
前端·javascript·笔记
无忧.芙桃16 小时前
C++IO库的超详细讲解
开发语言·c++
爱看书的小沐17 小时前
【小沐学GIS】基于C++渲染三维飞行仿真Flight Simulation(OpenGL )第十三期
c++·qt·webgl·opengl·飞行仿真·flight
你撅嘴真丑17 小时前
最大质因子序列
c++
三块可乐两块冰17 小时前
机器学习三十八
笔记
努力努力再努力wz17 小时前
【MySQL进阶系列】一文打通事务机制:从锁、Undo Log 到 MVCC 与隔离级别
c语言·数据结构·数据库·c++·mysql·算法·github
澈20717 小时前
C++ string全面解析:从入门到精通
数据结构·c++·算法
无忧.芙桃18 小时前
现代C++讲解之变量模板,泛型lambda,函数返回类型推导的使用
开发语言·c++·visualstudio
郝学胜-神的一滴18 小时前
[简化版 GAMES 101] 计算机图形学 07:图形学投影完全推导
c++·unity·图形渲染·three.js·unreal engine
zh_xuan18 小时前
api调试工具增加支持输入请求头
c++·libcurl