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

相关推荐
saoys6 小时前
Opencv 学习笔记:图像掩膜操作(精准提取指定区域像素)
笔记·opencv·学习
电子小白1237 小时前
第13期PCB layout工程师初级培训-1-EDA软件的通用设置
笔记·嵌入式硬件·学习·pcb·layout
恋爱绝缘体17 小时前
2020重学C++重构你的C++知识体系
java·开发语言·c++·算法·junit
Z1Jxxx8 小时前
加密算法加密算法
开发语言·c++·算法
乌萨奇也要立志学C++8 小时前
【洛谷】递归初阶 三道经典递归算法题(汉诺塔 / 占卜 DIY/FBI 树)详解
数据结构·c++·算法
️停云️9 小时前
【滑动窗口与双指针】不定长滑动窗口
c++·算法·leetcode·剪枝·哈希
clorisqqq9 小时前
人工智能现代方法笔记 第1章 绪论(1/2)
人工智能·笔记
charlie1145141919 小时前
嵌入式现代C++教程: 构造函数优化:初始化列表 vs 成员赋值
开发语言·c++·笔记·学习·嵌入式·现代c++
IT=>小脑虎9 小时前
C++零基础衔接进阶知识点【详解版】
开发语言·c++·学习
在路上看风景10 小时前
01. C++是如何工作的
开发语言·c++