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