主要参考博文:

应用特点:GPU并行吞吐量大,适合大数据并行处理;CPU适合逻辑处理和串行计算,适合多任务并行处理;

gpu并行计算特点 python cpu并行和gpu并行_GPU

gpu并行计算特点 python cpu并行和gpu并行_gpu并行计算特点 python_02

GPU工作模式
1)CPU 具有独立的内存和寄存器,GPU也具有独立的显存和寄存器。CPU作为主控制器,CPU和 GPU 协同处理任务,GPU主要处理可以高度并行的数据处理任务,CPU则负责逻辑处理和串行计算相关任务。

2)GPU上的程序被称为内核函数,也叫kernel。kernel是并行执行的程序段。在一段程序中可以有多个内核函数,每个内核函数内部都是并行执行的,但是各个kernel之间确是是串行执行的,其中还可以穿插CPU代码段。

3)CUDA程序执行步骤:CPU完成初始化工作,将参与并行运算的数据拷贝到显存中,GPU上启动内核函数,在GPU上执行并行运算程序,GPU运算完成后将数据结果由显存传送回CPU内存。在程序设计中应尽量少使用分配内存,拷贝数据等涉及到CPU和 GPU 数据交换的这些命令。GPU的硬件特性使得block与block之间的通信很难,但是CUDA中的全局存储器允许多个GPU或者同一个GPU的多个block同时对一块存储空间进行访问。

 

GPU编程模型
1)CUDA中的基本逻辑执行单位:网格(grid)、线程块(block)、线程(thread)和线程组(warp )。

2)一个内核函数对应一个网格。一个网格中有多个block,block是内核函数执行的基本单位,线程块之间是无序并行执行的,并且不同的线程块之间是没办法相互通信的。

3)一个block可最多由512个线程构成。线程是CUDA编程模型中可以分配的最小单位,也是资源最终的持有者。每个线程都有独立的register和 local memory,同一个线程块的线程之间可以相互进行细粒度通信。

4)warp是 CUDA 程序运行时的实际执行单位。CUDA架构中一个warp由 32 个线程组成。

5)GPU编程有两个主要平台,一个是OpenCL,编程方式类似OpenGL的产业标准,还有另一个是为了C/C++ 的CUDA,在NVIDIA的GPU上编程。

补充:

grid:kernal函数的执行单元,一个kernal对应一个grid,grid内部是并行执行,gird之间通过cpu调度串行执行。

block:block是并行计算的基本单位,block之间无序并行执行:具体来说,每个SM控制多个block块,多个SM以warp为单位进行线程调度并行执行(warp是实际并行计算单位)

thread:最小的执行单元,实际资源的拥有者

可参考博客:

 

适用GPU场景
1. 内核中有很多并行线程的应用。

2. 对于线程间的数据交换都发生在kernel调度空间中的相邻线程之间的应用,因为这样就可以用到per-block shared memory。

3. 数据并行的应用,多个线程做相似工作,循环是数据并行的主要来源。

4. 做同步操作较少的应用。

 

不适合GPU场景
1. 并行度小的应用,如需要的线程数小于100个,那么使用GPU加速效果不明显。

2. 不规则的任务并行---尽管应用需要很多线程,但是这些线程都做不同的工作,那么GPU不能得到有效的利用。不过这也依赖于具体工作,多久对线程调度一次,加速的可能仍然存在。

3. 频繁的全局同步,这要求全局的barrier,带来很大性能开销。

4. 在线程之间,会出现随机的点对点同步的应用。GPU对这个的支持不好,通常需要在每次同步的时候做一个全局barrier,如果要利用GPU,最好重构算法避免出现这个问题。

5. 要求计算量(相比于数据传输量)少的应用。尽管在CPU+GPU计算结构中,GPU可以带来计算性能的提升,但是这些提升都被向GPU传输数据所消耗的实践覆盖了。举个例子,对于两个向量求和运算,如果非常大的向量的话,一般都选择在CPU上算,否则传输到GPU上的时间开销很大。