浅谈.Net并行计算之数据并行

 这篇文章主要介绍了.Net并行计算之数据并行,有需要的朋友可以参考一下

从第一台计算机问世到现在计算机硬件技术已经有了很大的发展。不管是现在个人使用的PC还是公司使用的服务器。双核,四核,八核的CPU已经非常常见。这样我们可以将我们程序分摊到多个计算机CPU中去计算,在过去并行化需要线程的低级操作,难度很大,在.net4.0中的增强了对并行化的支持,使得这一切变得非常简单 。本次我从以下几个方面大家讲以下.NET 并行
 
1.      数据并行
2.      任务并行
3.      并行Linq
4.      任务工厂
5.      注意事项
     
 
  本次主要给大家讲一下数据并行 废话不说,下面开始了
 
   数据并行其实就是指对原集合或者数组中的数据进行划区之后分摊到多个CPU或者多个线程执行相同的操作 在 .net中的 System.Threading.Tasks 提供了对数据并行的支持类 , Parallel.For,Parallel.ForEach和我们经常的使用的for 和foreach 十分的相似,你不用创建线程队列,在基本的循环中你不用使用锁。这些.net 会帮你处理,你只需要关注你自己的业务  那下面我们就来看看 Parallel.For 和 Parallel.ForEach 是如何使用的
 
•     Parallel.For 简单使用 
 
 代码如下:
   Parallel.For(0, 100, i => { 
                dosameting()
            });
 
 
上面的例子是不是和我们经常使用的for循环的影子。 说一下 Parallel.For 的第三个参数Action<int>类型的委托 不管这个委托的参数是0个还是多少个他的返回植都是void,那么怎么样才能获取到Parallel.For 中的的返回值了,下面的例子将演示如何使用线程本地变量来存储和检索由 for 循环创建的每个单独任务中的状态  通过使用线程本地数据,您可以避免将大量的访问同步为共享状态的开销。  在任务的所有迭代完成之前,您将计算和存储值,而不是写入每个迭代上的共享资源。  然后,您可以将最终结果一次性写入共享资源,或将其传递到另一个方法
 
•对个list<int> 进行求和我们这里假设List的长度为listLength 
 
 代码如下:
   Parallel.For<long>(0, listLength, () => 0, (j, loop, subsum) =>
            {
                subsum += lista[j];
                return subsum;
 
            }, (x) => Interlocked.Add(ref sum, x));
 
 
 
•在现实中我们也经常会遇到需要取消循环的情况。比如你在队列中查找一个数。那么如何退出Parallel.For 循环了。是不是也是和for 和foreach那样 使用Break关键字就可以了,答案否定的。这是因为break 构造对循环是有效的,而并行循环其实是一个方法,并不是循环 那么要怎么样取消了。请看下面的例子
 
 代码如下:
Parallel.For<long>(0, listLength, () => 0, (j, loop, subsum) =>
            {
                if (subsum > 20000)
                {
                    loop.Break();
                }
 
                subsum += lista[j];
                return subsum;
 
            }, (x) => Interlocked.Add(ref sum, x));
 
 
 
• 简单Parallel.ForEach 循环     Parallel.ForEach循环的工作方式类似于 Parallel.For 循环 根据系统环境,对源集合进行分区,并在多个线程上计划工作。  系统中的处理器越多,并行方法的运行速度越快。  对于某些源集合,顺序循环可能更快,具体取决于源的大小和正在执行的工作类型 
 
 代码如下:
   Parallel.ForEach(lista, i => { dosameting(); });
 
 
 不知道大家在这个地方有没有看到foreach的影子。其实上面的例子中的ForEach方法的最后一个输入参数是 Action<int>委托,当所有循环完成时,方法将调用该委托。这个地方和前面的Parallel.For 是一样的。那么我们要如何获得返回值了和上面的For是非常相似,我依然以上面数组求和为例
 
 代码如下:
Parallel.ForEach<int, long>(lista, () => 0, (j, loop, subsum) => 
       { 
           if (subsum > 20000) 
           { 
               loop.Break(); 
           } 
 
           subsum += lista[j]; 
           return subsum; 
 
       }, (x) => Interlocked.Add(ref sum, x)); 
 
 
 
• Parallel.For 和for 性能测试比较 我们这里产生1千万个随机数为例子做个一个性能比较,在笔者的笔记本上结果如下 (可能在你的电脑上得到结果不一定相同)
 

附上相关的代码给大家参考
 
代码如下:
int listLength = 10000000;
            List<int> listTask = new List<int>();
            List<int> list = new List<int>();
            Stopwatch watch1 = Stopwatch.StartNew();
 
            Parallel.For(0, listLength, i => {
                Random r = new Random(100);
                listTask.Add(r.Next());
 
            });
            Console.WriteLine("并行耗时:" + watch1.ElapsedMilliseconds );
            
 
        
            Stopwatch watch2 = Stopwatch.StartNew();
 
            for (int i = 0; i < listLength; i++)
            {
                Random r = new Random(100);
                list.Add(r.Next());
            }
 
 
            Console.WriteLine("非并行耗时:" + watch2.ElapsedMilliseconds );
 

