摘要:沿用微软的写法,System.Threading.Tasks.::.Parallel类,提供对并行循环和区域的支持。 我们会用到的方法有For,ForEach,Invoke。 一、简单使用 首先我们初始化一个List用于循环,这里我们循环10次。(后面的代码都会按这个标准进行循环) Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->Program.Data = new List<int>(); for (int i = 0; i &
阅读全文
07 2011 档案
摘要:19.4.3 深入探索PLINQ 前面的章节已经对PLINQ编程做了介绍,本节我们来探讨一下PLINQ背后的运作机理,以便更好地使用PLINQ。1 “自适应”的运行模式 如果代码中使用AsParallel()扩展方法将LINQ查询转换为PLINQ,在程序运行时,TPL会自动分析此查询能否并行执行,如果可以,再考虑这种并行执行能否获得性能的提升,否则,仍然采用串行执行方式。这就是说: PLINQ查询并不一定以并行方式执行。 虽然PLINQ的设计者已经对很多种典型的场景进行了分析并且选择了相应的PLINQ查询运行模式,但不可能让PLINQ默认的方案适用于所有的场景,因此,如果你确信在任何情况下你的
阅读全文
摘要:3自定义的聚合函数 所谓“聚合函数(Aggregate Function)”,其实就是对数据集合进行某种处理后得到的单一结果,比如统计一批数值型数据的平均值、最大值、最小值等。在PLINQ中,我们可以使用ParallelEnumerable类的扩展方法Aggregate()自定义一个聚合函数。 ParallelEnumerable. Aggregate()有好几个重载形式,我们来看一个最复杂的:public static TResult Aggregate<TSource, TAccumulate, TResult>( this ParallelQuery<TSource&g
阅读全文
摘要:19.3.9 处理并行计算中的异常 在这一小节中,我们来探讨一下如何并行计算中的异常捕获与处理问题。1 处理并行循环中的异常 在一个顺序执行的循环中,如果发生了一个异常,那么.NET的异常处理机制将会中止这个循环: for(int i=0;i<1000000;i++) { //串行代码:如果在此处发生异常,将导致循环的提前中止。 } 并行程序通常使用数据分区的手段,让多个线程并行执行同一个大循环的不同部分(比如将上述大循环份为4部分,用4个线程并行执行),这样一来,情况就变得复杂了。 想象一下,假设在执行并行循环过程中,其中的一个线程发生了异常而终止,那么从理论上说,这意味着整个“大循环
阅读全文
摘要:19.1 让查询执行得更快——Parallel LINQ LINQ的出现对于.NET平台而言是一件大事,它使用一种统一的模式查询数据,并且可以紧密地与具体编程语言直接集成。LINQ语句的编写方式是“动态组合”和“递归”的,这与函数式编程语言(如F#)类似,这种编写方式的优点在于代码量小,通过动态组合一些典型的查询运算符,可以实现相当复杂的数据处理逻辑,而同样的功能如果采用传统的编码方式实现,将耗费不少的力气写代码。 .NET 4.0引入的PLINQ是LINQ的“升级换代”技术,它允许以并行方式执行LINQ查询。 使用PLINQ技术的最大好处之一是当计算机处理器个数增加时,不需要修改(或仅需少量
阅读全文
摘要:19.3.6 同步多个任务 在并行计算应用程序中,通常会创建多个Task对象以执行不同的工作任务,而依据具体应用场景,这些工作任务对象之间又会有着相互协作的需求,比如可能要求某个工作任务完成以后自动启动一个或多个新的Task对象执行后继处理工作,或者某个正在执行的工作任务中途需要等待另一个工作任务执行完毕才能执行,这就是任务的同步问题。 Task类提供了ContinueWith和Wait系列方法,在“任务”的层次(而不是线程的层次)实现任务的同步。1 使用ContinueWith 例如,以下代码在task1完成之后自动运行task2:Task task1=new Task(()=> {
阅读全文
摘要:19.3.8 任务的取消 TPL提供了多个方式取消一个任务。1 调用Task.Cancel方法直接取消任务的执行 如果要取消一个正在运行的任务,可以调用Task.Cancel方法,此方法会设置Task对象的IsCancellationRequested属性等于true。在任务函数中,通过检查此属性值就可以知道是否需要取消操作。其代码框架如下: //需要执行的任务函数 Action taskFunction = delegate() { //...代码略 if (Task.Current.IsCancellationRequested) { //处理外界的取消请求…… //设置Task的状态为I
阅读全文
摘要:19.3.4任务并行库原理初探 在上一小节中,我们看到只需简单地调用Parallel类中的一些静态方法,就可以让代码并行执行。您一定会对任务并行库的强大功能有了很深的印象,一些喜欢刨根问底的读者可能会问: 任务并行库怎样实现代码的并行执行? 任务并行库的底层技术细节很复杂,要介绍它超出了本书的范畴,然而,对其工作原理作一个介绍是可能的,了解这些知识,对于开发并行程序而言是很有益的。1 并行指令的生成 软件工程师使用Paralllel类编写的并行算法,经过编译器的处理,会全部转换为对Task类相应方法和属性的调用指令,这些指令被保存到编译好的程序集中。 Task类的实例代表一个可以被并行执行的任
阅读全文
摘要:19.3.3 使用Parallel类——让一切并行起来 在TPL中,最容易使用的类是Parallel,此类提供了三个方法“群”用于实现三种常用的并行程序执行结构。1使用Parallel.Invoke并行执行任务 当我们有一系列相互独立的工作需要并行执行时,最简单的方法是使用TPL的Parallel类的Invoke()方法来并行执行它们。 例如,假设以下三个方法调用语句之间是相互独立的[1],则它们可以并行执行:StatementA();StatementB();StatementC(); 使用Parrallel.Invoke()方法可以让它们并行执行:Parallel.Invoke( () =
阅读全文
摘要:3 使用任务并行库实现并行处理 上面介绍了基于线程编码实现并行处理的技术要点,可以看到还是比较繁琐的。但通过使用.NET 4.0的并行库,可以简化开发工作。我们略微详细一点地介绍一下示例程序中是如何使用任务并行库实现并行计算的。 其中的一个关键函数是ForRange()函数,先来看看它的声明: public static ParallelLoopResult ForRange( int fromInclusive, int toExclusive, Action<int, int> body) { //…代码略 } 前两个参数代表要计算的数据在数组中的起始和结束索引,第3个参数是一
阅读全文
摘要:19.1让一切“并行”——任务并行库原理及应用19.3.1 任务并行库简介 任务并行库(TPL:Task Parallel Library)是.NET 4.0为帮助软件工程师开发并行程序而提供的一组类,位于System.Threading和System.Threading.Tasks这两个命名空间中,驻留在3个.NET核心程序集mscorlib.dll、System.dll和 System.Core.dll里。使用这些类,可以让软件工程师在开发并行程序时,将精力更关注于问题本身,而不是诸如线程的创建、取消和同步等繁琐的技术细节。 使用TPL开发并行程序,考虑的着眼点是“任务(task)”而非“
阅读全文
摘要:在前面两讲中,基本上介绍完了并行计算基础理论与相关概念,学习不是目的,应用才是。因此,本讲将介绍一个并行计算的例子,并对.NET 4.0的并行扩展作一个总体的介绍。======================================================19.1.3 并行计算所带来的挑战 与串行执行的程序相比,开发并行程序需要软件工程师具备一个“多线程”的大脑。我们先来看一个引例,初步体会一下如何使用.NET 4.0所提供的任务并行库设计并行程序。1 并行计算引例 请读者仔细查看一下本节示例程序SequentialvsParalled的源码。此程序完成了一个非常典型的数据处理
阅读全文
摘要:介绍了CPU与“核”以及“并行”和“并发”的区别,这一部分我们将进一步介绍并行计算的性能衡量与并行计算系统的大致分类,为后面介绍.NET 4.0的并行计算打下基础。 ================================3 如何衡量并行计算的性能提升? 之所以要研究并行计算,其目的是获得更好的性能。一个软件系统的性能,通常使用两个指标来进行衡量:(1) 响应速度(Responsiveness):用户向软件系统提交一个工作任务,软件系统要花费多长的时间才能处理完毕并将结果通知用户?(2) 吞吐率(Throughput):在单位时间间隔内软件系统最多可以处理多少个工作任务? 并行计算的优
阅读全文
摘要:开篇语:文件转载与金旭亮文件 地址:http://bitfan.blog.51cto.com/907048/200199这是一个系列文章,系统介绍.NET 4.0中引入的并行扩展(包括任务并行库TPL和PLINQ)开发技术。 本系列文章中所有示例代码在VS2010 BETA1+Windows 7 RC下调试通过。 本系列文章的主要内容来自是本人将在电子工业出版社出版的新作中的一章,出于技术共享与交流目的发布,期望业界对并行计算有丰富经验的工程师指出疏漏,也希望网友提出宝贵建议。 作者金旭亮拥有本系列文章所有版权,未经本人许可,不允许将此序列文章及相关示例用于商业目的,除此之外,在网络上出于知识
阅读全文
浙公网安备 33010602011771号