多核编程实践——识别并行机会(二)

识别并行机会(二)

虚拟化通过在最高层次上实现并行机制,提供了利用多核或者多处理器系统的方式
对于软件开发人员来说,如何利用多个核心增加单个应用程序的吞吐量或者速度是一个问题。

采用并行机制提高单个任务的性能

并行可以完成更多的工作,这里的工作可能是独立的任务,更多的交流是必须的,访问资源也是一个问题

并行影响算法的选择

有的算法适合并行,其他则不适合
有时候,我们虽然增加了线程数,但是并不能保证性能提升。例如快排算法,使用多个线程对多个部分进行排序,虽然对每个部分同时进行排序看起来能提升其时间,但是,将其合并所耗费的时间总和将抹除这些时间优势。

最佳单线程算法位比是最佳的并行算法
最佳并行算法可能比最佳串行算法慢

并行性能最常见的计算是使用Amdahl定律

Amdahl模型确定实际最大线程数

如果某个应用程序,其可并行代码的运行时间占比为10%,那么8线程和4线程并不会有什么差别
使用Amdahl定律进行推演,得到的公式:

N = P/(ST)=P/((1-P)T)

N为线程数
P为可运行代码占比
T是可容忍的性能差异

除非应用程序用于可并行化代码的时间超过其运行时间的一半,否则其可扩展性有限
除非使用可高度并行化的应用程序,否则使用大量线程毫无益处

同步成本怎样降低扩展性

应用程序的并行化存在相关开销成本

使用函数 F ( N ) F(N) F(N)表示同步成本
对成本的一个合理估计: F ( N ) = K ln ⁡ ( N ) F(N)=K\ln(N) F(N)=Kln(N)
则扩展到N个线程的成本: 运 行 时 间 = S + P / N + k ln ⁡ ( N ) 运行时间=S+P/N+k\ln(N) =S+P/N+kln(N)
进行推算,得到最佳 N = P / K N=P/K N=P/K
即:代码可扩展到的线程数与可并行化的工作量比率和同步开销成正比
=>通过减少同步成本、增加可并性代码比例,增加线程数

多核处理器通常使得线程通过某个共享级缓存共享数据
这使得同步成本大大降低

并行模式

多种方法使得在多个线程之间分配工作

并行分为两大类:

  1. 数据并行:多个线程对不同的数据项执行相同的操作
  2. 任务并行:多个线程对不同的数据执行不同的操作

通过进程/线程实现并行化

  • 多个独立任务
    将多个独立任务整合到一台机器上,例如web服务器与邮件服务器整合到同一台机器上
    整合并不会引起性能变化,只是说能提高机器的利用率
    这种策略常见于集群、网格或者云计算中:每个节点运行一个不同的、独立的任务。若在一个节点出现故障,则可以在另一个节点上重试

  • 多个松散耦合的任务
    任务各不相同、共同协作构成一个应用程序
    任务本身是独立的
    应用程序的性能由各个任务的活动决定
    当多个线程共享同一个工作时将提升性能
    当将工作拆分为多个独立的任务时,性能不变,吞吐量会增加

  • 相同任务的多个副本
    每个单独的任务耗费相同时间完成,因为并行完成多个任务,系统的吞吐量将增加
    速率并不会得到增加!

  • 单个任务拆分到多个线程
    典型的情形:将某个循环分配到多个线程,每个线程执行一部分循环
    这种方式能增加吞吐量
    也称之为分叉/汇合:分岔时多个线程的工作分配,汇合是指在同步点所有线程应当已经完成各自的任务

  • 流水线
    一个工作单元分割成多个阶段,经历一个阶段到达下一个阶段
    基本的流水线模型中每个阶段仅有一个副本,但是在某个特别耗时的阶段,可以利用多个副本(流水线+多副本的单任务)
    缺点:完成新任务的速度受制于流水线中最慢阶段的工作完成时间

流水线并没有减少处理每个工作单元所耗费的时间
对吞吐量的提高并不等同于降低单位工作的时间

总结

  1. 并行对算法的选择是有影响的
  2. 使用Amdahl定律对并行效率进行计算
  3. 除非使用可高度并行化的应用程序,否则使用大量线程毫无益处
  4. 通过减少同步成本、增加可并性代码比例,增加线程数
  5. 并行分为数据并行、任务并行

几种并行化:

  1. 多个独立任务:并不会引起性能变化,但是能提高利用率
  2. 多个松散耦合的任务当多个线程共享同一个工作时将提升性能;当将工作拆分为多个独立的任务时,性能不变,吞吐量会增加
  3. 相同任务的多个副本:系统的吞吐量将增加,速率并不会得到增加!
  4. 单个任务拆分到多个线程:能增加吞吐量
  5. 流水线:可以利用多个副本(流水线+多副本的单任务),并没有减少处理每个工作单元所耗费的时间

特别注意:
吞吐量和性能是两个概念!吞吐量的提升不意味着运行速率的提升!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值