📖 推荐阅读:《Yocto项目实战教程:高效定制嵌入式Linux系统》
🎥 更多学习视频请关注 B 站:嵌入式Jerry
Jetson 上的 CUDA 入门全攻略——通俗易懂版
一、前言
在 NVIDIA Jetson 开发板上,CUDA 是释放 GPU 算力的关键工具。它让 GPU 不再只是渲染图形,而是能够加速 AI 推理、图像处理、科学计算等各种并行任务。本文面向初学者,用通俗的语言和流程图,带你快速理解 CUDA 在 Jetson 中的用法,并配合一个实战案例来说明。

二、什么是 CUDA?
CUDA(Compute Unified Device Architecture)是 NVIDIA 提供的 GPU 通用计算平台。它的作用就是让你用 C/C++(甚至 Python)这样的熟悉语言,去编写能在 GPU 上跑的程序。
- CPU:工人不多,但能做各种各样的任务。
- GPU:有成百上千个“小工人”,擅长批量干重复的活。
- CUDA:就是你给这些 GPU 小工人下达任务的工具和语言。
三、CUDA 在 Jetson 上的工作流程
[CPU 分配和准备数据]
↓
[把数据传给 GPU 内存]
↓
[调用 GPU Kernel(成千上万线程并行处理)]
↓
[结果传回 CPU 内存]
↓
[CPU 后续处理或输出结果]
流程图示意
┌─────────┐ ┌─────────────┐ ┌─────────┐
│ CPU │ → │ GPU 内存 │ → │ GPU 核心 │
│(Host) │ │ (Device) │ │ (Threads)│
└─────────┘ └─────────────┘ └─────────┘
↑ ↓ ↑
└────────── 数据回传 ────────────────────┘
四、CUDA 编程的基本结构
在 Jetson 上写 CUDA 程序,一般有 5 个步骤:
- 准备数据(CPU 内存中分配并初始化)
- 分配 GPU 内存(
cudaMalloc) - 拷贝数据到 GPU(
cudaMemcpy) - 在 GPU 上执行 Kernel(
<<<...>>>语法) - 结果拷回 CPU 并释放资源
五、实战案例:向量加法
假设我们要计算两个数组相加:
#include <stdio.h>
__global__ void vectorAdd(const float *A, const float *B, float *C, int N) {
int idx = threadIdx.x + blockIdx.x * blockDim.x;
if (idx < N) C[idx] = A[idx] + B[idx];
}
int main() {
int N = 1<<16; // 65536 元素
size_t size = N * sizeof(float);
// 1. 在 CPU 上分配内存
float *h_A = (float*)malloc(size);
float *h_B = (float*)malloc(size);
float *h_C = (float*)malloc(size);
// 初始化数据
for (int i = 0; i < N; i++) {
h_A[i] = 1.0f;
h_B[i] = 2.0f;
}
// 2. 在 GPU 上分配内存
float *d_A, *d_B, *d_C;
cudaMalloc((void**)&d_A, size);
cudaMalloc((void**)&d_B, size);
cudaMalloc((void**)&d_C, size);
// 3. 把数据从 CPU 拷贝到 GPU
cudaMemcpy(d_A, h_A, size, cudaMemcpyHostToDevice);
cudaMemcpy(d_B, h_B, size, cudaMemcpyHostToDevice);
// 4. 调用 GPU 计算
int threadsPerBlock = 256;
int blocksPerGrid = (N + threadsPerBlock - 1) / threadsPerBlock;
vectorAdd<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_C, N);
// 5. 把结果拷回 CPU
cudaMemcpy(h_C, d_C, size, cudaMemcpyDeviceToHost);
// 验证结果
for (int i = 0; i < 5; i++) {
printf("%f ", h_C[i]); // 预期输出 3.000000
}
printf("\n");
// 释放内存
free(h_A); free(h_B); free(h_C);
cudaFree(d_A); cudaFree(d_B); cudaFree(d_C);
return 0;
}
运行结果示例:
3.000000 3.000000 3.000000 3.000000 3.000000
六、Jetson 上运行 CUDA 程序的步骤
-
安装 JetPack SDK(已包含 CUDA 工具链和驱动)
-
将
.cu源文件放在开发板上 -
使用
nvcc编译:nvcc vectorAdd.cu -o vectorAdd -
运行程序:
./vectorAdd
七、常见问题
- 程序运行但结果不对 → 检查
cudaMemcpy方向参数是否正确 - 提示找不到 nvcc → 可能是 CUDA 未正确安装或路径未添加
- GPU 占用低 → 增加数据规模或优化线程块配置
八、总结
在 Jetson 上使用 CUDA,可以显著提升数据并行任务的执行速度。初学者只要掌握 数据拷贝 + Kernel 启动 这两个核心概念,再配合 NVIDIA 提供的数学库(cuBLAS、cuDNN),就能快速开发出高性能的 AI 应用。
📖 推荐阅读:《Yocto项目实战教程:高效定制嵌入式Linux系统》
🎥 更多学习视频请关注 B 站:嵌入式Jerry
6712

被折叠的 条评论
为什么被折叠?



