并行排序算法

并行排序算法

 Author:Eaglet

     今天早晨看到 蛙蛙池塘 的这篇博客  谁能把这个程序的性能提升一倍?---并行排序算法 。促使我写了一个并行排序算法,这个排序算法充分利用多核CPU进行并行计算,从而提高排序的效率。

      先简单说一下蛙蛙池塘 给的A,B,C 三种算法(见上面引用的那篇博客),A算法将耗时的平方和开平方计算放到比较函数中,导致Array.Sort 时,每次亮亮比较都要执行平方和开平方计算,其平均算法复杂度为 O(nlog2n) 。 而B 将平方和开平方计算提取出来,算法复杂度降低到 O(n) ,这也就是为什么B比A效率要高很多的缘故。C 和 B 相比,将平方函数替换成了 x*x ,由于少了远程函数调用和Pow函数本身的开销,效率有提高了不少。我在C的基础上编写了D算法,D算法采用并行计算技术,在我的双核笔记本电脑上数据量 比较大的情况下,其排序效率较C要提高30%左右。

      下面重点介绍这个并行排序算法。算法思路其实很简单,就是将要排序的数组按照处理器数量等分成若干段,然后用和处理器数量等同的线程并行对各个小段进行排 序,排序结束和,再在单一线程中对这若干个已经排序的小段进行归并排序,最后输出完整的排序结果。考虑到和.Net 2.0 兼容,我没有用微软提供的并行库,而是用多线程来实现。

      下面是测试结果:

 

n A B C D
32768 0.7345 0.04122 0.0216 0.0254
65535 1.5464 0.08863 0.05139 0.05149
131072 3.2706 0.1858 0.118 0.108
262144 6.8423 0.4056 0.29586 0.21849
524288 15.0342 0.9689 0.7318 0.4906
1048576 31.6312 1.9978 1.4646 1.074
2097152 66.9134 4.1763 3.0828 2.3095

 

      从测试结果上看,当要排序的数组长度较短时,并行排序的效率甚至还没有不进行并行排序高,这主要是多线程的开销造成的。当数组长度增大到25万以上时,并 行排序的优势开始体现出来,随着数组长度的增长,排序时间最后基本稳定在但线程排序时间的 74% 左右,其中并行排序的消耗大概在50%左右,归并排序的消耗在 14%左右。由此也可以推断,如果在4CPU的机器上,其排序时间最多可以减少到单线程的 14 + 25 = 39%。8 CPU 为 14 + 12.5 = 26.5%

      目前这个算法在归并算法上可能还有提高的余地,如果哪位高手能够进一步提高这个算法,不妨贴出来一起交流交流。

      下面分别给出并行排序和归并排序的代码:

       并行排序类 ParallelSort

       Paralletsort 类是一个通用的泛型,调用起来非常简单,下面给一个简单的int型数组的排序示例:

 

         class  IntComparer : IComparer < int >
        
{
            
IComparer Members
        }


        
public   void  SortInt( int [] array)
        
{
            Sort.ParallelSort
< int >  parallelSort  =   new  Sort.ParallelSort < int > ();
            parallelSort.Sort(array, 
new  IntComparer());
        }

 只要实现一个T类型两两比较的接口,然后调用ParallelSort 的 Sort 方法就可以了,是不是很简单?

下面是 ParallelSort类的代码

using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;
using  System.Threading;

namespace  Sort
{
    
///   <summary>
    
///  ParallelSort
    
///   </summary>
    
///   <typeparam name="T"></typeparam>

     public   class  ParallelSort < T >
    
{
        
enum  Status
        
{
            Idle 
=   0 ,
            Running 
=   1 ,
            Finish 
=   2 ,
        }


        
class  ParallelEntity
        
{
            
public  Status Status;
            
public  T[] Array;
            
public  IComparer < T >  Comparer;

            
public  ParallelEntity(Status status, T[] array, IComparer < T >  comparer)
            
{
                Status 
=  status;
                Array 
=  array;
                Comparer 
=  comparer;
            }

        }


        
private   void  ThreadProc(Object stateInfo)
        
{
            ParallelEntity pe 
=  stateInfo  as  ParallelEntity;

            
lock  (pe)
            
{
                pe.Status 
=  ParallelSort < T > .Status.Running;

                Array.Sort(pe.Array, pe.Comparer);

                pe.Status 
=  ParallelSort < T > .Status.Finish;
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Verilog 并行排序算法是一种在 Verilog 语言中实现的用于对数据进行并行排序的算法。该算法以并行的方式对数据进行排序,提高了排序过程的效率和速度。 在 Verilog 中,可以使用并行排序算法来对数据进行排序,其中最常用的算法是并行插入排序算法。该算法通过将待排序的数据分成多个小部分并在不同的处理单元中进行并行比较和交换,最终合并排序结果。这种并行排序算法的特点是可以充分利用系统中的多个处理单元,从而加快排序速度。 具体实现并行排序算法需要设计具体的硬件模块,在 Verilog 中可以使用模块化的设计风格来构建并行排序模块。首先,需要将待排序的数据拆分成多个子集,并在每个子集中进行局部排序。然后,使用比较器和交换模块对子集进行并行比较和交换操作。最后,使用合并模块将子集中的排序结果合并成最终的排序结果。 在实际应用中,可以将并行排序算法应用于对大规模数据进行排序的场景,如图像处理、数据挖掘和通信等领域。通过并行排序算法,可以提高排序的速度和效率,从而更好地应对大规模数据处理的需求。 总而言之,Verilog 并行排序算法是一种在 Verilog 语言中实现的用于对数据进行并行排序的算法。它可以通过并行处理多个子集中的排序操作来提高排序速度和效率,适用于处理大规模数据的场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值