【发布时间】:2012-10-28 23:37:34
【问题描述】:
我创建了一个中位数为 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;
【问题讨论】:
-
做中位数时溢出?
-
我正在使用中间 = ((high - low) / 2) + low;防止溢出还是你的意思是别的?
-
不管怎样你可能想切换到
unsigned ints,或者更好的size_t。
标签: c quicksort cilk cilk-plus