我需要以原子方式更新存储来自不同线程的clock64()的全局数组。 CUDA中的所有原子函数仅支持unsigned
大小long long int
。但是clock64()的返回类型是有符号的。将clock64()的输出存储在unsigned
中是否安全?
答案 0 :(得分:2)
有atomic functions支持unsigned long long int
上的原子操作(即64位无符号整数),例如atomicCAS
,atomicExch
和{{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
数量安全记录的值。