.Net并行计算之数据并行的详解

  次阅读 作者:智能小宝 来源:互联网 2016-01-26 10:55 我要评论(0)

这篇文章主要介绍了.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) =>

本站文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

网友点评网友点评
阅读推荐阅读推荐

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...