You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启用Address Sanitizer时CUDA初始化失败问题求助

解决启用Address Sanitizer时CUDA初始化失败的问题

问题根源

Address Sanitizer(ASAN)会拦截CPU端的内存分配操作,但CUDA Runtime初始化时需要与GPU驱动直接交互,ASAN的内存拦截会干扰驱动的内存分配流程,导致cudaGetDeviceCount触发cudaErrorMemoryAllocation错误。ASAN本身不支持GPU内存检测,因此无需对CUDA设备代码启用ASAN。

解决方案:拆分编译/链接选项,仅对CPU代码启用ASAN

修改你的CMakeLists.txt,将ASAN选项仅应用于C++代码(CPU端),CUDA编译和链接时排除ASAN:

set(CMAKE_CXX_STANDARD 17)

cmake_minimum_required(VERSION 3.0)
project(SampleProgram LANGUAGES CXX CUDA)

find_package(CUDA REQUIRED)

set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} -G)

cuda_add_executable(sampleProgram main.cpp)

# 针对不同语言设置编译选项:C++启用ASAN,CUDA仅保留警告
target_compile_options(sampleProgram
  PUBLIC
    $<$<COMPILE_LANGUAGE:CXX>: -Wall -Wextra -fsanitize=address,undefined>
    $<$<COMPILE_LANGUAGE:CUDA>: -Wall -Wextra>
)

# 链接时仅对CPU代码应用ASAN
target_link_libraries(sampleProgram
  stdc++fs
  $<$<COMPILE_LANGUAGE:CXX>: -fsanitize=address,undefined>
)

set_property(TARGET sampleProgram PROPERTY CUDA_ARCHITECTURES 52 60 61 70 75 86)

补充说明

  • 生成器表达式$<$<COMPILE_LANGUAGE:CXX>: ...>会确保ASAN选项只作用于C++编译单元,CUDA代码不受影响。
  • CUDA Runtime和ASAN存在兼容性限制:ASAN无法检测GPU内存问题,强行对CUDA代码启用ASAN会导致驱动与Runtime的交互异常,这是官方明确提及的限制。
  • 若仍有问题,可尝试添加环境变量ASAN_OPTIONS=protect_shadow_gap=0,部分场景下该选项能缓解ASAN对驱动内存区域的拦截冲突。

内容的提问来源于stack exchange,提问作者Bartvbl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 13:01:41