【跳坑日记】Jetson 6.2 编译cuda-sample报错:No CMAKE_CUDA_COMPILER could be found

部署运行你感兴趣的模型镜像

前情提要

在刷完 JetPack 6.2 之后,想要验证CUDA是否可以正常使用,本文采用NVIDIA官方cuda-sample项目来验证效果,结果运行时报出No CMAKE_CUDA_COMPILER could be found错误,本文主要着手解决该报错问题。

按照惯例,首先说明报错时运行环境以及对应版本。

环境版本
JetPack6.2
CUDA12.6
CMake3.22.1
硬件设备Jetson AGX Orin 64GB、Jetson Orin NX 16GB

报错过程

首先,英伟达边缘端开发板刷完JetPack 6.2之后,会自带CUDA 12.6 版本(如下图)。

图1:JetPack 6.2 刷机时 CUDA版本截图

若要编译cuda-sample,需要做两件事情,首先在官方github【https://github.com/NVIDIA/cuda-samples】下载源码,用管理员权限拷贝到cuda目录,系统默认地址为【/usr/local/cuda/】或者【/usr/local/cuda-12/】和【/usr/local/cuda-12.6/】都可以,因为前面两个地址都是软连接,指向第三个目录。当然,应该不用拷贝也没事,以上纯属个人习惯以及原来官方默认预设路径。

然后,通过apt安装cmake,我这里以2025年4月14日为截止日期,直接在控制台输入sudo apt install cmake作为编译CUDA样例的版本(即:3.22.1)

此时,万事俱备,可以对示例进行编译。进入cuda-sample目录(我这里要编译deviceQuery,列出设备信息,所以进入【/usr/local/cuda/cuda-samples/Samples/1_Utilities/deviceQuery】目录),命令行输入sudo cmake .,此时,报出如下图错误,也就是如题所示内容。

图2:编译CUDA示例程序报错截图

解决过程

网上搜了挺多资料,有说设置环境变量的,改了当前用户的和系统环境变量(大体思路是指定PATH到cuda的bin目录),无济于事、后来搜到参考链接1的帖子,硕士要设置CUDA值,一开始没明白,一般set的目的就是设置环境变量,后来明白了,其实意思是在当前目录【/usr/local/cuda/cuda-samples/Samples/1_Utilities/deviceQuery】下的CMakeList.txt文件中加入下面这句话。好吧,原谅我对CMake的生疏。确实,我把这句话加到第一行,然后执行就可以正常编译和执行了。

set(CMAKE_CUDA_COMPILER /usr/local/cuda/bin/nvcc)

完整的CMakeLists.txt文件内容如下:

set(CMAKE_CUDA_COMPILER /usr/local/cuda/bin/nvcc)

cmake_minimum_required(VERSION 3.20)

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../../cmake/Modules")

project(deviceQuery LANGUAGES C CXX CUDA)

find_package(CUDAToolkit REQUIRED)

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

set(CMAKE_CUDA_ARCHITECTURES 50 52 60 61 70 72 75 80 86 87 89 90 100 101 120)
set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Wno-deprecated-gpu-targets")
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    # set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -G")  # enable cuda-gdb (expensive)
endif()

# Include directories and libraries
include_directories(../../../Common)

# Source file
# Add target for deviceQuery
add_executable(deviceQuery deviceQuery.cpp)

target_compile_options(deviceQuery PRIVATE $<$<COMPILE_LANGUAGE:CUDA>:--extended-lambda>)

target_compile_features(deviceQuery PRIVATE cxx_std_17 cuda_std_17)

set_target_properties(deviceQuery PROPERTIES CUDA_SEPARABLE_COMPILATION ON)

target_include_directories(deviceQuery PRIVATE
    ${CUDAToolkit_INCLUDE_DIRS}
)

target_link_libraries(deviceQuery PUBLIC
    CUDA::cudart
)

最终,执行完sudo cmake .sudo make命令后,我看到了久违的可执行文件【deviceQuery】,然后执行./deviceQuery之后就如愿看到了下图的内容。

图3:查询设备详细信息命令执行结果截图

感谢大神分享。

参考链接

  1. Jetson Orin AGX上的CUDA开发报错:No CMAKE_CUDA_COMPILER could be found.

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

PyTorch 2.8

PyTorch 2.8

PyTorch
Cuda

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

