GPU 的架构决定了(众多的计算单元 ALU)它要解决的问题和 CPU 完全不同:CPU 去做相对较少的高级计算,而 GPU 是做大量的、机械的计算。GPU 无法单独工作,必须由 CPU 进行控制调用才能工作。CPU 可单独作用,处理复杂的逻辑运算和不同的数据类型,但当需要大量的处理类型统一的数据时,则可调用 GPU 进行并行计算。
CUDA 程序分两部分:执行在 host(CPU) 内的串行 C 程序,和其中嵌入的并行 C 程序,并行 C 交由 device(GPU)执行。可以把 GPU 想象为一个IO,串行程序执行到并行部分的时候,就会调用 GPU,把计算所需的数据和计算任务传给它。这些并行 C 程序称为核(Kernel)。由于要向 GPU 传输数据,所以 Kernel 执行前需要显式地在 GPU 上分配空间(cudaMalloc)并传输(cudaMemcpy)。
CPU 内的线程往往是共用一个 core,可能是通过上下文切换来表现出并行的特性。GPU 由于其计算任务的特性,访存频率远高于 CPU。GPU 也是多个线程共用一个 core,当一个线程需要访存(即中断)退出当前的 core,则马上进来一个新的线程使用这个 core。这种频繁的上下文切换隐藏了访存的开销。同时,为了加快上下文切换的速度,即访存速度,每一个 core 都有一套自己的 register,线程只需要与寄存器进行数据交互,寄存器和内存的交互对于线程来说是透明的。
一个 Kernel 在 GPU 里是由多组 block 执行的,一组 block 称为一个 grid。每