参照 https://zhuanlan.zhihu.com/p/34587739
一、GPU与CPU的联系与区别
GPU上可以进行数据结构统一的运算,GPU上集成大量相对CPU逻辑计算单元简单的计算部件,利于串行。
CPU上可以逻辑计算、流程控制等复杂的过程,利于并行。
总而言之,GPU是一个“人多力量大”的部件,而CPU是一个“单兵作战力强”的部件。
基于CPU+GPU的异构计算平台优势互补,CPU负责处理逻辑复杂的串行程序,而GPU重点处理密集型的并行计算程序,从而发挥最大功效(异构计算指的是在CPU上控制,GPU上计算)。
cuda编程可支持的语言:C/C++ python Fortran
二、CUDA编程
1、在CUDA中CPU成为host,GPU称为device,同时GPU和CPU直接可以相互通信
2、典型的CUDA程序的执行流程如下:
(1)分配host内存,并进行数据初始化
(2)分配device内存,同时将host的数据拷贝到device上
(3)在device上调用核函数完成指定运算
(4)将device运算结果拷贝到host上
(5)释放host和device所申请的内存空间
3、核函数:核函数是可以在device上并行计算的函数,在调用的时候需要指明网格(grid)数和block数,同时函数内必须指明线程的ID。核函数的关键字如下:
4、CUDA中的层级结构
一个核函数所启动的所有线程称为一个网格(grid),一个网格包含多个block,一个block中包含着多个线程。
kernel中所有的线程在逻辑上是并行,但是在物理上能否并行取决于内部资源。当kernel被执行的时候,kernel中所有的线程数就会被分配到流式多处理器SM上(一个线程块只能在一个SM上执行,一个SM上可以处理多个线程块)。
5、可以借助于CUDA的统一内存来避免复杂且繁琐的数据拷贝过程,但需要注意的一点是在使用了统一内存托管内存之后,需要调用 cudaDeviceSynchronize()函数使得host与device同步,保证正确访问kernel的计算结果。