Cuda 是否可以使用无符号长整型来存储clock64()的输出?

Cuda 是否可以使用无符号长整型来存储clock64()的输出?,cuda,Cuda,我需要以原子方式更新存储来自不同线程的clock64()的全局数组。CUDA中的所有原子函数只支持长整型大小的无符号。但是clock64()的返回类型是有符号的。将来自clock64()的输出存储在无符号的中是否安全 支持对无符号long long int(即64位无符号整数)执行原子操作的有多种方法,例如atomicCAS、atomicExch和atomicAdd。如果你有cc3.5或更高的GPU,你有更多的选择 请参阅时钟64()上的开关。: 长整型时钟64();在设备代码中执行时,返回每个

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

支持对
无符号long long int
(即64位无符号整数)执行原子操作的有多种方法,例如
atomicCAS
atomicExch
atomicAdd
。如果你有cc3.5或更高的GPU,你有更多的选择

请参阅时钟64()上的开关。

长整型时钟64();在设备代码中执行时,返回每个多处理器计数器的值,该值在每个时钟周期递增

因此,由于它是一个64位有符号量,它在位上与无符号长整型相同,直到它变为负数为止。假设计数器在内核启动、cuda上下文启动或机器开机时重置为零。此计数器在以下情况下才会变为负值:

2^63(周期)/100000000(周期/s)=上述事件中的任何一个为实际重置点后约292年

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

因此,在最初的200-300年中(比如说机器通电后),
clock64()
函数不会返回负值。因此,我认为把它看作“总是”肯定是安全的,因此总是与<代码>未签名的long long int /代码>相同,这意味着您可以安全地将其转换为该函数,并将其用于支持<代码>未签名的长long int < /> > >

的原子函数中的一个。 另一方面,将其转换为
无符号
数量可能不安全。该算法将是:

2^32(周期)/100000000(周期/s)=~4秒(机器通电后)


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

您正在查看哪些文档?对我来说,他们看起来像是在未签名的网站上工作。@Hurkyl[link]谢谢你的清晰解释!我的意思是将clock64()的输出存储到一个
无符号长整型
。你的问题中的这句话让我很困惑:“CUDA中的所有原子函数都不支持
无符号的
长整型
大小。”我在回答的第一段中陈述了我的立场。我们在看相同的文档吗?您提供给Hurkyl的链接列出了
atomicExch
unsigned long long int
原型。我的错。编辑了我原来的问题。