CUDA是否支持64位atomicSub()?使用报错及原因咨询
CUDA中atomicSub对64位无符号整数的支持问题
核心结论
是的,针对unsigned long long int类型,CUDA原生的atomicSub函数并不支持,这正是你编译时出现“no instance of overloaded function”错误的原因。而atomicAdd对64位无符号整数的支持是明确的,二者的差异源于CUDA的硬件指令设计与历史支持策略。
原因解析
硬件指令的原生支持差异
CUDA的原子操作直接映射GPU硬件提供的指令。早期NVIDIA GPU架构(如Kepler及更早)对64位原子操作的支持范围有限,仅为部分高频使用的操作(比如加法)实现了硬件指令。减法操作没有对应的原生硬件指令,因此CUDA运行时并未提供针对64位无符号整数的atomicSub重载。
你的RTX2060属于Turing架构,虽然后续架构对64位原子操作的支持有所扩展,但atomicSub针对64位无符号整数的重载仍未被纳入原生函数库。操作的可替代性
原子减法可以通过原子加法的反向操作模拟:对于unsigned long long int类型,atomicSub(ptr, val)完全等价于atomicAdd(ptr, -val)(无符号整数的减法可转换为补码加法逻辑)。这种方式能直接利用原生atomicAdd的硬件支持,实现效果与原生原子减法一致。
替代实现示例
// 自定义64位无符号整数原子减法函数 unsigned long long int atomicSubULL(unsigned long long int* ptr, unsigned long long int val) { return atomicAdd(ptr, -val); }
在代码中调用该自定义函数即可完成64位无符号整数的原子减法操作。
内容的提问来源于stack exchange,提问作者music_computer_slug
相关产品推荐
相关产品推荐

