首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Java 理论与实践: 施用 fork-join 框架1

2012-12-18 
Java 理论与实践: 应用 fork-join 框架1阙值 500k阙值 50k阙值 5k阙值 500阙值 -50Pentium-4 HT

Java 理论与实践: 应用 fork-join 框架1


阙值 = 500k阙值 = 50k阙值 = 5k阙值 = 500阙值 = -50Pentium-4 HT(2 个线程)1.01.071.02.82.2Dual-Xeon HT(4 个线程).883.023.22.22.438-way Opteron(8 个线程)1.05.295.734.532.038-core Niagara(32 个线程).9810.4617.2115.346.49

结果很令人振奋,因为它们在选择各种参数时显示了不错的加速比。因此,只要避免为问题和底层硬件选择完全不合理的参数,就会获得不错的结果。使用 chip-multithreading 技术,最优的加速比不太明显;像 Hyperthreading 这样的 CMT 方法所提供的性能要低于等价数量的实际内核提供的性能,但是性能损失取决于许多因素,包括正在执行的代码的缓存丢失率(miss rate)。

此处选择的顺序阙值范围从 500K(数组的大小,表示没有并行性)到 50。在这个例子中,阙值为 50 实在太小,有些不切实际,而且结果显示,顺序阙值太低时,fork-join 任务管理开销将起决定作用。但是表 1 也显示只要避免这种不切实际的过高和过低的参数,就会获得不错的结果。选择?Runtime.availableProcessors()?作为工作线程的数量通常会获得与理想结果相近的结果,因为在 fork-join 池中执行的任务都是和 CPU 绑定的,但是,只要避免设置过大或过小的池,这个参数对结果就不会有太大影响。

MaxWithFJ?类中不需要显式同步。它操作的数据对于问题的生命周期来说是不变的,并且?ForkJoinExecutor?中有足够的内部同步可以保证问题数据对于子任务的可视性,也可以保证子任务结果对于跟它们结合的任务的可视性。

结束语

fork-join 方法提供了一种表示可并行化算法的简单方式,而不用提前了解目标系统将提供多大程度的并行性。所有的排序、搜索和数字算法都可以进行并行分解(以后,像?Arrays.sort()?这样的标准库机制将会使用 fork-join 框架,允许应用程序免费享有并行分解的益处)。随着处理器数量的增长,我们将需要在程序内部使用更多的并行性,以有效利用这些处理器;对计算密集型操作(比如排序)进行并行分解,使程序能够更容易利用未来的硬件。

热点排行