本文参考:《CUDA Programming Guides》,《Professional CUDA C Programming》

正文:

整体结构将主要分为逻辑结构,物理结构两个方面进行理解:

首先一定要对怎么cpu与gpu异构模型有一定的了解,CPU 与 GPU通过中间的PCI总线进行连接和传输。根据前文NVCC的编译过程,我们可以了解到,一个.cu文件经过编译之后会更具不同的硬件转化为其相对应的2进制文件,分开传到cpu 和 gpu进行异步执行。如下图:

CUDA学习(四)-整体结构CUDA学习(四)-整体结构

逻辑结构:

为了方便编程和理解,CUDA根据GPU硬件设计了相应的编程模型,分别分为 grid、block、thread三个层次,如图:

CUDA学习(四)-整体结构CUDA学习(四)-整体结构

一个grid中有多个block,一个block有多个线程。他们具有层次性,且他们有各自的操作范围,可以设置不同的维度,有利于程序的控制与理解。结合上面的异构模型,当主程序发送一个内核函数时,就是发送对应一个grid。这里可以人为便于自己的定义block,thread的数量和维数。

为什么会有利于程序的控制理解呢?首先要先理解2个图:

CUDA学习(四)-整体结构CUDA学习(四)-整体结构

每个thread都分配有相应的寄存器和本地内存。在一个block中又有一个共享内存,对于block内的thread时可见的,且shared memory的读取速度很快。对于整个grid有供所有block和thread访问的全局、常量、纹理内存,后两个内存是对thread只读的,且只能通过host端进行赋值设置。

初步了解了cuda的逻辑模型,那这些thread是怎么进行执行的呢?

物理结构:

还是以图来理解比较直观,一个GPU有多个流式多处理器(SM :streaming multiproeessors )组成,如图:

CUDA学习(四)-整体结构CUDA学习(四)-整体结构

一个SM多个CUDA核心,每个CUDA核心能并行运行一个thread。此外可以看到(左图)SM图中有2个线程束调度器,一个SM的调度单位就是一个warp:32*thread(进程束 = 32个线程)进行执行的,也就是说一个SM最多同时运行32个thread。多个SM就构成了一个GPU。

结合右图和上面的逻辑结构内容,我们可以更好理解逻辑结构与设备结构的对应关系。一个grid(网格)会被映射到整个gpu,一个grid中的多个block会被分配到不同的SM中;一个block会被切割成多个warp,这意味着一个SM可以"并发"执行多个block,可以“并发”执行多个warp;在一般情况下,thread会占据SM的所有CUDA核心,进行并行运算。

CUDA学习(四)-整体结构

注意:

每个SM的寄存器和shared memory都是有限的,当一个block的thread很多时,每个thread被分配的寄存器就少了。同理,更多的block那每个block就有更少的shared memory。

相关文章:

  • 2022-12-23
  • 2022-03-07
  • 2021-04-12
  • 2021-12-12
  • 2021-04-14
  • 2022-01-11
  • 2021-09-29
  • 2021-09-01
猜你喜欢
  • 2021-12-20
  • 2021-04-05
  • 2022-12-23
  • 2022-01-07
  • 2022-02-28
  • 2021-06-18
相关资源
相似解决方案