如何解释 MPI_Wtime() 的结果?

计算科学 并行计算 mpi
2021-12-08 05:56:27

说,我有这个代码

double start = MPI_Wtime();
ParallelMatrixVectorProductRotuine(...);
double end = MPI_Wtime();

我如何解释我得到的数字。例如,通过 1 个进程,我得到类似

1.7342

对于两个过程,我得到

1.0023
1.6432

我能说什么呢?我取这些结果的平均值吗?

2个回答

这取决于你的目标。对于一个过程,很明显t是整个程序启动的挂墙时间。

对于两个进程,你得到了t1t2这对应于处理器 1 和 2 上的 walltime。

通常,人们对解决问题所花费的总时间感兴趣 - 也就是总的 walltime,这将是t=max(t1,t2). 但是,我会建议一些额外的措施来做好工作:

MPI_BARRIER在计算完成之前和之后放置一个。仅在主节点上测量 walltime,最好在屏障之前和之后进行。然后,您将获得准确的walltime ParallelMatrixVectorProductRotuine(...);forN处理器。

不同进程的不同时间可能有多种原因。

  1. 如果一个进程在最后一次 MPI 通信后有很多本地工作,它将报告更长的运行时间。
  2. 如果一个进程以急切发送结束,它将报告比另一个进程更短的运行时间,后者必须执行接收。

所以你唯一能说的就是这些过程在某种程度上是不平衡的。您应该报告什么作为操作的客观总体时间?这样的概念有意义吗?

  • 也许你的代码会继续做本地工作,在这种情况下,你的产品会无缝过渡到下一个操作,而整体时间的概念是没有意义的。
  • 也许下一个操作是集体的东西,比如一个内部产品,而提前完成的处理器有空闲时间。

如果您真的想分配一个客观的全球时间,那么我会使用障碍,并将计时器立即放在障碍之后。尽管屏障在语义上不是时间同步,但实际上它通常是。

但是请记住,如果您再次移除障碍,您的生产代码会更快,这意味着时间的概念一开始就定义不明确。