欢迎来到天天文库
浏览记录
ID:34476569
大小:197.17 KB
页数:5页
时间:2019-03-06
《forkjoin 并行计算框架概览new》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Fork/Join并行计算框架概览应用程序并行计算遇到的问题当硬件处理能力不能按摩尔定律垂直发展的时候,选择了水平发展。多核处理器已广泛应用,未来处理器的核心数将进一步发布,甚至达到上百上千的数量。而现在很多的应用程序在运行在多核心的处理器上并不能得到很好的性能提升,因为应用程序的并发处理能力不强,不能够合理有效地的利用计算资源。线性的计算只能利用n分之一的计算支援。要提高应用程序在多核处理器上的执行效率,只能想办法提高应用程序的本身的并行能力。常规的做法就是使用多线程,让更多的任务同时处理,或者让一部分操作异步执行,这种简单的多线程处理方式在处理器核心数比
2、较少的情况下能够有效地利用处理资源,因为在处理器核心比较少的情况下,让不多的几个任务并行执行即可。但是当处理器核心数发展很大的数目,上百上千的时候,这种按任务的并发处理方法也不能充分利用处理资源,因为一般的应用程序没有那么多的并发处理任务(服务器程序是个例外)。所以,只能考虑把一个任务拆分为多个单元,每个单元分别得执行最后合并每个单元的结果。一个任务的并行拆分,一种方法就是寄希望于硬件平台或者操作系统,但是目前这个领域还没有很好的结果。另一种方案就是还是只有依靠应用程序本身对任务经行拆封执行。Fork/Join框架依靠应用程序本身并行拆封任务,如果使用简单的
3、多线程程序的方法,复杂度必然很大。这就需要一个更好的范式或者工具来代程序员处理这类问题。Java7也意识到了这个问题,才标准库中集成了由DougLea开发的Fork/Join并行计算框架。通过使用Fork/Join模式,软件开发人员能够方便地利用多核平台的计算能力。尽管还没有做到对软件开发人员完全透明,Fork/Join模式已经极大地简化了编写并发程序的琐碎工作。对于符合Fork/Join模式的应用,软件开发人员不再需要处理各种并行相关事务,例如同步、通信等,以难以调试而闻名的死锁和datarace等错误也就不会出现,提升了思考问题的层次。你可以把Fork/
4、Join模式看作并行版本的DivideandConquer策略,仅仅关注如何划分任务和组合中间结果,将剩下的事情丢给Fork/Join框架。但是Fork/Join并行计算框架,并不是银弹,并不能解决所有应用程序在超多核心处理器上的并发问题。如果一个应用能被分解成多个子任务,并且组合多个子任务的结果就能够获得最终的答案,那么这个应用就适合用Fork/Join模式来解决。其原理如下图。应用程序开发者需要做的就是拆分任务并组合每个子任务的中间结果,而不用再考虑线程和锁的问题。一个简单的例子我们首先看一个简单的Fork/Join的任务定义。Java代码1.publi
5、cclassCalculatorextendsRecursiveTask{2.3.privatestaticfinalintTHRESHOLD=100;4.privateintstart;5.privateintend;6.7.publicCalculator(intstart,intend){8.this.start=start;9.this.end=end;10.}11.12.@Override13.protectedIntegercompute(){14.intsum=0;15.if((start-end)6、.for(inti=start;i7、compute方法中,判断当前的计算范围是否小于一个值,如果是则计算,如果没有,就把任务拆分为连个子任务,并合并连个子任务的中间结果。程序递归的完成了任务拆分和计算。任务定义之后就是执行任务,Fork/Join提供一个和Executor框架的扩展线程池来执行任务。Java代码1.@Test2.publicvoidrun()throwsException{3.ForkJoinPoolforkJoinPool=newForkJoinPool();4.Futureresult=forkJoinPool.submit(newCalculator(08、,10000));5.6.assertEquals(
6、.for(inti=start;i7、compute方法中,判断当前的计算范围是否小于一个值,如果是则计算,如果没有,就把任务拆分为连个子任务,并合并连个子任务的中间结果。程序递归的完成了任务拆分和计算。任务定义之后就是执行任务,Fork/Join提供一个和Executor框架的扩展线程池来执行任务。Java代码1.@Test2.publicvoidrun()throwsException{3.ForkJoinPoolforkJoinPool=newForkJoinPool();4.Futureresult=forkJoinPool.submit(newCalculator(08、,10000));5.6.assertEquals(
7、compute方法中,判断当前的计算范围是否小于一个值,如果是则计算,如果没有,就把任务拆分为连个子任务,并合并连个子任务的中间结果。程序递归的完成了任务拆分和计算。任务定义之后就是执行任务,Fork/Join提供一个和Executor框架的扩展线程池来执行任务。Java代码1.@Test2.publicvoidrun()throwsException{3.ForkJoinPoolforkJoinPool=newForkJoinPool();4.Futureresult=forkJoinPool.submit(newCalculator(0
8、,10000));5.6.assertEquals(
此文档下载收益归作者所有