ランダムな整数の大きな配列をソートする、3 の中央値の標準クイックソート実装を作成しました。少なくとも 1 億要素、できれば 10 億要素まで増やしたいと考えています。速度を上げるために、Cilk++ でアルゴリズムを並列化しようとしています。アルゴリズムは二重再帰を使用し、Cilk タスクを生成して各再帰ソートを実行します。
私のアルゴリズムは、サイズが 10 000 000 までの配列に対して機能します。Cilk キーワードがなければ、シーケンシャル アルゴリズムは 1 億要素を簡単に処理できますが、Cilk を使用しようとすると、プログラムがデスクトップにクラッシュします。その理由をこれから探っていきたいと思います。生成する Cilk タスクが多すぎますか?
Windows 7 64 ビット、Intel++ コンパイラ、および Visual Studio 2010 に統合された Intel Parallel Studio XE 2013 を使用しています。プログラムは 32 ビット アプリケーションとしてコンパイルされています。ランダム データが格納されるメモリは、malloc への単一の呼び出しとして割り当てられ、ポインターがチェックされます。中央値の計算では、中間要素の計算時に整数オーバーフローも防止されます。
これは、ほとんどの場合、バッファ オーバーランの問題です。
これは私のパーティションです:
int pivotvalue = medianOf3(data, low, high);
// pivot is placed next to the last element
int left = low;
int right = high - 1;
while (left < right) {
while (data[left] < pivotvalue) {
left++;
if (left > high) {
break;
}
}
while (data[right] >= pivotvalue) {
right--;
if (right < low) {
break;
}
}
if (left < right) {
swap(data, left, right);
}
}
// restore pivot
swap(data, left, high - 1);
return left;