.Net并行编程系列之一:并行基础

如今普通PC平台上面多核处理器的普及,让咱们领教了可以利用多核进行并行计算的软件的处理能力,同时继承更多地核心正是当前处理器发展的趋势。html

可是做为一个.NET开发人员,是否有时候会发现你的程序占用了其中一个核心的大部分运行时间,甚至达到了100%,除了继续优化处理问题的算法。算法

那么还有方法可以利用CPU的其它核心为你的应用程序所用么?答案是显然能够的。编程

你所要作的,就是把应用程序的任务分割成块,使各块在同一时间运行。并发

.Net 4.0引入了一种新的编程模型,结合VS2010使得开发并行应用程序变得更加容易。.Net4.0提供了任务并行库(TPL)与并行语言查询集合(PLINQ)。VS2010提供了调试并行程序的工具和分析工具。函数

 把现行的程序任务改编成能够并行运行的任务须要如下几个步骤:工具

1.分解:了解任务,选择合适的粒度把任务拆分红离散的单元方法(函数)性能

2.协调:选择协调这些并行任务的方法(数据流或者控制流)优化

3.可扩展共享:任务间共享数据的设计(例如经过阻塞并发线程实现数据同步,锁,比较并交换,信号灯等),记住,无论是什么同步设计都必然产生顺序的形式,都会对性能效率产生负面影响。spa

并发与并行的区别:线程

并发的目的是防止线程饥饿,强调的是每一个线程都能有本身的时间片来运行,减小相应的时延。

并行解决的问题是关于吞吐量的,是一种优化手段,目的是为了充分利用多核处理器。

既然并行能够利用多核处理器的威力,那么当内核数目增长时,咱们的应用程序加速是否能够随着利用的内核数目增长而成线性增加呢?

答案是否认的,除非须要处理的任务没有顺序执行部分。

例如: 假设一个任务分为两部分:不能被并行化的部分a,能够并行化的部分b。

当任务在单核处理器上面顺序执行时,分别须要的时间为 Ta,Tb,记Ta+Tb=S

若是把任务放到n核心处理器上面运行,则理论的运行时间应该是〉=Ta+(Tb/n)

则获得加速比 r〈=[S/(Ta+Tb/n)]=[S/(Ta+(S-Ta)/n)]=1/[Ta/S+(1-Ta/S)/n]

当n无限增大时 r的极限为r〈=S/Ta

因此加速比的极限为S/Ta。

此定律为阿姆达尔定律,它为咱们的并行计算指明了能够改进的方向,尽可能减小顺序部分占全部时间的比例。而且若是任务的顺序部分比例很大的时候,即便把可并行部分转换为并行执行,也是意义不大的。 

完毕。

做者:Andy Zeng

欢迎任何形式的转载,但请务必注明出处。

http://www.cnblogs.com/andyzeng/p/3704333.html

相关文章
相关标签/搜索