云都来了,并行计算还远吗?

现在硬件设备越来越强大,单单一个线程真的很难有效的利用。而且云计算的流行,更有效地利用云资源成为大势所趋。并行计算带来的对传统编程模式革命,使更有效的挖掘机器资源成为可能。下边就对并行计算做一些介绍:

  1. 什么是并行计算?

  并行计算的基本思想就是把复杂的工作进行分解, 分解成可以同时进行的多个子任务, 来缩短任务的完成时间,提升系统的吞吐性能。 就如下图所示, A, B, C 三个子任务同时进行,当然要比三个子任务串行要快的多了。

  云都来了,并行计算还远吗?

  2.为什么要选择并行计算?

  ·提升系统的吞吐量

  处理单个任务的速度快了,单位时间相应的请求就多了,当然吞吐量也就就上去了。

  ·提升系统的相应速度

  系统处理快了, 就不会有太多的堵塞线程, 这样系统就有富余的资源来响应新的请求。

  ·更大的挖掘出单个机器的性能

  单线程独占模式下的程序需要等待一个任务完成, 才会启动另一个任务,如果一个任务在进行大量的I\O操作,其他任务也没有办法开始,只能等待。而这时CPU可闲的发慌了,对高主频的CPU闲着不用那  可以极大地犯罪。如果你要把你的服务架到云上,空闲着系统CPU, 那就不单单是犯罪,那可还是在浪费Money呀。所以多线程并发就表现出了很好的资源利用能力, 一个线程在I\O操作,另一个就可  以利用CPU资源。

  3.并行子任务的载体

  并行任务的载体可分为两类:

  ·线程: 同时启动启动多个线程, 每个线程负责执行一个或多个任务, 通过线程并行来达到多个子任务的并行处理。当选择这种方式进行并发处理时,并行程序的处理能力非常依赖机器的性能, 尤其是CPU 核的数量。

  ·进程: 对于多进程并行,现在应用最多的就是基于网络的分布式系统

  4.是不是只要并行, 就可以提高系统性能

  ·提升性能的情况: 合理的把复杂任务进行拆解, 需要考虑拆解后的并行子任务的个数和机器处理核的个数关系, 以及每个子任务处理的时间, 对之上的数据进行平衡处理。提升比较明显的是那种处理的数据量很大,或者要执行的数据处理任务繁重,并且这些任务本身就可以分解为互不相关的子任务时,使用并行计算是合适的。

  ·降低性能的情况: 如果在一个单核的机器上跑多线程并行的程序,性能的提升是非常有限的,有时可能会降低性能。因为多个线程在争抢一个CPU资源, 并且线程的开启,初始化以及销毁都有不小的性能消耗。但从最近几年的计算机硬件发展来看, 已经开始了多核趋势, 现在随便买个机器都是2核4核, 而主频的提升已经非常缓慢(硬件发展限制)。 所以最近几年并行计算火了起来, 并行可以最大限度的应用计算机资源。

  5.并行的问题

  ·开发复杂性增高:这是一定的了,需要考虑子任务的协调,以及彼此间的通信,而且还要基于机器性能考虑开线程个数

  ·死锁:有并行,就必然存在死锁的可能

  ·利用代码覆盖很难测试出系统隐藏的bug

  ·调试困难:尽管VS2010增加了对多线程调试的支持,但调试还是有一定的难度,常常会看的眼花缭乱。

  6.NET 4.0 Parallel Framework

  我们知道微软在.NET 4.0里加入了对并行计算的支持, 引入了一些类库可以让开发人员更快更稳定的编写出并行代码。 下面简单介绍一下.NET 4.0 里对并行计算的支持:

  云都来了,并行计算还远吗?

  ·TPL: 以前开发并行程序, 开发人员通常会直接操作Thread, 并且利用lock机制和信号量机制。这种开发方式使程序变得复杂难懂。 TPL 是把开发人员从对Thread的关注提升到Task级别, 这样开发人员不需要过分关注线程的创建以及同步问题。也不需要手动进行多线程之间的调度, 以及线程数量等的管理, TPL会把一切在底层完成

  ·Scheduler: 任务调度器, 负责任务的调度\启动\停止\暂停, 它是parallel framework 的核心

  ·Thread Pool: 4.0对threadPool作了很大的改进,并且和任务调度器进行了集成

  ·PLINQ: 让查询操作可以并行执行, 目前版本只支持linq to object

  ·Parallel.For\Parallel.Foreach: 可以非常简单的把for 或foreach 子句里的代码并行起来

  总之,多线程并行计算绝对是有美好的前景的!