`
bjxagu
  • 浏览: 165907 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

用Parallel_For进行并行快速排序

阅读更多

注:本文主要内容摘自笔者所著的《多核计算与程序设计》一书,略有修改,后续还会继续发布系列文章,如有需要,可以考虑将一下地址加入到您的浏览器收藏夹中:http://software.intel.com/zh-cn/blogs/category/multicore/

 

上一篇文章 用动态任务调度器实现Parallel_For 中,实现了Parallel_For()功能, Parallel_For()可以实现许多的并行区间处理功能,下面以并行快速排序为例来讲解如何使用Parallel_For()的功能。

要用Parallel_For()来进行并行快速排序,需要先继承CRange类来实现一个CQuickSortRange类,然后就可以将CQuickSortRange类的实例作为参数传给Parallel_For()进行并行快速排序。

CQuickSortRange类的定义如下:

template <class T>

class CQuickSortRange : public CRange {

private:

    T * m_pData;

    int  m_nBegin;

    int  m_nEnd;

public:

    CQuickSortRange(T *pDataArray, int nBegin, int nEnd);

    virtual CRange * Split();

};

 

CQuickSortRange类中,主要需要实现Split()功能。考虑到效率,当区间小于一定值时就用串行的快速排序来对区间进行排序,否则将区间拆分成两个更小的区间。

Split()的代码实现如下:

#define MIN_QUICKSORT_SIZE      512

 

template <class T>

CRange * CQuickSortRange<T>::Split()

{

    if ( m_nEnd - m_nBegin <= MIN_QUICKSORT_SIZE )

    {

        QuickSort(m_pData, m_nBegin, m_nEnd);

        return NULL;

    }

 

    int nMid = QuickSort_Split(m_pData, m_nBegin, m_nEnd);

 

    CQuickSortRange<T> *pRange = new CQuickSortRange<T>(m_pData, nMid+1, m_nEnd);

 

    m_nEnd = nMid - 1;

 

    return pRange;

}

 

Split()功能中,调用了QuickSort()函数和QuickSort_Split()函数,这两个函数的代码如下:

template <class T>

int QuickSort_Split(T *pData, int nBegin, int nEnd)

{

    T SelData;

    int nLow;

    int nHigh;

 

    nLow = nBegin;

    nHigh = nEnd;

 

    SelData = pData[nLow];

    while ( nLow < nHigh )

    {

        while ( (pData[nHigh] > SelData)  && (nLow != nHigh) )

        {

            --nHigh;

        }

        if ( nHigh != nLow )

        {

            pData[nLow] = pData[nHigh];

            ++nLow;

        }

 

        while ( ( pData[nLow] < SelData ) && (nLow != nHigh) )

        {

            ++nLow;

        }

        if ( nLow != nHigh )

        {

            pData[nHigh] = pData[nLow];

            --nHigh;

        }

    }

    pData[nLow] = SelData;

 

    return nLow;

}

 

template <class T>

void QuickSort(T *pData, int nBegin, int nEnd)

{

    int nMid = QuickSort_Split(pData, nBegin, nEnd);

    if ( nMid > nBegin )

    {

        QuickSort(pData, nBegin, nMid - 1);

    }

 

    if ( nEnd > nMid )

    {

        QuickSort(pData, nMid + 1, nEnd);

    }

}

 

下面代码演示了如何使用Parallel_For()CQuickSortRange类来进行快速排序。

#define QUICKSORT_DATA_SIZE     1000000

 

void main(void)

{

    int * pData = new int[QUICKSORT_DATA_SIZE];

 

    srand(time(NULL));

 

    int i;

    for (i = 0; i < QUICKSORT_DATA_SIZE; i++ )

    {

        pData[i] = rand();

    }

CQuickSortRange<int> *pRange

= new CQuickSortRange<int>(pData, 0, QUICKSORT_DATA_SIZE-1);

Parallel_For(pRange);

 

delete [] pData;

}

 相关的多核文章:

在一个双核2.66G CPU机器上,测试了100万个随机数的串行快速排序和并行快速排序,得到的性能情况大致如下(由于存在随机性,每次测试得到的时间可能有差距):

 

串行快速排序100万个随机数, 耗时 187ms

并行快速排序100万个随机数, 耗时 94ms

 

加速比为187 / 94 = 1.989

效率为:1.989 / 2 = 99.46%

 

从上面的性能数据可以充分看出,使用动态任务调度进行并行算法的效率之高是非常令人兴奋的。

分享到:
评论

相关推荐

    并行编程模式Patterns_for_Parallel Programming

    11. **并行算法设计**:包括并行排序(如快速排序、归并排序)、并行搜索、并行图形算法等。 12. **容错和负载均衡**:并行系统中的节点可能会失败,因此需要有恢复机制;负载均衡则确保所有计算资源得到充分利用,...

    parallel_cgal_Parallel Geometric Algorithms for Multi-Core Computers

    例如,快速排序算法可以通过并行地对子数组进行排序,然后合并结果来实现加速。此外,基于网格的排序方法也可以利用多核架构,通过分配不同的网格区域到不同的核心上进行处理,从而实现并行化。 #### 二、高维轴...

    并行计算 c# 快速排序

    下面是一个简化的并行快速排序示例: ```csharp using System; using System.Threading.Tasks; public static void ParallelQuickSort(int[] array, int left, int right) { if (left ) { int pivotIndex = ...

    Oracle并行执行

    例如,在进行全表扫描时,可以将表分成多个分区,每个分区由一个或多个并行执行服务器(Parallel Execution Server, PES)进程负责处理。 2. **并行服务器进程(Parallel Execution Server, PES)**:这些进程是由...

    openmp-sort:使用 openmp 实现快速排序、合并排序、基数排序和并行快速排序

    4. **并行快速排序**:并行快速排序是在快速排序的基础上,通过OpenMP进一步优化。除了并行化划分阶段,还可以并行化递归过程,使得多个子数组同时进行排序,显著提升排序速度。 在实际应用中,我们需要考虑一些...

    openmp实现块排

    在这个例子中,使用了两个`#pragma omp section`来分别对数组的一部分进行快速排序。 4. **快速排序**:快速排序是一种高效的排序算法,平均时间复杂度为O(n log n)。这里定义了一个`quicksort`函数,采用递归方式...

    并行计算课程设计(报告+代码+可执行文件)

    在系统中实现了对机票信息的增删改查,考虑到查询的方便性,对机票按照航班号进行排序,而此排序方法用并行快速排序运用进来。利用OpenMP的并行技术,对机票信息按顺序排列好,并分析了实验过程中的加速比。 4.6.2 ...

    Linux系统下的并行计算环境设计及应用举例

    例如,在`quick_sort.c`中,可能使用了OpenMP的`#pragma omp parallel for`指令来并行化快速排序算法的主循环。 2. **MPI**:MPI是用于分布式内存并行计算的通信库,适用于多台计算机之间的通信。在`pi3.f`中,可能...

    如何使用英特尔C ++编译器和OpenMP 4.5库实现并行的“稳定”三向快速排序

    在本文中,我们将深入探讨如何使用英特尔C++编译器(Intel C++ Compiler)和OpenMP 4.5库来实现一个并行的“稳定”三向快速排序算法。三向快速排序是一种优化的快速排序版本,特别适用于处理包含大量重复元素的数据...

    并行计算课程设计(代码+执行文件+文档)

    在系统中实现了对机票信息的增删改查,考虑到查询的方便性,对机票按照航班号进行排序,而此排序方法用并行快速排序运用进来。利用OpenMP的并行技术,对机票信息按顺序排列好,并分析了实验过程中的加速比。 4.6.2 ...

    Thread building block

    假设我们需要在一个数组中查找一个元素,可以使用 TBB 的 `parallel_for` 函数来并行处理数组中的每个元素: ```cpp #include "tbb/parallel_for.h" #include "tbb/blocked_range.h" // 假设我们有一个整型数组 ...

    mpi与openmp并行程序设计ppt

    4. "第14章 排序.ppt" 可能包含了关于并行排序算法的内容,如快速排序、归并排序或基数排序的并行实现,这些都是大数据处理中常见的操作。 5. "搜索初步.ppt" 可能介绍了一些基础的搜索算法,并讨论如何通过并行化...

    Parallel partition for string qsort/qsel-开源

    本文将深入探讨一种针对字符串的快速排序(quicksort)和快速选择(quickselect)算法的实现,特别关注其在并行计算环境下的优化。开源项目“Parallel partition for string qsort/qsel”提供了顺序和并行版本的实现...

    Parallel-Sorting

    使用OpenMP实现并行排序,首先需要在代码中包含`#pragma omp parallel for`指令,然后在`std::sort`调用中应用这个指令。这会将排序任务划分为多个子任务,由多个线程并行执行。例如: ```cpp #include #include ...

    oracle数据库参数.pdf

    - fast_start_parallel_rollback:定义并行回滚进程的数量。 **6. 数据文件和日志管理** - db_files:指定数据库中可以存在的数据文件数量。 - control_files:指定控制文件的位置。 - db_block_lru_latches:定义...

    山东大学计算机学院 并行计算课程实验-内含源码和说明书(可自己修改).zip

    4. **并行算法设计**:如何将串行算法转化为并行算法,例如使用分治法、归并排序、快速傅里叶变换(FFT)等并行算法。 5. **并行编程实践**:在实际环境中使用并行计算库(如 OpenMPI, Pthread 等),设置并行任务...

    oneTBB-master.zip

    2. **示例和测试**:通过示例程序,开发者可以快速了解如何使用`oneTBB`进行并行编程,并通过测试用例确保库的正确性和性能。 3. **文档**:通常包括API参考、用户指南等,是理解`oneTBB`功能和用法的重要资料。 4. ...

    quicksort-omp.rar_omp

    在"quicksort-omp.c"文件中,我们可以预见到作者可能使用了OpenMP的这些特性来并行化快速排序的划分步骤。在快速排序的每次划分过程中,如果能有效地分配工作给多个线程,那么可以显著减少排序所需的时间。然而,...

    matlabGPU代码的尖峰排序.zip

    2. 对这些局部峰值进行排序,可以选择快速排序、归并排序等经典算法,但在这里可能会使用GPU加速的排序方法,如Thrust库提供的并行排序函数。 3. 最后,返回排序后的峰值位置或者峰值本身。 "KiloSort_master.zip...

    cs_omp-master_omp_

    3. **并行算法设计**:学习如何将经典算法如快速排序、归并排序、Dijkstra最短路径算法等转换为并行版本,以提高执行效率。 4. **并行性能优化**:了解并行化可能导致的负载不均、通信开销等问题,并学习如何通过...

Global site tag (gtag.js) - Google Analytics