並列のquickosortアルゴリズムを実装しています。過剰な並列スレッドのオーバーヘッドを回避するために、ベクトルサイズが特定のしきい値よりも小さい場合に、並列アルゴリズムを順次アルゴリズムに変換するカットオフ戦略を採用しました。ただし、現在、再帰の深さに基づいてカットオフ戦略を設定しようとしています。つまり、特定の再帰深度に達したときにアルゴリズムを順次回転させたいのです。私は次のコードを採用しましたが、それはうまくいきません。どうすればいいのかわかりません。何か案は?
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
試行された両方の方法を示すために含まれています