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



CUDA中的clock64()设备端函数为我们提供了某种时钟信号值。文件上写着:

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

我为检查clock64()行为而编写的一个小程序表明,当你在(墙上的时钟)时间的不同点启动内核时(无需重新启动机器或"手动"重置设备),你会得到大致相同的初始值。对于我的具体情况,对于进程启动的第一个内核来说,这似乎是大约5200000到6400000。此外,从SM到SM,这些值略有增加,但尚不清楚它们是否有关联,或者,如果有,也许它们实际上应该是相同的。

我还发现,随着下一次内核启动,最初的clock64()值会增加,但在更多内核运行后,会跳到一个低得多的值(例如350000左右),并逐渐再次攀升。这种行为似乎没有一个一致的模式(我可以通过几次运行和手动检查来检测)。

所以,我的问题是:

  • clock64()是否真的返回时钟滴答声,或者其他基于时间的东西
  • clocks64()SM在哪些方面是特定的,不同SM上的值在哪些方面相关
  • 什么重置/重新初始化clock64()
  • 我可以自己初始化clock64()值吗

clock64()是否真的返回时钟信号,或者其他基于时间的信号?

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

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

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

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

计数器将在某个未指定的点重置,该点位于机器通电和您访问该SM的计数器的第一个点之间。当SM处于非活动状态(即没有常驻线程块)时,计数器还可以在任何点重置。当SM上的一个或多个线程块处于活动状态时,在任何间隔期间都不应重置计数器。

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

您不能。您无法直接控制计数器值。

最新更新