nVIDIA GPU clock64() 值 - 含义和 initialization/resetting

nVIDIA GPU clock64() values - meaning and initialization/resetting

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

when executed in device code, [clock64()] returns the value of a per-multiprocessor counter that is incremented every clock cycle.

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

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

所以,我的问题是:

Does clock64() actually return clock ticks, or something else that's time-based?

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

In what ways is clock64() SM-specific, and in what ways are the values on different SMs related?

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

What resets/re-initializes the clock64() value?

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

Can I initialize the clock64() value(s) myself?

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