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 左右)并再次逐渐攀升。这种行为似乎没有一致的模式(我可以通过几次运行和手动检查来检测)。
所以,我的问题是:
clock64()
实际上是 return 时钟滴答声,还是其他基于时间的东西?
clocks64()
SM 以何种方式特定,不同 SM 上的值以何种方式相关?
- resets/re-initializes
clock64()
值是多少?
- 我可以自己初始化
clock64()
个值吗?
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?
你不能。您无法直接控制计数器值。
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 左右)并再次逐渐攀升。这种行为似乎没有一致的模式(我可以通过几次运行和手动检查来检测)。
所以,我的问题是:
clock64()
实际上是 return 时钟滴答声,还是其他基于时间的东西?clocks64()
SM 以何种方式特定,不同 SM 上的值以何种方式相关?- resets/re-initializes
clock64()
值是多少? - 我可以自己初始化
clock64()
个值吗?
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?
你不能。您无法直接控制计数器值。