CUDA中的clock64()
设备端函数为我们提供了某种时钟滴答值。文档says:
在设备代码中执行时,[clock64()]返回每个多处理器计数器的值,该计数器在每个时钟周期递增。
我编写的用于检查clock64()
行为的一个小程序表明,当您在(挂钟)时间的不同点启动内核时,您获得的初始值大致相同(无需重新启动计算机或“手动”重置设备)。对于我的特定情况,第一个内核的进程似乎约为5,200,000到6,400,000。此外,这些值从SM到SM略有增加 - 虽然不清楚它们是否应该完全相关,或者,如果它们相同,也许它们应该实际上是相同的。
我还发现,在下一次内核启动时,初始clock64()
值会增加 - 但是在更多内核运行之后跳转到更低的值(例如350,000左右)并逐渐爬升。这种行为似乎没有一致的模式(我可以通过一些运行和手动检查来检测)。
所以,我的问题是:
clock64()
实际上会返回时钟滴答,还是其他基于时间的东西?clocks64()
SM特定的方式,以及不同SM上的价值观以何种方式相关?clock64()
值?clock64()
值吗?答案 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()
值吗?
你做不到。您无法直接控制计数器值。