我创建了一个中位数为 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;