目录
- 前言
- GPU架构
- GPU处理单元
- 概念GPU
- GPU线程与存储
- 参考
- 最后
前言
之前谈了谈CUDA的环境搭建. 这次说一下基本的结构, 如果不了解, 还是没法开始CUDA编程的.
GPU架构
GPU处理单元
GPU处理单元从这张GPU概念内核图开始讲起, 会发现和CPU内核是不同的, 少了三级缓存以及分支预测等等. 但是增加了ALU, 扩大了上下文存储池.
增加ALU目的就是增强运算能力, 可以直接进行向量或者矩阵运算. 增加Ctx个数就是为了隐藏延迟, 遇到阻塞可以直接切换下一个.
然后, 此图是我依据一张比较官方的图进行重绘的. 图含8个ALU, 4组执行环境(Execution context), 每组有8个Ctx. 这样, 一个这样的内核可以并发(concurrent but interleaved)执行4条指令流(instruction streams), 32个并发程序片元(fragment).
概念GPU
概念GPU复制16个上述的处理单元, 得到一个GPU. 实际肯定没有这么简单的, 所以可以说是概念GPU.
SM
GPU线程与存储
HOST-DEVICE由于目前还没有完全依靠GPU运行得机器, 一般来说, 都是异构的, CPU+GPU. 这一点在GPU编程上是要特别注意的, 也就是Host与Device.
线程结构1 线程结构2在CUDA架构下, 显示芯片执行时的最小单位是thread. 数个thread可以组成一个block. 一个block中的thread能存取同一块共享的内存, 而且可以快速进行同步的动作. 不同block中的thread无法存取同一个共享的内存, 因此无法直接互通或进行同步. 因此, 不同block中的thread能合作的程度是比较低的. 上图:
线程存储1然后依据thread, block和grid, 有着不同的存储. 可以结合下面两幅图进行理解:
线程存储2
- 每个处理器上有一组本地32位寄存器(Registers);
- 并行数据缓存或共享存储器(Shared Memory), 由所有标量处理器核心共享, 共享存储器空间就位于此处;
- 只读固定缓存(Constant Cache), 由所有标量处理器核心共享, 可加速从固定存储器空间进行的读取操作(这是设备存储器的一个只读区域);
- 一个只读纹理缓存(Texture Cache), 由所有标量处理器核心共享, 加速从纹理存储器空间进行的读取操作(这是设备存储器的一个只读区域), 每个多处理器都会通过实现不同寻址模型和数据过滤的纹理单元访问纹理缓存.
GPU都是SIMT(单指令多线程)的, 线程是基本操作单位. 所以所有结构的核心都是线程, 存储也是依据线程结构设计.
参考
最后
这次的话, 有些图是自己做的, 有几张是参考文章中的. 这些图是很重要的, 就像写c程序, 不懂操作系统是没法写好的. 想做GPU编程, 不懂结构也是不行的. 喜欢记得点赞哦, 有意见或者建议评论区见~