unsigned long long int 能否用于存储 clock64() 的输出?

Can an unsigned long long int be used to store the output from clock64()?

我需要从不同的线程自动更新存储 clock64() 的全局数组。 CUDA 中的所有原子函数仅支持 unsigned long long int 大小。但是 return 类型的 clock64() 是有符号的。将 clock64() 的输出存储在 unsigned 中是否安全?

有各种atomic functions支持对unsigned long long int(即64位无符号整数)的原子操作,例如atomicCASatomicExchatomicAdd。如果您有 cc3.5 或更高版本的 GPU,您还有更多选择。

参考clock64()上的documentation

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

因此,由于它是一个 64 位有符号数,因此它在位方面与 unsigned long long int 相同,直到它变为负数。假设计数器在内核启动、cuda 上下文启动或机器开机时重置为零。此计数器直到大约:

才会变为负数

2^63(cycles)/1,000,000,000(cycles/s) = ~292 年后,以上述事件中的任何一个为实际重置点。

(我在这里使用 1GHz 作为 GPU 核心时钟的估计值)

所以在最初的 200-300 年里(假设是机器开机后),clock64() 函数不会 return 为负值。所以我想说将它视为 "always" 是非常安全的,因此始终与 unsigned long long int 相同,这意味着您可以安全地将它转换为它,并在支持的原子函数之一中使用它unsigned long long int.

另一方面,将其转换为 unsigned 数量可能不安全。该算法将是:

2^32(周期)/1,000,000,000(cycles/s) = ~4 秒(机器开机后)

因此在大约 4 秒内,clock64() 函数的数值将超过可以安全记录在 unsigned 数量中的值。