什么是多线程编程的最佳排序算法?

时间:2011-11-10 10:36:53

标签: performance pthreads parallel-processing sorting

我想对长度为1.000.000到100.000.000的整数数组进行排序。我想在使用pthread库的2Mb高速缓存的core2duo计算机上运行该程序。我想要最快的算法!

我编写了一个使用mergesort算法的半并行排序代码。但它还不够快!

          ___ sort___   
         /           \        
        /____ sort ___\     __ merge __
    ___/               \___/           \___ merge 
       \ ____ sort ____/   \__ merge __/    
        \             /      
         \___ sort __/      

3 个答案:

答案 0 :(得分:2)

我上大学已经有一段时间,但我似乎记得PSRS算法对这类事情有好处。我相信google会显示大量的实现/伪代码。

答案 1 :(得分:0)

Quicksort非常适合多线程。

分区时,分区的一侧在当前线程中排序,另一侧在新线程中排序。

答案 2 :(得分:0)

由于你在core2duo上,我会看一下Parallel Quicksort算法。它就地排序,节省内存,并且可以实现与处理器数量成比例的性能增益,适用于少量处理器。

并行Quicksort算法基本上执行分区步骤,然后在单独的进程中对左右子列表执行快速排序。这可以通过在共享堆栈中存储边界来实现,如果以更大的线程数运行,最终会成为争用点。

还有其他算法,例如PSRS,可以扩展到更高数量的处理器,但是当你使用core2duo时,可能最大限度地减少2个真正的内核+两个超线程内核,PSRS所需的额外内存可能是一种浪费。考虑到您要排序的元素数量,您可能需要节省内存。

我已经在Github上用Java实现了这两个。如果您愿意将代码视为使用pthreads实现某些内容的指南,请告诉我。