GPU相比CPU提供更高的指令吞吐量和内存带宽,GPU和CPU在功能上的差异是因为它们的设计目标不同,GPU 专门用于高度并行计算,因此设计时更多的晶体管用于数据处理,而不是数据缓存和流量控制。当下的架构通常是CPU+GPU,CPU进行I/O和控制,GPU主要进行基础运算。
现代的GPU架构:每个GPU会包含很多的core,英伟达称之为流多处理器(streaming multiprocessors, SM)。每个核都在执行单指令多线程的程序(SIMT)。在单个核上执行的线程可以通过共享内存(有点像阻塞操作,保存现场)进行通信,并使用快速barrier操作进行同步。
高吞吐率的实现:内核上运行的大量线程用于隐藏在第一级缓存中找不到数据时访问内存的延迟。即每个控制单元总有任务分发,每个处理单元总有任务要做,被阻塞时总有任务进行切换。
多线程掩盖延迟:类似于流水线的意思,当一个线程在io时调用其他线程,使某一个线程执行完毕后,正好另一个线程io结束继续执行
关于性能的其他要点:除了高效计算,io的效率也必须考虑,比如内外存的数据交换是难以接受的、全局内存要考虑数据对齐、处理器过度臃肿会导致寄存器不够数据被放到内存,之类
为什么GPU有高计算力:
1. GPU是的高延迟高吞吐大规模并行计算,即多个线程同步执行一致的运算,使得我们可以用单路指令流对多个执行单元进行控制,大幅度减少了控制器的个数和系统的复杂度。
2. GPU需要处理的大规模数据,也都属于这种计算模式。比如卷积计算其实是重复相同的动作,即使计算中数据之间的相互影响也具有“局域性”,一个数据单元上的计算最多需要它某个邻域上的数据。意味着线程之间是弱耦合的,邻近线程之间会有一些共享数据(或者是计算结果),远距离的线程间则独立无关。
为什么CUDA的线程要划分block和grid:应用上述两个特性,Block内部有共享内存,线程间可以共享数据、通讯和同步,Block外部则完全独立,没有通讯机制,相互执行顺序不影响计算结果。既可以利用线程间通讯做一些复杂的应用和算法加速,又可以在Block的粒度上自由调度计算任务,在不同计算能力的硬件平台上自适应的调整任务安排。
Warp(线程束):GPU执行程序时的调度单位,一起执行。目前cuda的warp的大小为32,同在一个warp的线程,以不同数据资源执行相同的指令。