CLR40,VS2010中的并行化.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
CLR40,VS2010中的并行化

CLR4.0, VS2010中的并行化 2010-05-03 Visual Studio 2010是一个大版本。相对于05到08的修正性改动,VS2010和VS2008之间的差异很大。主要的差异在两个方面:“结构化并行”和“动态语言”。我比较关心的是并行,所以简单的浏览了这方面的改进,和大家分享。 通过CLR 2.0也能够运行多线程程序。也同样可以发挥多核CPU的性能。但是CLR4.0给我们带来的概念是结构化并行。什么叫“结构化并行”?参考“结构化程序”这个概念。在“结构化程序”出现之前,程序员使用goto编写各种各样的复杂程序。随着for,while等流程控制关键字,函数,类继承,泛型等结构化概念的逐步提出和完善。在串行程序领域基本实现了“结构化”。同理结构化并行就是通过一组标准的方法编写并行程序。减少并行程序的维护成本。 CLR 4.0除了在概念上支持了结构化并行,还提供了并行数据结构,轻量级同步等方面提供了新功能。VS2010在调试,测试环节也加入了并行程序的支持。 结构化并行 结构化并行,是一种让程序员更关注并行计算本身,而不是技术层面的并行计算设计思想。在结构化并行中内看不到任何Thread或者ThreadPool字样。各种针对线程的操作都被编译器和TPL(Task Parallel Library)封装。使用TPL之后,程序看起来就是 Parallel.For, 传统for循环的并行版本 Parallel.ForEach, 传统foreach循环的并行版本 Parallel.Inovke, 传统Inovke的并行版本 没有必要粘贴Parallel.X使用示范,从书写角度看,他们和过去串行代码非常类似。只不过集合中的每个元素并不是被顺序处理,而是被并行处理。如果仅仅是Parallel.X系列,显然不能形成结构化并行体系。另外还有2个特性需要说明 并行异常:Parallel计算过程中,尤其是基于数据分割计算的并行计算中。他们每个执行线程执行的代码都是相似的。如果继续沿用传统的异常机制。那么线程概念势必还会出现在结构化并行中,让程序员纠缠在技术细节。CLR4.0提出了AggregateException概念。用于Parallel.X内出现的异常行为。异常被汇总呈现,忽略了线程细节。线程只是手段,并行才是目的。搜索关键字【AggregateException】 执行撤销Cancellation:如果某项操作需要花费很长时间,而用户又不想让计算继续。这时用户很可能点“Cancel”按钮撤销执行。执行撤销并不是一定要CLR4.0才能支持。每个程序员都有自己独特的,千奇百怪的执行撤销方法。CLR4.0提供了统一的方法实现执行撤销。不论是传统基于Thread的并行程序,还是基于TPL的并行程序,甚至PLINQ都可以完成执行撤销。搜索关键字【CancellationToken】 专为并行设计的数据结构 在 CLR 1.1中,通过对各种集合对象的同步封装,可以得到一个多线程安全的集合对象。但是这种封装非常简陋。它仅仅保证数据正确性,毫无性能可言。CLR 4.0在System.Collections.Concurrent名称空间下提供了若干专为并行设计的数据结构。 并行数据结构 对应的传统数据结构 BlockingCollectionT 带有阻塞的ListT,实现生产者-消费者模式的好东西 ConcurrentBagT LinkedList T ConcurrentDictionaryK,V DictionaryK,V ConcurrentQueueT QueueT ConcurrentStackT StackT 轻量级线程同步手段 旋转等待(SpinWait)和旋转锁(SpinLock) SpinWait/Lock是实现无锁数据结构必备功能。它可以带来比基于内核锁编程更高的吞吐量。 如果没有SpinWait,可以采用Thread.Sleep(1)作为替代实现。SpinWait对应CPU的PAUSE指令。而Thread.Sleep(1)需要涉及CPU,中断控制器,定时器,OS线程调度代码等很多器件。可以认为SpinWait的性能千倍于Thread.Sleep(1)。 如果在Spin loop内不插入SpinWait。让Spin loop成为一个“死循环”。CPU无法知道这个循环的目的,会进行一些大量没有意义预操作,造成CPU更多的能耗损失。有些资料还认为,不仅是能耗损失,不插入SpinWait,在Spin loop退出时,将产生分支预测错误,让CPU 重新填充执行流水线,有些CPU估计会损失大约25个指令周期。 如果没有SpinLock,可以采用Interlocked.CompareExchage加for循环实现Spin

文档评论(0)

zilaiye + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档