GPU计算适合解决的问题是简单逻辑,计算相互独立可并行的,而CPU适合解决的问题是,逻辑复杂,计算间相互依赖的问题。
GPU的设计思想是高并发吞吐,而CPU的设计思想为低时延。所以我们可以看到,在CPU中拥有多级缓存并且拥有强大的控制单元,引入多级缓存的目的就是为了降低时延,而GPU中,则是拥有大量的计算单云,而控制单元则比较简单,缓存数目也相对较少。
1. 内存模型
硬件侧:
SP:线程处理器,具备自己的registers(寄存器)和自身的local memory(局部内存)。registers和local memory只能由SP自己访问。
SM:多核处理器,由多个SP以及shared memory(共享内存)组成。shared memory 可以被SM中的所有SP访问。
GPU:显卡,由多个SM以及global memory(全局内存)组成。global memory 可以被所有的SP访问。
软件侧:
thread:线程,对应着SP。
block:线程块,由多个tread 组成,对应着SM。
grid:由多个block组成,一个GPU可以拥有多个grid。
warp:线程束,由32个tread组成。通常而言,block是32的倍数。
线程的索引:
对于这个概念,实际上是在计算当前线程在定义的计算单元中的索引,索引从零开始。理解这个计算的关键是引入空间的想象,一维是线,二维是面,三维是立体。
dim3 grid1(2, 1, 1); // x=2, y=1, z=1,这是一维,yz为1
dim3 grid2(4, 2, 1); // x=4, y=2, z=1,这是二维,z为1
dim3 grid3(2, 3, 4); // x=2, y=3, z=4,这是三维,xyz均不为1