ArrayFire CPP搭配CUDA报错:无法打开libnvrtc-builtins.so.12.2
问题
在CMake构建依赖ArrayFire的C项目时,ArrayFire无法调用NVIDIA GPU。已安装CUDA Toolkit并遵循ArrayFire官方Linux安装步骤,但运行Google C测试时出现以下错误:
In function compileModule In file src/backend/cuda/compile_module.cpp:297 NVRTC Error(7): NVRTC_ERROR_BUILTIN_OPERATION_FAILURE Log: nvrtc: error: failed to open libnvrtc-builtins.so.12.2. Make sure that libnvrtc-builtins.so.12.2 is installed correctly.
CMake配置如下:
cmake_minimum_required(VERSION 3.27) project(...) set(CMAKE_CXX_STANDARD 17) set(CUDA_TOOLKIT_ROOT_DIR "/usr/local/cuda-11.3") find_package(CUDAToolkit 11.3 REQUIRED) include_directories( ${PROJECT_SOURCE_DIR}/lib/eigen-3.4.0 ${CUDA_TOOLKIT_ROOT_DIR}/include ${ArrayFire_INCLUDE_DIRS} ${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR} ) link_directories( ${CUDA_TOOLKIT_ROOT_DIR}/lib64 ) set(ArrayFire_DIR /opt/ArrayFire-3.9.0-Linux/share/ArrayFire/cmake) find_package(ArrayFire REQUIRED) if(ArrayFire_CUDA_FOUND) add_definitions(-DAF_CUDA) elseif(ArrayFire_OpenCL_FOUND) add_definitions(-DAF_OPENCL) elseif(ArrayFire_CPU_FOUND) add_definitions(-DAF_CPU) endif() add_subdirectory(lib/googletest) add_executable(${PROJECT_NAME} ... my files ) add_executable(run_gs_dbscan_tests ... my files ) set(CUDA_LIBS libcudart.so libcublas.so libcusolver.so ) target_link_libraries(run_gs_dbscan_tests gtest gtest_main ${CUDA_LIBS} ${ArrayFire_LIBRARIES}) target_link_libraries(${PROJECT_NAME} PRIVATE ${CUDA_LIBS} ${ArrayFire_LIBRARIES})
相关环境信息:
nvidia-smi输出:
Mon May 20 12:20:31 2024 +-----------------------------------------------------------------------------------------+ | NVIDIA-SMI 550.54.15 Driver Version: 550.54.15 CUDA Version: 12.4 | |-----------------------------------------+------------------------+----------------------+ | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+========================+======================| | 0 NVIDIA GeForce RTX 3090 Off | 00000000:01:00.0 Off | N/A | | 0% 50C P8 40W / 390W | 16MiB / 24576MiB | 0% Default | | | | N/A | +-----------------------------------------+------------------------+----------------------+ | 1 NVIDIA GeForce RTX 3090 Off | 00000000:4A:00.0 Off | N/A | | 0% 49C P8 37W / 390W | 628MiB / 24576MiB | 0% Default | | | | N/A | +-----------------------------------------+------------------------+----------------------+ +-----------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=========================================================================================| | 0 N/A N/A 1994 G /usr/lib/xorg/Xorg 4MiB | | 0 N/A N/A 2644 G /usr/lib/xorg/Xorg 4MiB | | 1 N/A N/A 1994 G /usr/lib/xorg/Xorg 150MiB | | 1 N/A N/A 2644 G /usr/lib/xorg/Xorg 426MiB | | 1 N/A N/A 2812 G /usr/bin/gnome-shell 24MiB | +-----------------------------------------------------------------------------------------+
nvcc版本:
nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2021 NVIDIA Corporation Built on Mon_May__3_19:15:13_PDT_2021 Cuda compilation tools, release 11.3, V11.3.109 Build cuda_11.3.r11.3/compiler.29920130_0
解决方法
核心问题定位
错误提示找不到libnvrtc-builtins.so.12.2,本质是CUDA版本冲突:系统NVIDIA驱动对应CUDA 12.4,但项目绑定了CUDA 11.3,导致运行时加载的NVRTC库版本与项目依赖不匹配。
具体修复步骤
统一CUDA版本(推荐)
- 升级CUDA Toolkit到12.2或12.4,与当前驱动版本匹配(新驱动对RTX3090的兼容性更好)。
- 升级后修改CMake中的
CUDA_TOOLKIT_ROOT_DIR为新的CUDA路径(如/usr/local/cuda-12.4)。
临时修复环境变量
若暂时无法升级CUDA,可强制指定CUDA 11.3的库路径优先加载:export LD_LIBRARY_PATH=/usr/local/cuda-11.3/lib64:$LD_LIBRARY_PATH执行上述命令后再运行测试即可临时生效;如需永久生效,将命令添加到
~/.bashrc或~/.zshrc,再执行source ~/.bashrc。优化CMake配置
替换手动指定CUDA库的方式,改用CUDAToolkit提供的官方目标链接,避免版本错误:# 移除原有的set(CUDA_LIBS...)代码块 # 修改target_link_libraries为以下内容 target_link_libraries(run_gs_dbscan_tests gtest gtest_main CUDA::cudart CUDA::cublas CUDA::cusolver ${ArrayFire_LIBRARIES}) target_link_libraries(${PROJECT_NAME} PRIVATE CUDA::cudart CUDA::cublas CUDA::cusolver ${ArrayFire_LIBRARIES})同时移除
link_directories(${CUDA_TOOLKIT_ROOT_DIR}/lib64),因为find_package(CUDAToolkit)会自动处理库路径。验证ArrayFire兼容性
确保ArrayFire预编译包或源码编译时使用的CUDA版本与项目绑定的CUDA 11.3一致;若使用预编译包,需下载对应CUDA 11.x版本的ArrayFire安装包。
内容的提问来源于stack exchange,提问作者Hugo Phibbs
相关产品推荐
相关产品推荐

