可以使用unsigned long long int来存储clock64()的输出吗?

时间:2015-06-15 23:02:42

标签: cuda

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

1 个答案:

答案 0 :(得分:2)

atomic functions支持unsigned long long int上的原子操作(即64位无符号整数),例如atomicCASatomicExch和{{1} }。如果你有一个cc3.5或更高的GPU,你有更多的选择。

参考atomicAdd上的documentation

  

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

因此,由于它是一个64位的有符号数,因此它与clock64()的位相同,直到它变为负数。让我们假设计数器在内核开始,cuda上下文启动或机器开机时重置为零。此计数器在周围不会变为负数:

2 ^ 63(周期)/ 1,000,000,000(周期/秒)=在上述事件中的任何一个是实际复位点后约292年。

(我在这里使用1GHz估算GPU核心时钟)

因此,对于前200 - 300年(在机器开机后,让我们说),unsigned long long int函数不会返回负值。所以我认为把它视为“总是”正面是非常安全的,因此总是与clock64()相同,这意味着你可以安全地将它转换为它,并在支持{{的一个原子函数中使用它。 1}}。

另一方面,将其转换为unsigned long long int数量可能并不安全。算术将是:

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

因此,在大约4秒内,unsigned long long int函数将在数字上超过可以unsigned数量安全记录的值。