【问题标题】:Difference between clock() and MPI_Wtime()clock() 和 MPI_Wtime() 之间的区别
【发布时间】:2013-06-25 08:11:33
【问题描述】:

快速提问。对于我的代码的 MPI 实现,我在两者上都有很大的不同。我知道 MPI_Wtime 是每个处理器经过的实时时间,而 clock() 给出了预期时间的粗略概念。有人想添加一些断言吗?

【问题讨论】:

    标签: c++ c mpi clock processor


    【解决方案1】:

    clock 函数完全没用。它测量的是 cpu 时间,而不是实时/墙上时间,而且它还存在以下严重问题:

    1. 在大多数实现中,分辨率极差,例如,1/100 秒。 CLOCKS_PER_SECOND 不是分辨率,只是比例。

    2. 对于CLOCKS_PER_SECOND 的典型值(例如,Unix 标准要求它为 100 万),clock 在 32 位系统上将在几分钟内溢出。溢出后返回-1。

    3. 大多数历史实现实际上并不像 C 标准所要求的那样在溢出时返回 -1,而是换行。由于clock_t 通常是有符号类型,因此尝试使用包装后的值执行算术运算将产生无意义的结果或未定义的行为。

    4. 在 Windows 上,它会做完全错误的事情,并测量经过的实时时间,而不是 CPU 时间。

    【讨论】:

    • 感谢您的回答。我需要测量 MPI 程序的总时间(肯定会与每个 MPI_Wtime() 不同)。分析对我来说似乎并不好,因为它不需要花费大量时间,而且它正在检测来自 MPI 实现的一些其他功能。知道我该怎么做吗?
    • 我认为,最后我可以调用 MPI_Barrier(MPI_COMM_WORLD) 并且在此之后我可以将任何 MPI_Wtime() 记录为整体执行时间(这将作为速率确定步骤)或字面意思说这将是所有 MPI_Wtime() 中的最大值。请验证我!
    • 我不熟悉 MPI,但快速查看文档后发现 MPI_Wtime 返回实时,而不是 CPU 时间。 “在调用处理器上”这个短语相当具有误导性。它似乎与 cpu 时间没有任何关系,而是允许不同的内核可能对当前实时的想法略有不同。但是,这种差异不应存在于高质量系统中。
    • 感谢您的关注。我做了和前面提到的一样的事情,我几乎从所有过程中得到了相同的时间(我会说,真正的总时间),因为我也有兴趣知道等待时间(如果是他们由于时间共享:实际上有是只有 1 个进程被执行,只是它们变化非常频繁),它达到了我的目的。
    【解决方案2】:

    clock 的官方定义是它为您提供 CPU 时间。在 Windows 中,出于 hysterical 历史原因 - 如果您将其更改为现在反映 CPU 时间,它会破坏某些应用程序 - 在 Windows 上,时间只是经过的时间。

    MPI_Wtime 如您所说,给出了“此处理器上的当前时间”,这是完全不同的。如果您执行休眠 1 分钟的操作,MPI_Wtime 将向前移动 60 秒,而 clock(Windows 除外)几乎没有变化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 2020-05-10
      • 2014-09-20
      • 2010-10-28
      • 2015-10-04
      相关资源
      最近更新 更多