【发布时间】:2013-06-25 08:11:33
【问题描述】:
快速提问。对于我的代码的 MPI 实现,我在两者上都有很大的不同。我知道 MPI_Wtime 是每个处理器经过的实时时间,而 clock() 给出了预期时间的粗略概念。有人想添加一些断言吗?
【问题讨论】:
快速提问。对于我的代码的 MPI 实现,我在两者上都有很大的不同。我知道 MPI_Wtime 是每个处理器经过的实时时间,而 clock() 给出了预期时间的粗略概念。有人想添加一些断言吗?
【问题讨论】:
clock 函数完全没用。它测量的是 cpu 时间,而不是实时/墙上时间,而且它还存在以下严重问题:
在大多数实现中,分辨率极差,例如,1/100 秒。 CLOCKS_PER_SECOND 不是分辨率,只是比例。
对于CLOCKS_PER_SECOND 的典型值(例如,Unix 标准要求它为 100 万),clock 在 32 位系统上将在几分钟内溢出。溢出后返回-1。
大多数历史实现实际上并不像 C 标准所要求的那样在溢出时返回 -1,而是换行。由于clock_t 通常是有符号类型,因此尝试使用包装后的值执行算术运算将产生无意义的结果或未定义的行为。
在 Windows 上,它会做完全错误的事情,并测量经过的实时时间,而不是 CPU 时间。
【讨论】:
MPI_Wtime 返回实时,而不是 CPU 时间。 “在调用处理器上”这个短语相当具有误导性。它似乎与 cpu 时间没有任何关系,而是允许不同的内核可能对当前实时的想法略有不同。但是,这种差异不应存在于高质量系统中。
clock 的官方定义是它为您提供 CPU 时间。在 Windows 中,出于 hysterical 历史原因 - 如果您将其更改为现在反映 CPU 时间,它会破坏某些应用程序 - 在 Windows 上,时间只是经过的时间。
MPI_Wtime 如您所说,给出了“此处理器上的当前时间”,这是完全不同的。如果您执行休眠 1 分钟的操作,MPI_Wtime 将向前移动 60 秒,而 clock(Windows 除外)几乎没有变化。
【讨论】: