串行与并行的辩证关系

在计算机系统中,并行处理能显著提升性能,但某些关键步骤仍必须采用串行方式。优化这两种处理模式的方法各不相同:

  1. 串行优化:采用流水线技术,计算时间取决于最慢的瓶颈步骤
  2. 并行优化:通过纵向分治将任务划分为K份,理论执行时间可缩短至1/K

8.1 指令流水线:物理并行的串行逻辑

CPU指令执行三阶段

  1. 取指(Fetch):从存储单元获取指令
  2. 译码(Decode):解析指令含义
  3. 执行(Execute)
    • 读取操作:内存→寄存器数据传输
    • 写回操作:寄存器→内存数据传输

流水线技术优势

由于CPU使用不同硬件单元处理不同阶段,流水线技术能让多条指令重叠执行,大幅提升吞吐量。例如当第一条指令进入执行阶段时,第二条指令可同时进行译码,第三条指令开始取指。

思考题8.1:分支指令对流水线的影响

《计算之魂》思考题8.1——流水线 - 知乎

条件分支(if)会打断指令预取,导致流水线清空或预测错误,可能降低效率30%-50%。现代CPU采用分支预测等技术缓解此问题。

8.2 摩尔定律的演进历程

  1. 2000年前:通过提高时钟频率和增加处理器位数(4位→8位→16位→32位→64位)提升性能
  2. 2000-2016:转向多核处理器和GPU,采用并行架构处理数据
  3. 2016年后:追求能效比,发展ASIC等专用芯片

8.3 分布式系统典范:GFS与MapReduce

Google文件系统(GFS)设计

PageRank处理大量网页的方法,将网页合并为大文件,以 64M 分块保存。

在大文件中,建立索引查找文件。

大文件的好处和劣势:

  • 好处:串行读写更快,适合流水线作业
  • 坏处:随机查找困难;无法用新内容覆盖旧内容;对使用者不方便,因为使用者不知道文件的具体存储位置。

设计目标:优化海量数据存储而非随机访问

架构特点

  • 主从式结构:主服务器管理元数据,块服务器存储实际数据
  • 64MB大分块存储:提升顺序读写效率
  • 三重备份策略:不同机架的块服务器存储副本

优势

  • 主服务器和数据块之间加入块服务器,这样主服务就不会成为瓶颈
  • 能够使用大量廉价的服务器

备份的处理:备份放在不同块服务器上,增加可靠性和安全性,增加读写带宽。

MapReduce并行计算框架的一个例子

基础版本

  • Map阶段:每台服务器存储所有数据,但只统计自己对应部分的二元组。
  • Reduce阶段:将所有服务器上的二元组统计合并。

优化版本

  • Map优化:每台服务器仅处理0.1%数据
  • Reduce优化:两阶段归并排序
    1. 按key范围分片归并
    2. 最终全局归并

大规模分布式实现(采用两次Map一次Reduce模式)

动机:如果数据量特别大,一个服务器无法完全处理所有的二元组数据。那么就需要分布式处理了。

数据分布:100台存储服务器+2000台计算服务器

执行流程

  • a 复制和统计:每个从服务器向原始服务器中拿取属于自己那部分的数据,然后统计二元组
  • b 排序:从服务器上的二元组按照 从小到大排序
  • c 归并:按照序号两次归并
    • 第一次:在多个服务器上,每个服务器做一部分 x 序号的归并
    • 第二次:最终得到完整结果的归并,使用的服务器更少

计算复杂度分析

  • 时间复杂度
    • 步骤 a 复制和传输:瓶颈在读数据的服务器上。读 D/100 的数据。因为读、传输和写是串行可用流水线优化。这三部分的时间定义为网络传输时间
    • 步骤 a 统计二元组:基本上是复制一遍数据的时间
    • 步骤 b 排序二元组:也相当于复制一遍的时间
    • 步骤 c 归并:时间主要在网络传输,第一次归并为 第二次归并因为没有重复直接复制,为
    • 总结:
  • 空间复杂度
    • 不会超过原始数据,为

总结: map 容易并行处理,拆分即可,reduce 视情况而定

思考题8.3:分布式系统实践

Q1:备份校验与修复

  • 100TB的数据假设存储在 100 台服务器,备份 3 则数据应有 300 TB
  • 所有的数据是关联的,每个数据有一个序号,在读取一个文件的时候可以找到另外两个备份所在的位置
  • 检查数据完整性的服务器假设有1000台。每台服务器负责检查 0.1TB 的数据,总共要处理 0.3 TB 的数据
  • map:将 100 TB 分为 1000 份,每一份拷贝到一台服务器上,并把备份也拷贝过来。然后做完整性检查,将检查好的数据写回硬盘,写回硬盘的数据为 0.1T
  • reduce:将所有的数据合并,即拷贝一遍即可

Q2:典型MapReduce问题 如倒排索引构建、网页排名计算等需要先分布式处理再合并结果的场景都适合采用MapReduce框架。