nVIDIA GPU clock64()值 - 含义和初始化/重置

时间:2017-10-21 11:54:15

标签: cuda clock

CUDA中的clock64()设备端函数为我们提供了某种时钟滴答值。文档says

  

在设备代码中执行时,[clock64()]返回每个多处理器计数器的值,该计数器在每个时钟周期递增。

我编写的用于检查clock64()行为的一个小程序表明,当您在(挂钟)时间的不同点启动内核时,您获得的初始值大致相同(无需重新启动计算机或“手动”重置设备)。对于我的特定情况,第一个内核的进程似乎约为5,200,000到6,400,000。此外,这些值从SM到SM略有增加 - 虽然不清楚它们是否应该完全相关,或者,如果它们相同,也许它们应该实际上是相同的。

我还发现,在下一次内核启动时,初始clock64()值会增加 - 但是在更多内核运行之后跳转到更低的值(例如350,000左右)并逐渐爬升。这种行为似乎没有一致的模式(我可以通过一些运行和手动检查来检测)。

所以,我的问题是:

  • clock64()实际上会返回时钟滴答,还是其他基于时间的东西?
  • clocks64() SM特定的方式,以及不同SM上的价值观以何种方式相关?
  • 什么重置/重新初始化clock64()值?
  • 我可以自己初始化clock64()值吗?

1 个答案:

答案 0 :(得分:2)

  

clock64()实际上会返回时钟滴答,还是其他基于时间的东西?

clock64()读取每个SM 64位计数器(它实际上返回一个带符号的结果,因此可用63位)。该计数器的时钟源是GPU核心时钟。例如,使用deviceQuery示例代码可以发现核心时钟频率。作为一个数量级的估计,我熟悉的大多数CUDA GPU的时钟周期大约为1纳秒。如果我们将2 ^ 63乘以1纳秒,我计算一个大约300年的反转期。

  

clock64() SM特定的方式,以及不同SM上的价值观以何种方式相关?

无法保证特定SM中的计数器与另一个SM中的计数器有任何已定义的关系,除非它们具有相同的时钟周期。

  

什么重置/重新初始化clock64()值?

计数器将在某个未指定的位置重置,介于机器开机和访问该SM的计数器的第一个点之间。当SM处于非活动状态时,也可以在任何时刻重置计数器,即没有驻留的线程块。当SM上有一个或多个线程块处于活动状态时,不应在任何时间间隔内重置计数器。

  

我可以自己初始化clock64()值吗?

你做不到。您无法直接控制计数器值。