我想对长度为1.000.000到100.000.000的整数数组进行排序。我想在使用pthread库的2Mb高速缓存的core2duo计算机上运行该程序。我想要最快的算法!
我编写了一个使用mergesort算法的半并行排序代码。但它还不够快!
___ sort___
/ \
/____ sort ___\ __ merge __
___/ \___/ \___ merge
\ ____ sort ____/ \__ merge __/
\ /
\___ sort __/
答案 0 :(得分:2)
我上大学已经有一段时间,但我似乎记得PSRS
算法对这类事情有好处。我相信google会显示大量的实现/伪代码。
答案 1 :(得分:0)
Quicksort非常适合多线程。
分区时,分区的一侧在当前线程中排序,另一侧在新线程中排序。
答案 2 :(得分:0)
由于你在core2duo上,我会看一下Parallel Quicksort算法。它就地排序,节省内存,并且可以实现与处理器数量成比例的性能增益,适用于少量处理器。
并行Quicksort算法基本上执行分区步骤,然后在单独的进程中对左右子列表执行快速排序。这可以通过在共享堆栈中存储边界来实现,如果以更大的线程数运行,最终会成为争用点。
还有其他算法,例如PSRS,可以扩展到更高数量的处理器,但是当你使用core2duo时,可能最大限度地减少2个真正的内核+两个超线程内核,PSRS所需的额外内存可能是一种浪费。考虑到您要排序的元素数量,您可能需要节省内存。
我已经在Github上用Java实现了这两个。如果您愿意将代码视为使用pthreads实现某些内容的指南,请告诉我。