cuda原子性操作代码编译问题 error: identifier "atomicAdd" is undefined

本文记录了解决CUDA编程中遇到的原子性代码编译错误的过程,通过调整makefile中的编译参数解决了书中示例代码在特定GPU上运行时出现的问题。
部署运行你感兴趣的模型镜像


这次遇到的问题是,编译原子性代码出错。

代码是《GPU高性能编程cuda实践》第9章的hist_gpu_gmem_atomics.cuhist_gpu_shmem_atomics.cu


这次还是用原有sdk带有makefile修改来编译。

出现

"/usr/local/cuda-5.5"/bin/nvcc-ccbin g++ -I../../../common/inc -m32 -gencodearch=compute_10,code=sm_10 -gencode arch=compute_20,code=sm_20-gencode arch=compute_30,code=sm_30 -gencodearch=compute_35,code=\"sm_35,compute_35\" -o exe.o -chist_gpu_shmem_atomics.cu

error:identifier "atomicAdd" is undefined


分析:书中提到,原子性操作在低端的计算能力GPU是不支持的,

1.1以上的计算能力才支持全局内存的原子操作,

1.2以上的计算能力才支持共享内存的原子操作。

我观察到了makefilenvvc的编译命令有-gencodearch=compute_10,code=sm_10

感觉不靠谱,于是改了一下。

GENCODE_FLAGS := $(GENCODE_SM10) $(GENCODE_SM20) $(GENCODE_SM30)

改为

GENCODE_FLAGS := $(GENCODE_SM20) $(GENCODE_SM30)

#$(GENCODE_SM10)

就是把(GENCODE_SM10)选项去掉


再次编译,貌似没事。

运行,出问题了。输出不正常阿。


搞了很久,猜测一下,把GENCODE_SM10改为GENCODE_SM12就可以了。

makefile的主要修改如下

#CUDA code generation flags

ifneq($(OS_ARCH),armv7l)

GENCODE_SM12 := -gencode arch=compute_12,code=sm_12

endif

GENCODE_SM20 := -gencode arch=compute_20,code=sm_20

GENCODE_SM30 := -gencode arch=compute_30,code=sm_30 -gencodearch=compute_35,code=\"sm_35,compute_35\"

GENCODE_FLAGS := $(GENCODE_SM12) $(GENCODE_SM20) $(GENCODE_SM30)


我知道我机器GPUComputecapability: 1.2

所以这样改。但具体原因不知道。

目前只能这样理解:编译参数如果跟机器属性不符,有可能会出错。

不过还好,再次对cuda的编译有了更深入的理解。


您可能感兴趣的与本文相关的镜像

PyTorch 2.7

PyTorch 2.7

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

当遇到 `identifier "cudaDeviceSynchronize" is undefined in device code` 错误,通常意味着编译器无法识别 `cudaDeviceSynchronize` 函数,以下是可能的解决方法: ### 1. 包含必要的头文件 `cudaDeviceSynchronize` 函数定义在 CUDA 运行时库中,需要在代码里包含 `<cuda_runtime.h>` 头文件。示例如下: ```cpp #include <cuda_runtime.h> #include <iostream> __global__ void kernel() { // 内核代码 } int main() { kernel<<<1, 1>>>(); cudaDeviceSynchronize(); cudaError_t err = cudaGetLastError(); if (err != cudaSuccess) { std::cerr << "CUDA error: " << cudaGetErrorString(err) << std::endl; } return 0; } ``` ### 2. 检查 CUDA 安装和环境配置 要保证 CUDA 已经正确安装,并且环境变量配置无误。通常需要设置 `PATH`、`LD_LIBRARY_PATH` 等环境变量。以 Linux 为例,可以在 `.bashrc` 或者 `.zshrc` 文件中添加如下配置: ```bash export PATH=/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH ``` 配置完成之后,重新加载配置文件: ```bash source ~/.bashrc ``` ### 3. 检查编译器选项 在编译 CUDA 代码时,要使用 `nvcc` 编译器,并且确保链接了 CUDA 运行时库。示例如下: ```bash nvcc -o your_program your_program.cu ``` ### 4. 检查 CUDA 版本兼容性 要保证代码使用的 CUDA API 版本和安装的 CUDA 版本兼容。如果使用的是较新的 CUDA 特性,需要安装对应的 CUDA 版本。 ### 5. 检查代码文件扩展名 CUDA 代码文件通常使用 `.cu` 作为扩展名,这样 `nvcc` 编译器才能正确识别并编译 CUDA 代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值