根据 CUDA Programming Guide,“原子函数仅相对于由特定集合的线程执行的其他操作是原子的......块范围的原子:对于当前程序中的所有 CUDA 线程在与当前线程块相同的线程块中执行的原子线程。这些以 _block 为后缀,例如,atomicAdd_block
“
但是,atomicAdd_block
当我的代码使用atomicAdd
. 我应该添加或链接到任何标题或库吗?
根据 CUDA Programming Guide,“原子函数仅相对于由特定集合的线程执行的其他操作是原子的......块范围的原子:对于当前程序中的所有 CUDA 线程在与当前线程块相同的线程块中执行的原子线程。这些以 _block 为后缀,例如,atomicAdd_block
“
但是,atomicAdd_block
当我的代码使用atomicAdd
. 我应该添加或链接到任何标题或库吗?
atomicAdd()
已经支持了很长时间 - 早期版本的 CUDA 和较旧的微架构。但是, IIANM 于 2016atomicAdd_system()
年atomicAdd_block
推出,采用 Pascal 微架构。支持它们的最低计算能力为 6.0。如果您的目标是 CC 5.2 或更早版本 - 或者如果您的 CUDA 版本已有几年历史 - 那么您可能无法使用它们。
-gencode
实际上很可能是这种情况,因为即使对于当前版本的 CUDA,如果没有使用or指定其他值-arch
(例如,如果您运行nvcc -o out my_file.cu
),nvcc 将默认为 Compute Capability 5.2。
正如罗伯特所说,解决方案是添加-arch=sm_70
编译或者对于那些使用 CMake 的人来说是添加set(CMAKE_CUDA_ARCHITECTURES 70)
到他们的 CMakeLists.txt