手机版

谈中的数据并行 网络并行计算

时间:2021-11-12 来源:互联网 编辑:宝哥软件园 浏览:

从第一台计算机问世到现在,计算机硬件技术取得了长足的进步。无论是个人电脑还是公司服务器。双核、四核和八核CPU非常常见。这样,我们可以将程序分配给多个计算机CPU进行计算。在过去,并行化需要线程的低级操作,这是非常困难的。中增强了对并行化的支持。net4.0,这使得它非常简单。这一次我将谈以下几点。NET并行性从以下几个方面进行了阐述:1 .数据并行性;2.任务并行性;3.平行临朐;4.任务工厂;5.注意事项这次我主要讲讲数据并行的废话。下面的数据并行实际上是指将原始集合或数组中的数据进行分区,然后分配给多个CPU或多个线程来执行相同的操作。系统。线程。任务在。net为数据并行性提供支持类。平行。为和平行。foreach非常类似于我们经常使用的for和ForEach。您不需要创建线程队列,也不需要在基本循环中使用锁。这些。net会帮你处理,你只需要关注自己的事业。然后我们来看看Parallel是如何做到的。为和平行。使用ForEach。parallel.for的简单用法复制如下: parallel.for (0,100,I={ do same ting()});上面的例子不是我们经常使用的for循环的影子。假设平行的第三个参数。对于,Actionint类型的委托,无论该委托有多少参数,都是无效的,因此我们如何并行获取返回值。下面的示例将演示如何使用线程局部变量来存储和检索For循环创建的每个单独任务中的状态。通过使用线程本地数据,可以避免将大量访问同步到共享状态的开销。在任务的所有迭代完成之前,您将计算和存储值,而不是在每次迭代时将它们写入共享资源。然后,您可以一次将最终结果写入共享资源,或者将其传递给另一个方法来对Listint求和。我们假设列表的长度是列表长度。复制代码如下:并行。对于long (0,listlength,()=0,(j,loop,include)={ include=lista[j];回归包容;},(x)=互锁。Add(ref sum,x));现实中,我们经常会遇到需要取消周期的情况。例如,你在队列中查找一个数字。那么如何退出平行。为了循环?像for和foreach这样使用Break关键字就足够了吗?答案是否定的,这是因为break构造对循环有效,而并行循环实际上是一种方法,不是循环,那么如何取消呢?请参见下面的示例,按如下方式复制代码:parallel.forlong (0,listlength,()=0,(j,loop,include)={ if(include 20000){ loop . break();}包容=lista[j];回归包容;},(x)=互锁。Add(ref sum,x));一个简单的平行。平行循环。ForEach循环的工作方式与Parallel类似。For循环,它根据系统环境对源集合进行分区,并在多个线程上调度工作。系统中的处理器越多,并行方法运行得越快。对于某些源集合,序列循环可能会更快,这取决于源的大小和正在执行的工作类型。复制代码如下:parallel.foreach (lista,I={ dosameting();});我不知道你是否在这个地方看到过foreach的影子。实际上,上述示例中ForEach方法的最后一个输入参数是Actionint委托,当所有循环完成时,该方法将调用该委托。这个地方和以前的平行相同

那么,我们如何得到这个返回值与上面的For非常相似。我还是以上面的数组之和为例复制代码如下:parallel.foreach int,long (lista,()=0,(j,loop,include)={ if(include 20000){ loop . break();}包容=lista[j];回归包容;},(x)=互锁。Add(ref sum,x));平行。对于和对于性能测试对比我们在这里生成了1000万个随机数作为例子进行性能对比,结果在作者的笔记本里如下(结果在你的电脑上可能不一样)

附上相关的代码给大家参考复制代码代码如下: int list length=10000000 listit listask=new Listint();Listint list=new Listint();秒表手表1=秒表StartNew();平行。对于(0,listLength,I={ Random r=new Random(100));列表任务.添加(下一个());});控制台WriteLine(“”并行耗时:' watch1 .elapsedmirisseconds秒);秒表手表2=秒表StartNew();for(int I=0;我列出了长度;I){ Random r=new Random(100);名单。添加(下一个());}控制台WriteLine(“”非并行耗时:' watch2 .elapsedmirisseconds秒);

版权声明:谈中的数据并行 网络并行计算是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。