<think>我们面对的错误是:`CMAKE_CUDA_ARCHITECTURES must be non-empty if set`。这个错误发生在配置包含Caffe2和Torch的项目时,表明CMake要求我们明确指定CUDA架构(即GPU的计算能力版本)。 根据引用[1],我们注意到项目在配置过程中会包含`public/cuda.cmake`,这个文件处理CUDA相关的设置。同时,引用[2]中提到了在CMake参数中设置CUDA标志的方法。 此外,用户已经找到了两个CUDA 12.1的安装路径:`/usr`和`/usr/local/cuda`。我们需要确保CMake使用正确的路径,并明确设置`CMAKE_CUDA_ARCHITECTURES`。 ### 错误原因 CMake在3.18版本之后引入了对CUDA架构的显式要求。如果不设置`CMAKE_CUDA_ARCHITECTURES`,或者设置为空,就会触发这个错误。 ### 解决方法 #### 步骤1:确定目标GPU的计算能力 首先需要确定目标GPU的计算能力(CUDA架构版本)。可以通过以下命令查询: ```bash nvidia-smi --query-gpu=compute_cap --format=csv ``` 或者查看NVIDIA官方文档:https://developer.nvidia.com/cuda-gpus 例如,常见的架构版本有: - Tesla K80: `3.7` - GTX 1080: `6.1` - RTX 2080 Ti: `7.5` - RTX 3090: `8.6` - H100: `9.0` #### 步骤2:在CMake配置中显式设置架构 在运行CMake时,通过`-DCMAKE_CUDA_ARCHITECTURES`参数指定架构版本(多个版本用分号隔开): ```bash cmake -DCMAKE_CUDA_ARCHITECTURES="75;80;86;90" \ -DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda \ ... [其他参数] ... ``` 这里我们指定了`75`(Turing架构)、`80`(Ampere A100)、`86`(Ampere RTX 30系列)和`90`(Hopper)作为示例。 > 注意:建议只包含目标GPU的架构版本,避免不必要的编译时间增加。 #### 步骤3:修复CUDA路径冲突 由于系统中有两个CUDA路径(`/usr`和`/usr/local/cuda`),我们需要明确指定一个。推荐使用`/usr/local/cuda`(通常这是CUDA Toolkit的标准安装路径): ```bash cmake -DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda ... ``` #### 步骤4:在CMakeLists.txt中设置架构(可选) 如果项目允许,可以在`CMakeLists.txt`中直接设置: ```cmake # 在project()调用之前或之后设置 set(CMAKE_CUDA_ARCHITECTURES "75;80;86;90") ``` #### 步骤5:处理多版本CUDA共存的情况 如果系统安装了多个CUDA版本,通过环境变量确保使用正确的版本: ```bash export PATH=/usr/local/cuda-12.1/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-12.1/lib64:$LD_LIBRARY_PATH ``` ### 完整CMake配置示例 假设我们使用CUDA 12.1,目标架构为75和80: ```bash cmake -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_CUDA_ARCHITECTURES="75;80" \ -DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda \ -DCMAKE_C_COMPILER=$(which gcc) \ -DCMAKE_CXX_COMPILER=$(which g++) \ -DCMAKE_CUDA_COMPILER=/usr/local/cuda/bin/nvcc \ .. ``` ### 验证 配置成功后,CMake输出应包含类似信息: ``` -- Found CUDA: /usr/local/cuda (found version 12.1) -- CUDA architectures: 75;80 ``` ### 相关问题 1. 如何确定我的GPU支持哪些CUDA架构? 2.CMake中设置多个CUDA架构版本有什么影响? 3. 如何解决CMake找不到CUDA编译器(nvcc)的问题? 4. 在Docker容器中构建CUDA项目时需要注意哪些关键配置? </think>### 解决 CMake 错误 `CMAKE_CUDA_ARCHITECTURES must be non-empty if set` 该错误表明 CMake 需要明确的 CUDA 架构设置,但当前配置为空。以下是逐步解决方案: --- #### ✅ 步骤 1:确认 GPU 计算能力(关键) 首先查询 GPU 支持的 CUDA 架构版本: ```bash nvidia-smi --query-gpu=compute_cap --format=csv # 输出示例:8.6 (RTX 3090) 或 7.5 (RTX 2080 Ti) ``` 记录输出值(如 `8.6`),这是后续配置的核心参数[^1]。 --- #### ✅ 步骤 2:显式设置架构参数 在 CMake 命令中强制指定架构版本: ```bash cmake \ -DCMAKE_CUDA_ARCHITECTURES="75;80;86" \ # 示例值,替换为您的实际值 -DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda \ # 优先使用此路径 ... ``` 参数说明: - **架构值格式**:`75` = 7.5 (Volta), `80` = 8.0 (Ampere), `86` = 8.6 (Ampere) - **多架构支持**:用分号分隔不同版本(如 `"75;80;86"`) --- #### ✅ 步骤 3:修复 CUDA 路径冲突 选择更标准的 `/usr/local/cuda` 路径: ```bash # 清理旧路径残留 sudo rm -rf /usr/lib/cmake/cuda* # 更新符号链接 sudo ln -sf /usr/local/cuda /usr/cuda ``` --- #### ✅ 步骤 4:修改项目配置文件 在项目的 `CMakeLists.txt` 中添加架构声明: ```cmake # 在 find_package(Torch REQUIRED) 前添加 set(CMAKE_CUDA_ARCHITECTURES "80") # 替换为您的GPU架构值 ``` 或针对多 GPU 环境: ```cmake list(APPEND CMAKE_CUDA_ARCHITECTURES "75" "80" "86") ``` --- #### ✅ 步骤 5:验证 CUDA 配置 创建测试文件 `test_arch.cu`: ```cuda #include <stdio.h> int main() { printf("CUDA Arch: %d\n", __CUDA_ARCH__); return 0; } ``` 编译验证: ```bash nvcc test_arch.cu -o test_arch ./test_arch # 应输出当前架构版本 ``` --- ### 技术原理 此错误源于 CMake 3.18+ 的 CUDA 架构检测机制变更: ```mermaid graph LR A[CMake ≥3.18] --> B[必须显式声明架构] C[旧版本] --> D[自动检测] E[Torch/Caffe2] --> F[严格要求架构参数] ``` 当 `CMAKE_CUDA_ARCHITECTURES` 被定义但为空时,触发此错误[^1]。 --- ### 相关问题 1. **如何确定 NVIDIA GPU 支持的最新 CUDA 架构版本?** 2. **在多 GPU 机器上如何设置混合架构编译?** 3. **CMake 中 `CMAKE_CUDA_ARCHITECTURES` 和 `TORCH_CUDA_ARCH_LIST` 的区别是什么?** 4. **如何为 Jetson 等嵌入式 GPU 设备配置特殊架构?** > 通过上述步骤,项目应能正确识别 CUDA 架构并完成配置。关键点是 **明确指定与您的 GPU 匹配的架构版本值**。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑符石

感谢小主对原创的大力支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值