递归深度切断策略:并行快速排序
Recursion Depth Cut Off Strategy: Parallel QuickSort
我实现了一个并行快速排序算法。为了避免过多并行线程的开销,我有一个截断策略,当向量大小小于特定阈值时,将并行算法转换为顺序算法。然而,现在我试图设置基于递归深度的切断策略。也就是说,当达到一定的递归深度时,我希望我的算法变成顺序的。我使用了下面的代码,但它不起作用。我不知道该怎么做。什么好主意吗?
template <class T>
void ParallelSort::sortHelper(typename vector<T>::iterator start, typename vector<T>::iterator end, int level =0) //THIS IS THE QUICKSoRT INTERFACE
{
static int depth =0;
const int insertThreshold = 20;
const int threshold = 1000;
if(start<end)
{
if(end-start < insertThreshold) //thresholf for insert sort
{
insertSort<T>(start, end);
}
else if((end-start) >= insertThreshold && depth<threshold) //threshhold for non parallel quicksort
{
int part = partition<T>(start,end);
depth++;
sortHelper<T>(start, start + (part - 1), level+1);
depth--;
depth++;
sortHelper<T>(start + (part + 1), end, level+1);
depth--;
}
else
{
int part = partition<T>(start,end);
#pragma omp task
{
depth++;
sortHelper<T>(start, start + (part - 1), level+1);
depth--;
}
depth++;
sortHelper<T>(start + (part + 1), end, level+1);
depth--;
}
}
}
我尝试了静态变量depth
和非静态变量level
,但它们都不起作用。注:以上剪切仅取决于depth
。包含level
以显示所尝试的两种方法
从两个线程写入static depth
会使您的代码执行未指定的行为,因为这些写入操作没有指定。
当它发生时,你正在传递level
,这是你的递归深度。在每个级别上,您将线程数量增加一倍——因此级别上的限制等于6(例如)最多对应于2^6个线程。你的代码只有一半是并行的,因为partition
代码发生在主线程中,所以你可能会有少于理论的最大线程数同时运行。
template <class T>
void ParallelSort::sortHelper(typename vector<T>::iterator start, typename vector<T>::iterator end, int level =0) //THIS IS THE QUICKSoRT INTERFACE
{
const int insertThreshold = 20;
const int treeDepth = 6; // at most 2^6 = 64 tasks
if(start<end)
{
if(end-start < insertThreshold) //thresholf for insert sort
{
insertSort<T>(start, end);
}
else if(level>=treeDepth) // only 2^treeDepth threads, after which we run in sequence
{
int part = partition<T>(start,end);
sortHelper<T>(start, start + (part - 1), level+1);
sortHelper<T>(start + (part + 1), end, level+1);
}
else // launch two tasks, creating an exponential number of threads:
{
int part = partition<T>(start,end);
#pragma omp task
{
sortHelper<T>(start, start + (part - 1), level+1);
}
sortHelper<T>(start + (part + 1), end, level+1);
}
}
}
好了,我明白了。这是我犯的一个愚蠢的错误。
当堆栈大小大于某个阈值时,算法应该返回到顺序代码,而不是小于。这样做解决了问题,并给了我一个加速。
相关文章:
- 如何修复我的快速排序实现?
- C++运行时错误与快速排序算法抛出堆栈转储错误
- 在 MIPS 中快速排序
- 不正确的比较和交换计数器输出用于快速排序功能
- 使用 std::vector C++快速排序,EXC_BAD_ACCESS代码 2
- 使用快速排序对 C++ 中的可视化工具错误进行排序
- 快速排序 - 三个中位数枢轴选择 - 某些元素顺序不正确
- 并行快速排序分区中的隔离错误
- 实现 3 路分区以实现快速排序
- 为什么这个快速排序实现给出了一个奇怪的输出
- 我的快速排序在对预排序的项目进行排序时失败,如何改进?
- 快速排序不适用于大型数组
- 快速排序;分段错误,但找不到位置?
- 快速排序函数在快速排序算法中如何工作?
- 并行快速排序不比顺序快速排序快
- libstdc++ 并行模式快速排序的加速较差
- 为什么GNU并行快速排序比归并排序慢?
- 递归深度切断策略:并行快速排序
- 并行快速排序中的升压互斥锁
- 并行快速排序:使用BoostBind的递归