【问题标题】:Measuring algorithm calculation time (using MPI, parallel computing)测量算法计算时间(使用MPI,并行计算)
【发布时间】:2011-06-15 02:50:34
【问题描述】:

http://pastebin.com/Xb6GLv8Y

我的代码执行以下操作:

它将在集群中并行执行。 master rank 将生成一个包含大量元素(最大 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 秒才打印最后一个结果。这种荒谬的差异正常吗?我是否正确测量时间?

感谢您的帮助

【问题讨论】:

  • 您说您的代码在集群上运行;这个特定的测试在多少个进程上运行?

标签: c mpi parallel-processing


【解决方案1】:

可能会发生一些事情。

  1. 在子进程完成后,您没有计算 rank0 中 sort 和 joinArrays 的时间。

  2. 每个孩子用时 0.56 秒,但每个孩子的开始时间不必相同。我不知道你的集群有什么样的通信结构,但考虑到你移动的数据量很小,我怀疑这会是一个问题。

【讨论】:

    【解决方案2】:

    如果要测量整个排序的时间,则必须测量直到最后一个处理器完成所用的时间。您可以通过在 MPI_Barrier 之后计算完成时间来完成此操作。

    节点之间 60 倍的速度差异意味着您的负载平衡很差。一些节点的工作量比其他节点要多,如果你想要好的性能,你必须找到一种方法来平衡负载。

    如果您对并行排序感兴趣,那么我建议您阅读PSort 算法和source code。它进行本地排序,然后进行一些最小的通信以确定哪些处理器应该获得哪个部分,然后将数据大量传输到它们的目标处理器。它的通信开销最小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-12
      • 2011-08-04
      • 2013-01-28
      • 1970-01-01
      • 2021-06-21
      • 1970-01-01
      • 2022-01-19
      相关资源
      最近更新 更多