Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在多个线程中划分合并排序算法_Java_Multithreading_Algorithm_Sorting_Mergesort - Fatal编程技术网

Java 在多个线程中划分合并排序算法

Java 在多个线程中划分合并排序算法,java,multithreading,algorithm,sorting,mergesort,Java,Multithreading,Algorithm,Sorting,Mergesort,我正计划构建一个在Java中使用多线程的合并排序算法,我环顾了互联网等(例如),但我似乎无法确定我的一些问题的答案 首先,创建的最佳线程数是否与CPU的内核数相同?在考虑线程数量时,我是否应该考虑逻辑内核? 第二,在这种算法中实现多线程的最佳方法是什么?我听说有不止一种方法(比如从“Thread”类继承或使用可运行的实现,等等) 此外,在优化方面,在这种情况下使用ArrayList或LinkedList是更好的选择吗 对于有关实施的任何其他说明/建议,我们深表感谢 干杯。在Java 8中,如果您

我正计划构建一个在Java中使用多线程的合并排序算法,我环顾了互联网等(例如),但我似乎无法确定我的一些问题的答案

首先,创建的最佳线程数是否与CPU的内核数相同?在考虑线程数量时,我是否应该考虑逻辑内核?

第二,在这种算法中实现多线程的最佳方法是什么?我听说有不止一种方法(比如从“Thread”类继承或使用可运行的实现,等等)

此外,在优化方面,在这种情况下使用ArrayList或LinkedList是更好的选择吗

对于有关实施的任何其他说明/建议,我们深表感谢


干杯。

在Java 8中,如果您请求与
并行流的并行性,则流API也会使用
数组.parallelSort()
。如果你是出于教育目的来研究这个问题的话,
parallelSort
的源代码应该是非常有用的

在Java 8中,如果您使用
parallelStream
请求并行,则流API也会使用
Arrays.parallelSort()
。如果你是出于教育目的来研究这个问题的话,
parallelSort
的源代码应该是非常有用的

…创建的最佳线程数是否与CPU的内核数相同

我想是的。合并排序应该是内存带宽受限的,而不是cpu带宽受限的。早期多线程的主要好处是利用每个核心的本地缓存,通常是1级和2级缓存。通常,3级缓存在内核之间共享,因此,与3级缓存的速度相比,如果合并进程相对CPU受限,那么只有这样才能获得收益。一旦运行大小变得足够大,超过缓存限制,那么我不确定多线程是否能带来很多好处

微软的稳定排序首先使用插入排序创建32个元素的排序组,可能是为了利用本地缓存。我不确定这对当前的处理器是否真的有帮助,因为它是基于1994年编写的代码

…创建的最佳线程数是否与CPU的内核数相同

我想是的。合并排序应该是内存带宽受限的,而不是cpu带宽受限的。早期多线程的主要好处是利用每个核心的本地缓存,通常是1级和2级缓存。通常,3级缓存在内核之间共享,因此,与3级缓存的速度相比,如果合并进程相对CPU受限,那么只有这样才能获得收益。一旦运行大小变得足够大,超过缓存限制,那么我不确定多线程是否能带来很多好处


微软的稳定排序首先使用插入排序创建32个元素的排序组,可能是为了利用本地缓存。我不确定这是否真的对当前的处理器有帮助,因为它是基于1994年编写的代码。

如果你想在一台所有线程共享内存的机器上并行排序,我不会期望太多的加速,因为我确信只要你的比较方法不复杂,内存访问是限制因素。我很想听听你们的发现。如果这是一个学习项目,那么就从简单开始。编写一个mergesort,在顶层将数据以N种方式拆分,在单独的线程中排序,然后以对、成对等方式合并N个列表,直到完成。然后用N的值来回答你自己的问题。如果这是一项重要的生产工作,那么请使用Arrays.parallelSort()。这与您在通用实现中所做的一样好。我同意@MrSmith42的说法,除非比较是计算范围的,否则你不会看到巨大的加速,但我观察到一个因子是1.5排序整数。@MrSmith42我发现这个因子可以比较不同处理器的排序速度,如果有人感兴趣的话。这是一个教育项目。这不是我将在更大的项目中实施的东西。谢谢你。这就是我计划做的:)这是一个学习项目,没什么大不了的。对于并行实现来说,这似乎是一个奇怪的算法选择。合并排序在连接端完成所有工作,也就是说,将工作拆分为较小的块本身不起任何作用,它只生成较小的块。将所有这些放回一起的部分是工作发生的地方,我怀疑这会从并发性中受益。你能使用不同的排序算法吗?在叉子一侧工作的人?也许是快速排序?@ErickG.Hagstrom您不必在mergesort中的每个拆分上生成线程-4个线程mergesorting很容易比1个线程mergesorting快-这仍然是4个线程在进行合并。这是一种最简单的排序算法,可以并行化,并且对赋值有意义。如果你想在一台所有线程共享内存的机器上并行排序,我就不会期望太多的加速,因为我相信只要你的比较方法不太复杂,内存访问就是一个限制因素。我很想听听你们的发现。如果这是一个学习项目,那么就从简单开始。编写一个mergesort,在顶层将数据以N种方式拆分,在单独的线程中排序,然后以对、成对等方式合并N个列表,直到完成。然后用N的值来回答你自己的问题。如果这是一项重要的生产工作,那么请使用Arrays.parallelSort()。这与您在通用实现中所做的一样好。我同意@MrSmith42的说法,除非比较是计算范围的,否则你不会看到巨大的加速,但我观察到一个因子是1.5排序整数。@MrSmith42我发现这个因子