我已经实现了快速排序的顺序版本和并行版本。
我已经习惯了为我的实现验证speedsort的最坏情况的加速:源数组已经排序,在我的情况下,pivot始终是数组的第一个元素。
因此,分区生成两个集合,其中一个元素包含小于pivot的元素,另一个元素的元素高于pivot,即n - 1个元素,其中n是作为quicksort函数的参数传递的数组元素的数量。递归深度的大小为N -1,其中N是作为quicksort函数的参数传递的原始数组的元素数。
Obs:这些集实际上由两个变量表示,这两个变量包含数组部分的初始位置和最终位置,这些变量对应元素小于数据元素且元素高于数据透视表。整个部门正在发生,这意味着没有在流程上创建新数组。并行的顺序的差异在于并行版本中创建了多个数组,其中元素在它们之间被平均分配(按顺序情况排序)。对于并行情况下元素的连接,使用了算法合并。
获得的加速比理论更高,这意味着使用两个线程所获得的speeedup与顺序版本相比超过2倍(3倍更精确),4线程加速为10x。
运行线程的计算机是运行Ubuntu Linux 10.04的4核机器(Phenom II X4),如果我没有错误,则为64位。编译器是gcc 4.4,除了为并行实现包含库pthread之外,没有为编译器传递任何标志;
那么,有人知道实现超线性加速的原因吗?拜托,有人可以给一些指针吗?
答案 0 :(得分:2)
最好使用一些性能分析器来挖掘 这个更详细,但我的第一个猜测就是这种超级 线性加速是由于您获得更多缓存空间 如果你添加线程。这样,将从缓存中读取更多数据。 由于内存传输的成本非常高,这很容易 提高绩效。
您使用Amdahl's law评估最高加速时间吗?
希望这有帮助。
答案 1 :(得分:2)
如果你看到3倍加速,两个线程与一个线程,加速度为10倍,四个线程与一个线程相比,可能会出现问题。
Amdahl定律指出加速是1 /(1-P + P / S),其中P是算法的并行部分,S是并行部分的加速因子。假设四个核心的S = 4(最好的结果),我们发现P = 2.5,这是不可能的(它必须在0和1之间,包括在内)。
换句话说,如果你可以通过4个核心获得10倍的改进,那么你可以简单地使用一个核心来模拟四个核心,并且仍然可以获得2.5倍的改进(或者左右)。
换句话说,一秒钟内的四个核心在十秒钟内执行的操作少于一个核心。因此,并行版本实际上执行的操作较少,如果是这种情况,则没有理由说串行版本也不能执行更少的操作。
可能的结论:
您的顺序版可能有问题。也许它的优化程度很低。
您的并行版本可能出现问题。它们可能不正确。
测量可能不正确。这很常见。
不可能的结论: