注:本文主要内容摘自笔者所著的《多核计算与程序设计》一书,略有修改,后续还会继续发布系列文章,如有需要,可以考虑将一下地址加入到您的浏览器收藏夹中: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%
从上面的性能数据可以充分看出,使用动态任务调度进行并行算法的效率之高是非常令人兴奋的。
分享到:
相关推荐
11. **并行算法设计**:包括并行排序(如快速排序、归并排序)、并行搜索、并行图形算法等。 12. **容错和负载均衡**:并行系统中的节点可能会失败,因此需要有恢复机制;负载均衡则确保所有计算资源得到充分利用,...
例如,快速排序算法可以通过并行地对子数组进行排序,然后合并结果来实现加速。此外,基于网格的排序方法也可以利用多核架构,通过分配不同的网格区域到不同的核心上进行处理,从而实现并行化。 #### 二、高维轴...
下面是一个简化的并行快速排序示例: ```csharp using System; using System.Threading.Tasks; public static void ParallelQuickSort(int[] array, int left, int right) { if (left ) { int pivotIndex = ...
例如,在进行全表扫描时,可以将表分成多个分区,每个分区由一个或多个并行执行服务器(Parallel Execution Server, PES)进程负责处理。 2. **并行服务器进程(Parallel Execution Server, PES)**:这些进程是由...
4. **并行快速排序**:并行快速排序是在快速排序的基础上,通过OpenMP进一步优化。除了并行化划分阶段,还可以并行化递归过程,使得多个子数组同时进行排序,显著提升排序速度。 在实际应用中,我们需要考虑一些...
在这个例子中,使用了两个`#pragma omp section`来分别对数组的一部分进行快速排序。 4. **快速排序**:快速排序是一种高效的排序算法,平均时间复杂度为O(n log n)。这里定义了一个`quicksort`函数,采用递归方式...
在系统中实现了对机票信息的增删改查,考虑到查询的方便性,对机票按照航班号进行排序,而此排序方法用并行快速排序运用进来。利用OpenMP的并行技术,对机票信息按顺序排列好,并分析了实验过程中的加速比。 4.6.2 ...
例如,在`quick_sort.c`中,可能使用了OpenMP的`#pragma omp parallel for`指令来并行化快速排序算法的主循环。 2. **MPI**:MPI是用于分布式内存并行计算的通信库,适用于多台计算机之间的通信。在`pi3.f`中,可能...
在本文中,我们将深入探讨如何使用英特尔C++编译器(Intel C++ Compiler)和OpenMP 4.5库来实现一个并行的“稳定”三向快速排序算法。三向快速排序是一种优化的快速排序版本,特别适用于处理包含大量重复元素的数据...
在系统中实现了对机票信息的增删改查,考虑到查询的方便性,对机票按照航班号进行排序,而此排序方法用并行快速排序运用进来。利用OpenMP的并行技术,对机票信息按顺序排列好,并分析了实验过程中的加速比。 4.6.2 ...
假设我们需要在一个数组中查找一个元素,可以使用 TBB 的 `parallel_for` 函数来并行处理数组中的每个元素: ```cpp #include "tbb/parallel_for.h" #include "tbb/blocked_range.h" // 假设我们有一个整型数组 ...
4. "第14章 排序.ppt" 可能包含了关于并行排序算法的内容,如快速排序、归并排序或基数排序的并行实现,这些都是大数据处理中常见的操作。 5. "搜索初步.ppt" 可能介绍了一些基础的搜索算法,并讨论如何通过并行化...
本文将深入探讨一种针对字符串的快速排序(quicksort)和快速选择(quickselect)算法的实现,特别关注其在并行计算环境下的优化。开源项目“Parallel partition for string qsort/qsel”提供了顺序和并行版本的实现...
使用OpenMP实现并行排序,首先需要在代码中包含`#pragma omp parallel for`指令,然后在`std::sort`调用中应用这个指令。这会将排序任务划分为多个子任务,由多个线程并行执行。例如: ```cpp #include #include ...
- fast_start_parallel_rollback:定义并行回滚进程的数量。 **6. 数据文件和日志管理** - db_files:指定数据库中可以存在的数据文件数量。 - control_files:指定控制文件的位置。 - db_block_lru_latches:定义...
4. **并行算法设计**:如何将串行算法转化为并行算法,例如使用分治法、归并排序、快速傅里叶变换(FFT)等并行算法。 5. **并行编程实践**:在实际环境中使用并行计算库(如 OpenMPI, Pthread 等),设置并行任务...
2. **示例和测试**:通过示例程序,开发者可以快速了解如何使用`oneTBB`进行并行编程,并通过测试用例确保库的正确性和性能。 3. **文档**:通常包括API参考、用户指南等,是理解`oneTBB`功能和用法的重要资料。 4. ...
在"quicksort-omp.c"文件中,我们可以预见到作者可能使用了OpenMP的这些特性来并行化快速排序的划分步骤。在快速排序的每次划分过程中,如果能有效地分配工作给多个线程,那么可以显著减少排序所需的时间。然而,...
2. 对这些局部峰值进行排序,可以选择快速排序、归并排序等经典算法,但在这里可能会使用GPU加速的排序方法,如Thrust库提供的并行排序函数。 3. 最后,返回排序后的峰值位置或者峰值本身。 "KiloSort_master.zip...
3. **并行算法设计**:学习如何将经典算法如快速排序、归并排序、Dijkstra最短路径算法等转换为并行版本,以提高执行效率。 4. **并行性能优化**:了解并行化可能导致的负载不均、通信开销等问题,并学习如何通过...