我的代码执行以下操作:
它将在群集中并行执行。主等级将生成具有许多元素的后代有序数组(最大1.6M元素),将该数组划分为更小的数组,将这些部分中的每一个发送到集群中的每个计算机。群集中的每台计算机都会在其数组中执行快速排序算法,并将此(上行排序)数组发送回主排名。然后,主等级将使用修改的冒泡排序算法对从子等级接收的每个部分进行排序,并构建新的有序数组。 (目标是在并行计算中执行快速排序算法)。
一切都运行得很好,唯一的问题是我需要测量算法的计算时间。这是一项大学工作,因此PDF说“仅计算订购算法的时间”。所以我认为不要考虑网络等之间的数组传输。
我在代码中所做的是测量每个孩子等级的快速排序时间。最大的时间是计算时间。我对吗?但有一个问题。查看输出:
Array final, first 1, last 800000
Vetor de 800000 elementos ordenado com quicksort em paralelo (99 threads).
Dentre o tempo de processamento de cada node, o maior foi 140000, 0.14 seconds.
Array final, first 1, last 1600000
Vetor de 1600000 elementos ordenado com quicksort em paralelo (99 threads).
Dentre o tempo de processamento de cada node, o maior foi 560000, 0.56 seconds.
它表示孩子进行快速排序的最长时间是0.56秒。但是我在打印最后一个结果之前等了30秒。那荒谬的差异是正常的吗?我正确地测量时间吗?
感谢您的帮助
答案 0 :(得分:0)
可能会发生一些事情。
在子进程完成后,您没有计算rank0和joinArrays的时间。
每个孩子花了0.56秒,但每个孩子的开始时间不一定相同。我不知道你的集群有什么样的通信结构,但是由于你正在移动的数据很少,我怀疑这是一个问题。
答案 1 :(得分:0)
如果要测量整个排序的时间,则必须测量最后一个处理器完成所用的时间。您可以通过在MPI_Barrier之后的完成时间来完成此操作。
节点之间60倍的速度差异意味着您的负载平衡很差。有些节点比其他节点做得更多,如果你想获得良好的性能,你必须找到一种方法来均衡负载。
如果您对并行排序感兴趣,我建议您阅读PSort算法和source code。它进行本地排序,然后进行一些最小程度的通信,以确定哪些处理器应该获得哪个部分,然后将数据大量传输到目标处理器。它具有最小的通信开销。