之前谈了谈CUDA的环境搭建. 这次说一下基本的结构, 如果不了解, 还是没法开始CUDA编程的.
GPU处理单元
从这张GPU概念内核图开始讲起, 会发现和CPU内核是不同的, 少了三级缓存以及分支预测等等. 但是增加了ALU, 扩大了上下文存储池. 增加ALU目的就是增强运算能力, 可以直接进行向量或者矩阵运算. 增加Ctx个数就是为了隐藏延迟, 遇到阻塞可以直接切换下一个. 然后, 此图是我依据一张比较官方的图进行重绘的. 图含8个ALU, 4组执行环境(Execution context), 每组有8个Ctx. 这样, 一个这样的内核可以并发(concurrent but interleaved)执行4条指令流(instruction streams), 32个并发程序片元(fragment).
复制16个上述的处理单元, 得到一个GPU. 实际肯定没有这么简单的, 所以可以说是概念GPU.
概念GPU
图含16个处理单元, 128个ALU, 64组执行环境(Execution context), 512个并发程序片元(fragment). 假设频率1GHz的话, 运算能力以及是256GFLOPS了. 祭出n多年前的卡皇GTX 480, 就已经有480个CUDA核, 内存带宽177.4GB/s. 而GTX 980 Ti有2816个CUDA核, 内存带宽336.5GB/s. 所以运算能力早就是非常恐怖的了. 如果全部画出来, 基本上密集恐惧症福利了(手动滑稽). 但是带宽依旧是瓶颈, 虽然比CPU带宽高了一个数量级, 但是可以看到, GTX 980 Ti的带宽也就是多年前GTX 480的两倍左右.
由于目前还没有完全依靠GPU运行得机器, 一般来说, 都是异构的, CPU+GPU. 这一点在GPU编程上是要特别注意的, 也就是Host与Device.
HOST-DEVICE
在CUDA架构下, 显示芯片执行时的最小单位是thread. 数个thread可以组成一个block. 一个block中的thread能存取同一块共享的内存, 而且可以快速进行同步的动作. 不同block中的thread无法存取同一个共享的内存, 因此无法直接互通或进行同步. 因此, 不同block中的thread能合作的程度是比较低的. 上图:
线程结构1
线程结构2
然后依据thread, block和grid, 有着不同的存储. 可以结合下面两幅图进行理解:
线程存储1
线程存储2
GPU都是SIMT(单指令多线程)的, 线程是基本操作单位. 所以所有结构的核心都是线程, 存储也是依据线程结构设计.
http://html.rhhz.net/tis/html/20150101.htm# http://hustcat.github.io/gpu-architecture/ https://blog.csdn.net/Ddreaming/article/details/52504125 https://www.geforce.cn/hardware/desktop-gpus/geforce-gtx-980-ti/specifications https://www.bilibili.com/video/av10436982?t=1317&p=6
这次的话, 有些图是自己做的, 有几张是参考文章中的. 这些图是很重要的, 就像写c程序, 不懂操作系统是没法写好的. 想做GPU编程, 不懂结构也是不行的. 喜欢记得点赞哦, 有意见或者建议评论区见~