最近导师布置了了解“异构计算”的任务,以便于后续研究中实现图像原始数据的快速处理,因此本文集的内容是关于异构计算学习的一个总结,首先是异构计算的初识。
1.异构计算是什么?并行计算?异构并行计算?
1.1异构计算是什么
在了解异构计算是什么之前,不妨先了解一下人工智能的三要素以及何为同构计算。这样就能体会出异构计算为何产生,有何特点。
人工智能有三要素:算法,计算力,数据。同构计算与异构计算属于算力的部分。
计算力归根结底由底层芯片提供。按照计算芯片的组成方式,可以分成:
同构计算:使用相同类型指令集和体系架构的计算单元组成系统的计算方式。
异构计算:使用不同类型指令集和体系架构的计算单元组成系统的计算方式(用不同制程架构、不同指令集、不同功能的硬件组合起来解决问题)。常见的计算单元类别包括CPU、GPU、DSP、ASIC、FPGA等。
引用知乎上的一个小例子,可更好的解释概念:厨房异构
例子中涉及的一些概念的解释如下:
1)协处理器
协处理器,这是一种协助中央处理器完成其无法执行或执行效率、效果低下的处理工作而开发和应用的处理器。这种中央处理器无法执行的工作有很多,比如设备间的信号传输、接入设备的管理等;而执行效率、效果低下的有图形处理、声频处理等。为了进行这些处理,各种辅助处理器就诞生了。需要说明的是,由于现在的计算机中,整数运算器与浮点运算器已经集成在一起,因此浮点处理器已经不算是辅助处理器。而内建于CPU中的协处理器,同样不算是辅助处理器,除非它是独立存在。
2)指令集
指令集,就是CPU中用来计算和控制计算机系统的一套指令的集合,而每一种新型的CPU在设计时就规定了一系列与其他硬件电路相配合的指令系统。而指令集的先进与否,也关系到CPU的性能发挥,它也是CPU性能体现的一个重要标志。每款CPU在设计时就规定了一系列与其硬件电路相配合的指令系统。指令的强弱也是CPU的重要指标,指令集是提高微处理器效率的最有效的工具之一。从现阶段的主流体系结构讲,指令集可分为复杂指令集和精简指令集两部分。
3)ASIC(特殊订制集成电路)与FPGA(现场可编程门级列阵)
4)DSP芯片
dsp芯片是指能够实现数字信号处理技术的芯片,其中的dsp就是指数字信号处理技术。dsp芯片的内部采用程序和数据分开的哈佛结构,具有专门的硬件乘法器,广泛采用流水线操作,提供特殊的dsp指令,可以用来快速地实现各种数字信号处理算法。
DSP和CPU都是微处理器,但DSP是CPU发展的分支,DSP是专用的信息处理器,内部的程序是针对不同的机器和环境进行特别设计的。CPU是多功能的处理器,强调的是多功能,适应很多不同的环境和任务,DSP可以做CPU的某些功能的补充加强,但不能代替CPU,CPU也无法替代DSP的功能。
5)X-PU之间的区别(CPU、GPU、TPU、NPU、BPU、DPU)
参考文章地址:https://www.cnblogs.com/missidiot/p/9869275.html
有关于CPU的一些补充如下:
“cpu与cache.主存和外存的关系”可参考:https://wenwen.sogou.com/z/q106909635.htm
“寄存器和存储器”可参考:https://blog.csdn.net/menshu1892/article/details/79912090
有关于NPU(Neural network Processing Unit 神经网络处理器)的一些补充如下:
参考文章《NPU的发展概况》----https://blog.csdn.net/CHAO_bismarck/article/details/106651814
6)计算机硬件关系图
1.2并行计算
参考文章链接:
https://blog.csdn.net/qq_25985027/article/details/103351550
https://blog.csdn.net/wm_1991/article/details/50257269
https://blog.csdn.net/Hyo555/article/details/102584996
了解并行计算之间先了解一下何为“串行计算”。
1.2.1串行计算
串行的意思是A和B两个任务运行在一个CPU线程上,在A任务执行完之前不可以执行B。即,在整个程序的运行过程中,仅存在一个运行上下文,即一个调用栈一个堆。程序会按顺序执行每个指令。
串行计算即不将任务进行拆分,一个任务占用一块处理资源,如下图:
1.2.2并行计算
并行性(并行)指两个或两个以上事件或活动在同一时刻发生。在多道程序环境下,并行性使多个程序同一时刻可在不同CPU上同时执行。比如,A和B两个任务可以同时运行在不同的CPU线程上,效率较高,但受限于CPU线程数,如果任务数量超过了CPU线程数,那么每个线程上的任务仍然是顺序执行的。
(核心和线程知识见:http://www.360doc.com/content/19/0819/05/5816007_855764689.shtml)
并行计算或称平行计算是相对于串行计算来说的。并行计算(Parallel Computing)是指同时使用多种计算资源解决计算问题的过程。为执行并行计算,计算资源应包括一台配有多处理机(并行处理)的计算机、一个与网络相连的计算机专有编号,或者两者结合使用。并行计算的主要目的是快速解决大型且复杂的计算问题。
并行计算可以划分成时间并行和空间并行。时间并行就是流水线技术(可参考:《计算机体系结构——流水线技术(Pipelining)》),空间并行使用多个处理器执行并发计算。目前以研究空间并行为主。从空间 并行的角度来说,并行计算将一个大任务分割成多个子任务,每个子任务占用一定处理资源。并行计算中不同子任务占用的不同的处理资源来源于同一块大的处理资源。 换一个说法,就是将一块大的处理资源分为几块小的处理资源,将一个大任务分割成多个子任务,用这些小的处理资源来单独处理这些子任务。 并行计算中各个子任务之间是有很大的联系的,每个子任务都是必要的,其结果相互影响。
以程序和算法设计人员的角度看,并行计算又可分为数据并行和任务并行。数据并行把大的任务化解成若干个相同的子任务,处理起来比任务并行简单。
空间上的并行导致两类并行机的产生,按照Michael Flynn(费林分类法)的说法分为单指令流多数据流(SIMD)和多指令流多数据流(MIMD),而常用的串行机也称为单指令流单数据流(SISD)。MIMD类的机器又可分为常见的五类:并行向量处理机(PVP)、对称多处理机(SMP)、大规模并行处理机(MPP)、工作站机群(COW)、分布式共享存储处理(DSM)。
其他关于分布计算、网络计算和云计算的知识见文章:《简单理解串行计算、并行计算、分布式计算、网格计算与云计算》
1.3异构并行计算
异构并行计算包含两个方面的内容:异构和并行。异构是指:计算单元由不同的多种处理器组成,如X86CPU+GPU、ARM CPU+GPU、X86 CPU+FPGA、ARM CPU+DSP等。并行是指:要发挥异构硬件平台的全部性能必须要使用并行的编程方式。这通常包含两个层次的内容:
1)多个不同架构的处理器同时计算,要发挥异构系统中所有处理器的性能,可通过并行编程使每个处理器都参与运算,避免处理器闲置。相比于只让某一种类型的处理器参与工作,这种方式提高了性能上限,简单举例来说,在X86 CPU+GPU平台上,X86 CPU的计算能力为1TFLOPS,GPU的计算能力为4TFLOPS(floating point operations per second 每秒所执行的浮点运算次数),如果只使用GPU,那么最大可发挥的性能是4TFLOPS,而如果加上X86 CPU,则最大可发挥的性能是5TFLOPS。
2)每个处理器都是多核向量处理器,这要求使用并行编程以发挥每个处理器的计算能力。通常每个处理器包括多个核心,每个核心包含一个或多个长向量,如AMD GCN GPU中就包含数量不等的核心,每个核心包含4个向量,每个向量能够同时处理16个4字节长度的数据。如果没能很好地并行,则可能不能完美地发挥多核和向量化的性能。
本内容参考书籍《OpenCL异构并行计算原理、机制与优化实践》,这是本非常好的异构并行计算学习书籍,强烈推荐!!该书的PDF的下载链接为:https://www.jb51.net/books/526130.html
如果对异构并行计算很感兴趣,想知道应具备哪些技能与知识可参考文章:如何成为一名异构并行计算工程师
另外的可参考文章有:CPU两大架构X86 和 ARM 异构计算综述
2.华为异构计算方案
华为主要采取的cpu+npu的异构计算架构,称为CANN。华为云官网公布了一系列详尽的异构计算资料,大家可自行登录查看
CANN异构计算架构