2013-06-27 52 views

回答

3

clock函数完全没用。它测量CPU时间,而不是实时/挂钟时间,而且它具有以下严重问题:

  1. 在大多数实现中,分辨率是极其恶劣的,例如1/100秒。 CLOCKS_PER_SECOND不是分辨率,只是规模。

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

  3. 由于C标准要求,大多数历史实现并不实际返回-1溢出,而是换行。由于clock_t通常是一个有符号类型,试图用包装值执行算术将产生无意义的结果或未定义的行为。

  4. 在Windows上,它完成了错误的事情和测量,而不是CPU时间。

+0

感谢您的回答。我需要测量MPI程序的总体时间(当然,它将与每个MPI_Wtime()不同)。分析对我来说似乎并不好,因为它不会花费大量时间来检测MPI实现中的其他功能。任何想法我都能做到这一点? –

+0

我想,最后我可以打电话给MPI_Barrier(MPI_COMM_WORLD),之后我可以注意到任何MPI_Wtime()作为整体执行时间(这将作为速率确定步骤),或者从字面上讲,它将是所有MPI_Wtime()。请验证我! –

+0

我对MPI不熟悉,但对文档的快速检查表明'MPI_Wtime'返回实时,而不是CPU时间。 “在呼叫处理器上”这个短语颇具误导性;它似乎与cpu时间没有任何关系,而是允许不同的内核可能对当前实际时间略有不同的想法。但是,这种差异不应该存在于高质量的系统中。 –

3

clock的官方定义是它给你CPU时间。在Windows中,对于 歇斯底里的 历史原因 - 如果您现在将其更改为反映CPU时间,它会打破一些应用程序 - 在Windows上,时间只是流逝的时间。

MPI_Wtime给出,正如你所说,“当前在这个处理器上的时间”,这是非常不同的。如果你做了1分钟的睡眠,MPI_Wtime将向前移动60秒,其中clock(Windows除外)几乎没有变化。