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

相关推荐
李小星同志4 分钟前
高级算法设计与分析 学习笔记6 B树
笔记·学习
霜晨月c16 分钟前
MFC 使用细节
笔记·学习·mfc
Jhxbdks28 分钟前
C语言中的一些小知识(二)
c语言·开发语言·笔记
AlexMercer101243 分钟前
【C++】二、数据类型 (同C)
c语言·开发语言·数据结构·c++·笔记·算法
小灰灰爱代码1 小时前
C++——求3个数中最大的数(分别考虑整数、双精度数、长整数的情况),用函数模板来实现。
开发语言·c++·算法
微刻时光1 小时前
Redis集群知识及实战
数据库·redis·笔记·学习·程序人生·缓存
chnyi6_ya2 小时前
一些写leetcode的笔记
笔记·leetcode·c#
BeyondESH3 小时前
Linux线程同步—竞态条件和互斥锁(C语言)
linux·服务器·c++
青椒大仙KI113 小时前
24/9/19 算法笔记 kaggle BankChurn数据分类
笔记·算法·分类
豆浩宇3 小时前
Halcon OCR检测 免训练版
c++·人工智能·opencv·算法·计算机视觉·ocr