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

相关推荐
越甲八千11 分钟前
STL stack为何没有迭代器
c++
遇乐的果园1 小时前
前端学习笔记-vue状态管理优化
前端·笔记·学习
从零开始的代码生活_2 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
云小逸2 小时前
【C++ 第七阶段:模板、泛型编程与工程综合详解】
开发语言·c++
摇滚侠2 小时前
Java 全栈开发实战教程 课程笔记 29-33
笔记
GIS阵地3 小时前
QgsSingleBandPseudoColorRenderer 完整详解(QGIS 3.40.13 C++)
开发语言·前端·c++·qt·qgis
王维同学3 小时前
[原创][Windows C++]LSA 认证、安全与通知包的注册表枚举
c++·windows·安全
茯苓gao3 小时前
嵌入式开发笔记:EtherCAT协议从硬件到软件完整配置指南——从零搭建一套EtherCAT通信系统
笔记·嵌入式硬件·学习
程序员Rock3 小时前
上位机开发-MODBUS面试常见问题
c语言·c++·面试·职场和发展·上位机
whyTeaFo3 小时前
GAMES101: Lecture 9: Shading 3(Texture Mapping cont.) ppt笔记
笔记