我正在尝试使用Java中的并行化算法。我从合并排序开始,并在question中发布我的尝试。我的修改尝试在下面的代码中,我现在尝试并行快速排序。Java:通过多线程并行化快速排序
在我的多线程实现或解决此问题的方法中是否存在任何菜鸟错误?如果不是,我认为在双核心上的顺序算法和并行算法之间的速度增加不应超过32%(见底部的时序)?
这里是多线程算法:
public class ThreadedQuick extends Thread
{
final int MAX_THREADS = Runtime.getRuntime().availableProcessors();
CountDownLatch doneSignal;
static int num_threads = 1;
int[] my_array;
int start, end;
public ThreadedQuick(CountDownLatch doneSignal, int[] array, int start, int end) {
this.my_array = array;
this.start = start;
this.end = end;
this.doneSignal = doneSignal;
}
public static void reset() {
num_threads = 1;
}
public void run() {
quicksort(my_array, start, end);
doneSignal.countDown();
num_threads--;
}
public void quicksort(int[] array, int start, int end) {
int len = end-start+1;
if (len <= 1)
return;
int pivot_index = medianOfThree(array, start, end);
int pivotValue = array[pivot_index];
swap(array, pivot_index, end);
int storeIndex = start;
for (int i = start; i < end; i++) {
if (array[i] <= pivotValue) {
swap(array, i, storeIndex);
storeIndex++;
}
}
swap(array, storeIndex, end);
if (num_threads < MAX_THREADS) {
num_threads++;
CountDownLatch completionSignal = new CountDownLatch(1);
new ThreadedQuick(completionSignal, array, start, storeIndex - 1).start();
quicksort(array, storeIndex + 1, end);
try {
completionSignal.await(1000, TimeUnit.SECONDS);
} catch(Exception ex) {
ex.printStackTrace();
}
} else {
quicksort(array, start, storeIndex - 1);
quicksort(array, storeIndex + 1, end);
}
}
}
这是我如何开始它关闭:
ThreadedQuick.reset();
CountDownLatch completionSignal = new CountDownLatch(1);
new ThreadedQuick(completionSignal, array, 0, array.length-1).start();
try {
completionSignal.await(1000, TimeUnit.SECONDS);
} catch(Exception ex){
ex.printStackTrace();
}
我测试了这对Arrays.sort和类似的连续快速排序算法。下面是在Intel决斗核戴尔笔记本电脑的计时结果,在秒:
元素:500,000, 顺序:0.068592, 螺纹:0.046871, Arrays.sort:0.079677
元素:1,000,000, 顺序:0.14416, 螺纹:0.095492, Arrays.sort:0.167155
元素:2000000, 顺序:0.301666, 螺纹:0.205719, Arrays.sort:0.350982
元素:4000000, 顺序:0.623291, 螺纹:0.424119, Arrays.sort:0.712698
元素:8000000, 顺序:1.279374, 螺纹:0.859363, Arrays.sort:1.487671
上面的每个数字是100次测试的平均时间,抛出了3个最低和3个最高的情况。我使用Random.nextInt(Integer.MAX_VALUE)为每个测试生成一个数组,每10次测试使用相同的种子初始化一次。每个测试包括使用System.nanoTime对给定算法进行计时。平均之后,我四舍五入到小数点后六位。显然,我确实检查了每种是否工作。如你所见,在每一组测试中,序列和线程的情况之间的速度增加约32%。正如我上面所问,我不应该期望更多吗?
你的问题是什么? – 2011-08-12 11:21:23
你在说什么语言?你想知道如何在Java或C#排序# – 2011-08-12 11:26:07
所以问题是如何在Java中实现这种语法和优化线程与CPU的工作。 – 2011-08-12 11:28:51