术语:
- Host:CPU和内存host memory
- Device :GPU和显存ldevice memory
- NVPROF:一种性能分析软件,不过在jetpack 5.0.2上不能用,可以使用nsight代替,具体没有试过。
- CUDA event 本质上是一个时间戳这个时间戳是在用户指定的时间点上记录的。由于GPU本身支持记录时间戳,因此就避免了当使用CPU定时器来统计GPU执行时间时可能遇到的诸多问题。
概念
CUDA线程层次
线程(Thread)、线程块(Block)、线程格(Grid)
- Thread:sequential execution unit 所有线程执行相同的核函数并行执行
- Block: a group of threads 执行在一个Streaming Multiprocessor 【SM】同一个Block中的线程可以协作
- Grid: a collection of thread blocks 一个Grid当中的Block可以在多个SM中执行
CUDA存储层次:
- Shared Memory是目前最快的可以让多个线程沟通的地方
这张图引用自:CUDA内存类型memory_Augusdi的博客-CSDN博客_cuda local memory
Registers
- 寄存器是GPU最快的memory
- kernel中没有什么特殊声明的自动变量都是放在寄存器中的。
- 当数组的索引是constant类型且在编译期能被确定的话,就是内置类型,数组也是放在寄存器中。
- 寄存器变量是每个线程私有的,一旦thread执行结束,寄存器变量就会失效。寄存器是稀有资源。(省着点用,能让更多的block驻留在SM中,增加Occupancy--maxrregcount 可以设置大小不同设备架构,数量不同
Local Memory:
-
Registers 不够了,就会用Local Memory 来替代。但是,更多在以下情况,会使用LocalMemory .
-
无法确定其索引是否为常量的数组。
-
会消耗太多寄存器空间的大型结构或数组。
-
如果内核使用了多于可用寄存器的任何变量[这也称为寄存器溢出
-
关于local memory的解释,可以参考CUDA优化的冷知识14|local memory你可能不知道的好处 - 知乎
Constant Memory:
- 固定内存空间驻留在设备内存中,并缓存在固定缓存中 (constant cache) :
- constant的范围是全局的,针对所有kernel。
- 在同一个编译单元,constant对所有kernel可见。
- kernel只能从constant Memory读取数据,因此其初始化必须在host端使用下面的function调用:cudaError_t cudaMemcpyToSymbollconst void* symbol, const void* src,size tcount);当一个warp中所有thread都从同一个Memory地址读取数据时,constant Memory表现会非常好会触发广播机制。
Texture Memory:
- Texture Memory驻留在device Memory中,并且使用一个只读cache。Texture Mmeory是专门为那些在内存访问模式中存在大量空间局部性 (SpatialLocality) 的图形应用程序而设计的。意思是,在某个计算应用程序中,这意味着一个Thread读取的位置可能与邻近Thread读取的位置“非常接近”Texture Memory实际上也是qlobal Memory在一块,但是他有自己专有的只读cache。纹理内存也是缓存在片上的,因此一些情况下相比从芯片外的DRAM上获取数据,纹理内存可以通过减少内存请求来提高带宽