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

Performance 什么';多线程编程的最佳排序算法是什么?,performance,pthreads,parallel-processing,sorting,Performance,Pthreads,Parallel Processing,Sorting,我想对长度为1.000.000到100.000.000的整数数组进行排序。我想使用pthread库在具有2Mb缓存的core2duo计算机上运行此程序。我想要最快的算法 我已经编写了一个使用mergesort算法的半并行排序代码。但它还不够快 ___ sort___ / \ /____ sort ___\ __ merge __ ___/ \___/

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

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

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

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

Quicksort非常适合多线程处理


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

由于您使用的是core2duo,我将介绍一种并行快速排序算法。它可以就地排序,节省内存,并且可以实现与处理器数量成比例的性能增益,最多可用于少量处理器

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

还有其他一些算法,比如PSR,可以扩展到更高数量的处理器,但由于您使用的是core2duo,这可能会使您最多使用2个真核+两个超线程核,因此PSR所需的额外内存可能是一种浪费。考虑到要排序的元素数量,可能需要节省内存


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

您尝试了什么?什么不起作用?向我们展示一个您遇到问题的代码段。我已经编写了使用合并排序算法的半并行排序代码。如果您发现它没有更快,那么您可能会发现您的机器有多个内核,但只有一个内存总线。这是真正的瓶颈。它使用共享内存,但我认为每个内核都可以独立访问内存。我也在一个4Mb缓存的i5上测试了它,在性能上也得到了相同的结果!我不确定,但我认为最后一个非并行的合并排序会显著降低速度。