计算范式V2

这篇博客一方面是上过课后把一些很宏观的想法理一下,不会涉及太多细节;另一方面是两年前整理的《计算范式》里堆叠了一些相对细一些的东西,这篇算作一个补充。


本文由giantpoplar发表于CSDN,转载请保留本声明。


串行 : 冯·诺依曼架构

冯·诺依曼架构是通用计算机一个基本的结构,其特征有两点,一是存储指令和数据,二是指令顺序执行。通用计算机里面指令一般有存取数、计算、控制这三类指令,顺序执行就是这些指令一条执行接着一条执行,任何时刻只有一条指令在执行,这是一种串行的计算。在这种串行的模式下,性能的提升主要来自于处理器频率的提升。

各级并行

流水线

一个简单的mips处理器一条指令的执行可能分为4个阶段:取指,译码和取操作数,执行,写回。如果一条指令执行一个周期,在一个周期里面,指令执行的不同的阶段使用的硬件资源是不一样的,这样会产生资源闲置,资源没有充分利用。
流水线是多阶段处理提升性能(吞吐)应用很广泛的做法。
理想的流水线每阶段花费时间等长,阶段之间没有依赖,n段的流水线充满后就可以获得n倍的性能。流水线的思想在软件里也很常见,比如磁盘I/O和计算的流水,通信和计算的流水。

处理器上的流水线不是理想的,每阶段的时间一般不一样,时钟周期的长度要和最长的阶段一致;各阶段之间还会有依赖,比如取寄存器操作数的时候需要前一条指令的执行结果,但是还没执行完,流水线就要停顿了,还有就是分支指令下一条指令是不确定的,指令进入流水线发现不该进入也很麻烦。所谓的数据冒险和控制冒险,通过转发、推断执行等等手段解决问题。

流水线是一种指令级别的并行。
这种做法是把相邻指令的执行“重叠了起来”,但是指令执行的顺序还是依次执行下来的,是不是必须按照程序里指令的顺序,一条一条的执行呢?

乱序执行

流水线上出现数据依赖的时候可能会停顿,可以通过数据转发在一定程度上解决,但是如果是一条访存指令怎么办,虽然基于局部性建立了金字塔式的多级内存层次,访存的延迟仍然严峻,可能高达数百周期,基本会超过流水线的窗口宽度,这时该如何处理?乱序执行是一种提升并行,容忍访存延迟的技术。

乱序执行指令的取指还是按序取指,程序的执行顺序是按照数据依赖来走,操作数准备好了就可以执行,乱序执行其实是一种(指令窗口一定的)数据流,为了保持通用处理器的ISA的顺序执行语义,所以微体系结构上乱序执行了,提交还是按序提交。我我本来幼稚的以为乱序执行需要在硬件上实现图的形象结构,而实际上乱序执行大多是基于使用记分板的Tomasulo算法实现。

超标量流水线说的是有多条流水线,也是增加指令并行的技术。但是多条乱序的流水线之间的协调应该是一件复杂的事情。

乱序执行也是指令级别的并行。
程序的串行顺序不需要那么严格的遵守,还有那些办法来通过指令集并行提升性能呢,
一种办法是在ISA层面就做成数据流。从某种意义是不是可以说,tensorflow的底层API就是一种数据流的ISA,而tf的软硬件图执行引擎则伪装成了一个逻辑上的处理器呢?; P

另一种是 VLIW,超长指令字。编译器负责调度,处理依赖,把多条指令拼成一条长指令,然后硬件上同时执行这条长指令

还有一种思路是指令级别的数据并行

SIMD

单指令多数据流,当在许多数据上执行相同的运算的时候,比如向量处理,图像处理,可以利用数据并行,同样的指令在多个数据上执行,这需要配套相应的执行单元,这也是一种指令级别的并行。像一些向量处理机是SIMD,GPU是一种称为SIMT的方式,也是一种数据并行。

其他架构

获取指令级并行还有脉动阵列解耦访问/执行等方法,最近火热的深度学习领域专用加速器里面,谷歌的TPU是脉动阵列架构 ,微软的Project Brainwave里的软核NPU是解耦访问/执行架构。//对这两个结构不太了解,学过后再来补充。

上面的各种各样的技术都是在说一个核,冯诺伊曼架构单核处理器性能的提升由称为“摩尔定律”和“登纳德缩放定律”的两条定律支撑着,但到了2000s年左右,因为功耗、散热等原因,开始转向多核心

多核心并行

//到底为什么用多核架构
单核处理器性能提升遇到瓶颈,希望采用多核心处理器,使用更多的核心来获得更好的性能,多核处理器的并行在(比指令级并行)更高的粒度进行并行。
共享内存的多核心处理器的架构引入了人一些问题,比如缓存一致性的问题,内存一致性的问题还有内存抢占的问题等等;并行编程也比串行编程难一点,阿姆达尔定律指出了一个程序并行化的性能上限,程序的串行部分是性能瓶颈,并行编成很大部分工作是让那些看起来串行的部分并行化,充分利用cache,以在多核处理器上获得scalable的性能。

另外目前的问题,计算需求的增长大大超过硬件提升的速度,摩尔定律又即将失效,现在开始讲领域专用架构,软硬件协同设计

继续从并行的粒度来看,并行的粒度如果更高呢,比如多块芯片,多台机器的级别会怎样?

分布式系统

分布式系统可以看作是机器粒度的并行,塔嫩鲍姆对分布式系统给出了一个定义,分布式系统是一组独立的计算机的集合,在用户看来就像一台机器一样。
像那些各台机器不共享内存,地理位置分散的p2p系统,网格计算系统,还有数据中心局域网集群应该都算作分布式系统。

知乎链接上有一名做分布式系统的博士对分布式系统做了分类,包括分布式管理系统,分布式计算系统,分布式存储系统,我个人觉得应该再把通信加上(虽然通信应该算作网络这一个大方向)才完整。
分布式系统里面考虑的除了性能是不是scalable,调度,负载均衡之外,很重要的是还要考虑一致性,容错等问题。

并行计算与分布式计算

这两个到底怎么区分呢,共享内存的多处理器,地理位置分散的多台机器,这个很清楚,像数据中心里大数据处理的集群,像HPC里用MPI接口用IB通信到底算分布式计算还是并行计算呢?或者就是处在一个模糊的边界上,概念上分得没那么清?

我自己同意的一个看法是从coursera课程Cloud Computing Concept里的一个采访视频看到的,大概是说在分布式计算里面,基本的假设是没有全局同步的时钟,并且通信是不可靠的;而在并行计算里面基本的假设是通信是可靠的。我觉得这可以作为一个从概念上区分二者的办法

其他计算范式

云计算

云计算糅合了众多技术,是一个靠规模效益盈利的巨大资源池。云计算的服务包括各个层次IaaS,PaaS, SaaS,近年微软在数据中心大规模使用FPGA又提出了HaaS,特别是最近的Project Brainwave,实时AI-inference系统采用硬件微服务的方式把硬件资源组织起来,据说把resnet50的inference延迟降到了1ms,而且整个架构十分灵活,感觉很震撼。

普适计算

这个大概说的是物联网,所有的传感器,移动设备上都计算,这个应该还要和边缘计算结合起来,或者借着深度学习加速器的热潮,把所谓的智能带到嵌入式设备里

边缘计算

是要把移动设备上的计算卸载到附近的基站中,伴随着5G技术的发展,把计算放到距离设备1-hop的骨干网络边缘上来降低延迟。技术似乎还是云计算的那些技术,只不过把云搬运到了边缘,到了地表,变成雾了

量子计算

据说现在做量子通用计算机的思路是用量子电路模拟数字电路实现经典计算机的体系结构的方法,什么既是0又是1,什么幺正变换,坍缩,接着便是一些难懂的词,,,

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值