我已经实现了快速排序的顺序版本和并行版本。
我已经在我的实现中验证了快速排序的最坏情况的加速:源数组已经排序,在我的情况下,枢轴始终是数组的第一个元素。
因此,分区生成两个集合,一个包含小于枢轴的元素,另一个包含高于枢轴的元素,即 n - 1 个元素,其中 n 是作为快速排序函数的参数传递的数组元素的数量。递归深度的大小为 N -1,其中 N 是作为快速排序函数的参数传递的原始数组的元素数。
Obs:集合实际上由两个变量表示,其中包含数组部分的初始位置和最终位置,对应于元素小于枢轴和元素高于枢轴。整个划分都在原地进行,这意味着没有在进程中创建新数组。并行的顺序的区别在于并行版本中创建了多个数组,其中元素在它们之间平均分配(按顺序情况排序)。对于并行情况下的元素连接,使用了算法合并。
获得的加速比理论值高,这意味着与顺序版本相比,使用两个线程实现的加速比超过 2 倍(更准确地说是 3 倍),而使用 4 个线程的加速比是 10 倍。
我运行线程的计算机是运行 Ubuntu Linux 10.04、64 位的 4 核机器(Phenom II X4),如果我没记错的话。编译器是 gcc 4.4,除了包含用于并行实现的库 pthread 之外,没有为编译器传递任何标志;
那么,有人知道实现超线性加速的原因吗?有人可以指点一下吗?