文章目录

  • 什么是超算
  • CPU
  • GPU
  • CPU和GPU联系
  • GPU和CPU的区别
  • 硬件结构区别
  • 串行和并行
  • CUDA编程模型概览
  • 线程格(Grid)
  • 线程块(Block)
  • 线程(Thread)
  • 核函数(Kernel)


什么是超算

把计算机连接在一起,获得更强大计算能力
原来:串行计算
现在:并行提交任务计算
超算:就是一群计算机

超算使用的技术:
GPU技术。

CPU

在CPU基础上增加GPU来协助CPU。

CPU局限性:
CPU由于物理限制,遇到了工艺上壁垒,主频无法突破。
而GPU却仍在高速的增长。

GPU

GPU英文全称Graphic Processing Unit,中文翻译为“图形处理器”。与CPU不同,GPU是专门为处理图形任务而产生的芯片。从这个任务定位上面来说,不仅仅在计算机的显卡上面,在手机、游戏机等等各种有多媒体处理需求的地方都可以见到GPU的身影。

在GPU出现之前,CPU一直负责着计算机中主要的运算工作,包括多媒体的处理工作。CPU的架构是有利于X86指令集的串行架构,CPU从设计思路上适合尽可能快的完成一个任务。但是如此设计的CPU在多媒体处理中的缺陷也显而易见:多媒体计算通常要求较高的运算密度、多并发线程和频繁地存储器访问,而由于X86平台中CISC(Complex Instruction Set Computer)架构中暂存器数量有限,CPU并不适合处理这种类型的工作。以Intel为代表的厂商曾经做过许多改进的尝试,从1999年开始为X86平台连续推出了多媒体扩展指令集——SSE(Streaming SIMD Extensions)的一代到四代版本,但由于多媒体计算对于浮点运算和并行计算效率的高要求,CPU从硬件本身上就难以满足其巨大的处理需求,仅仅在软件层面的改并不能起到根本效果。

对于GPU来说,它的任务是在屏幕上合成显示数百万个像素的图像——也就是同时拥有几百万个任务需要并行处理,因此GPU被设计成可并行处理很多任务,而不是像CPU那样完成单任务。

CPU和GPU架构差异很大,CPU功能模块很多,能适应复杂运算环境;GPU构成则相对简单,目前流处理器和显存控制器占据了绝大部分晶体管。CPU中大部分晶体管主要用于构建控制电路(比如分支预测等)和Cache,只有少部分的晶体管来完成实际的运算工作。而GPU的控制相对简单,且对Cache的需求小,所以大部分晶体管可以组成各类专用电路、多条流水线,使得GPU的计算速度有了突破性的飞跃,拥有了更强大的处理浮点运算的能力。

CPU和GPU联系

CPU和GPU由PCI总线连接,编程时,CPU来控制,GPU具体负责执行。

cpu和gpu的架构图 cpu与gpu是什么_cpu和gpu的架构图


将GPU及GPU本身的显存称为device

GPU和CPU的区别

相同点:

  1. 超大规模集成电路元件
  2. 能够完成浮点运算功能
    不同点:
  3. CPU延时低,但是计算能力有限,串行架构适合尽可能快的完成一个任务
  4. GPU核多,擅长计算运行,延时较高,不擅长复杂逻辑处理,更适合并行执行多个任务,设计更简单

硬件结构区别

cpu和gpu的架构图 cpu与gpu是什么_驱动开发_02


从实际来看,CPU芯片空间的5%是ALU,而GPU空间的40%是ALU。

那有人讲了,为什么cpu不像gpu那样设计呢,这样计算能力也强悍了!

为什么?CPU要做得很通用。CPU需要同时很好的支持并行和串行操作,需要很强的通用性来处理各种不同的数据类型,同时又要支持复杂通用的逻辑判断,这样会引入大量的分支跳转和中断的处理。这些都使得CPU的内部结构异常复杂,计算单元的比重被降低了。而GPU面对的则是类型高度统一的、相互无依赖的大规模数据和不需要被打断的纯净的计算环境。因此GPU的芯片比CPU芯片简单很多

举个例子,假设有一堆相同的加减乘除计算任务需要处理,那把这个任务交给(几十个)小学生就可以了,这里小学生类似于GPU的计算单元,而对一些复杂的逻辑推理等问题,比如公式推导、科技文章写作等高度逻辑化的任务,交给小学生显然不合适,这时大学教授更适合,这里的大学教授就是CPU的计算单元了,大学教授当然能处理加减乘除的问题,单个教授计算加减乘除比单个小学生计算速度更快,但是成本显然高很多。

串行和并行

从硬件设计上来讲,CPU 由专为顺序串行处理而优化的几个核心组成。另一方面,GPU 则由数以千计的更小、更高效的核心组成,这些核心专为同时处理多任务而设计。

cpu和gpu的架构图 cpu与gpu是什么_GPU_03

并行编程:
CPU上: OpenMP , MPI
GPU上: CUDA, OpenCL/HIP

CUDA编程模型概览

CUDA逻辑结构
Host指程序运行在CPU的部分
Device指运行在GPU的部分,又称kernel

CUDA 是Nvidia发布的一款编程模型及平台,可以让我们能够使用c/c++语言在GPU上进行编程。也是当下最流行和最成熟的GPU编程模型。

下面我们简单看一下他的一些概念。后面文章我会详细介绍。

cpu和gpu的架构图 cpu与gpu是什么_驱动开发_04

线程格(Grid)

由多个线程块组成(可以表示成一维,二维,三维,

线程块(Block)

  1. 由多个线程组成(可以表示成一维,二维,三维)。
  2. 各block是并行执行的,block间无法通信,也没有执行顺序。
  3. 注意线程块的数量限制为不超过65535(硬件限制)。

线程(Thread)

一般通过GPU的一个核进行处理。最小处理单元。

核函数(Kernel)

  1. 在GPU上执行的函数通常称为核函数。
  2. 一般通过标识符__global__修饰,调用通过<<<参数1,参数2>>>,用于说明内核函数中的线程数量,以及线程是如何组织的。
  3. 以线程格(Grid)的形式组织,每个线程格由若干个线程块(block)组成,而每个线程块又由若干个线程(thread)组成。
  4. 是以block为单位执行的。
  5. 叧能在主机端代码中调用。
  6. 调用时必须声明内核函数的执行参数。
  7. 在编程时,必须先为kernel函数中用到的数组或变量分配好足够的空间,再调用kernel函数,否则在GPU计算时会发生错误,例如越界或报错,甚至导致蓝屏和死机。