时间: 2025-01-30 16:47:51

浅谈.Net并行计算之数据并行的相关文章

浅谈.Net并行计算之数据并行_实用技巧

从第一台计算机问世到现在计算机硬件技术已经有了很大的发展.不管是现在个人使用的PC还是公司使用的服务器.双核,四核,八核的CPU已经非常常见.这样我们可以将我们程序分摊到多个计算机CPU中去计算,在过去并行化需要线程的低级操作,难度很大,在.net4.0中的增强了对并行化的支持,使得这一切变得非常简单 .本次我从以下几个方面大家讲以下.NET 并行 1.      数据并行2.      任务并行3.      并行Linq4.      任务工厂5.      注意事项       本次主要给

福州SEO:浅谈SEO菜鸟与数据分析师的区别

数据分析的作用,对于每一个Seoer是不必说的.数据分析在网站运营.网站优化.网站推广等方面起着支撑整个过程的作用;数据分析也是作为一名Seoer必须掌握的一项技能.那么,何谓数据分析呢?数据分析是指用适当的统计方法对收集来的大量第一手资料和第二手资料进行分析,以求最大化地开发数据资料的功能,发挥数据的作用.数据分析可深可浅,要想做好数据分析,通常要掌握数据分析的六个步骤是:明确分析目的和内容.收集数据.数据处理.数据分析.数据展现.报告撰写. 数据分析师指的是不同行业中,专门从事行业数据搜集.

浅谈PHP中JSON数据操作

  本文的知识点:1.JSON数据格式介绍,2.对数据编码成JSON格式,3.对JSON数据进行解码,并操作,有需要的小伙伴可以参考下. JSON,全称是JavaScript Object Notation.它是基于JavaScript编程语言ECMA-262 3rd Edition-December 1999标准的一种轻量级的数据交换格式,主要用于跟服务器进行交换数据.跟XML相类似,它独立语言,在跨平台数据传输上有很大的优势 新建文件json.php,先做encode操作: ? 1 2 3

浅谈PHP接收POST数据方式

  本文给大家简单介绍了下php接收post数据的3种方式,并附上了一则简单的示例,有需要的小伙伴可以参考下 通常情况下用户使用浏览器网页表单向服务器post提交数据,我们使用PHP接收用户POST到服务器的数据,并进行适当的处理.但有些情况下,如用户使用客户端软件向服务端php程序发送post数据,而不能用$_POST来识别,那又该如何处理呢? $_POST方式接收数据 $_POST方式是通过 HTTP POST 方法传递的变量组成的数组,是自动全局变量.如使用$_POST['name']就可

浅谈PHP中JSON数据操作_php技巧

JSON,全称是JavaScript Object Notation.它是基于JavaScript编程语言ECMA-262 3rd Edition-December 1999标准的一种轻量级的数据交换格式,主要用于跟服务器进行交换数据.跟XML相类似,它独立语言,在跨平台数据传输上有很大的优势 新建文件json.php,先做encode操作: //encode //生成JSON格式数据 $arr = array(1,2,3,4,5,6,7,8,9,'Hello','PHP'); echo jso

浅谈如何从统计数据中分析出关键词优化效果

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 在网站优化的世界里,其中的目的就是让关键词在搜索引挚中排名更加的靠前,从而可以从搜索引挚获取更大的流量.自然网络上出现的SEO行业就是为了这个而生的.众所周知,国内大部分的SEO优化其实主要是针对百度这个搜索引挚的,那么对于分析关键词的优化效果如何其中最简单的方法就是借助统计工具,通过整理.分析一些相关的统计数据可以让咱们更准确的掌握住关键词

浅谈JS中json数据的处理_javascript技巧

1. json数据结构(对象和数组) json对象:var obj = {"name":"xiao","age":12}; json数组:var objArray = [{"name":"xiao","age":12},{"name":"xiao","age":12}]; 2. 处理json数据,依赖文件有:jQuery.js

浅谈营销中的数据互动

互联网的飞速发展使营销理念从传统的"媒体导向"向"用户导向"过渡.如今,营销不再是单纯往知名度高.浏览量大的媒体投放广告, 而是通过把握潜在用户的特征.规律和属性进行有效推广.在这个背景下,大数据技术的发展提供新的数据分析与挖掘思路,为营销带来增值点.人类社会活动都可以在不同程度上进行数据化,产生数据可分为三个层面:个人.群体.以及二者间的联系.这第三层联系衍生出数据的互动性.个人与群体数据的互动,不仅为商家提供多角度营销策略,还可使客户由传统的被动接受者,转变为能

浅谈云计算推动下数据中心的发展趋势

在http://www.aliyun.com/zixun/aggregation/13422.html">云计算技术趋势下,数据中心的发展,其中一点就是IT设备的小型化,所有设备都将进入机架,机架成为机房IT设备的主题.数据中心建设具有更合理的可用性设计,更高的实用性.先进性.灵活性和可扩展性,设备也更加标准化.除此之外,数据中心加强了对数据保存环境的重视,对机房建设进行了更加严格的监测和监督.随着IT设备的发展,机房一体化理念成为未来机房的发展趋势. 模块化数据中心MDC带来了全新的可管