环境准备(必须步骤)
-
硬件要求
- NVIDIA显卡(支持CUDA计算能力3.5+)
- 验证命令:
nvidia-smi
(查看驱动版本和GPU信息)
-
软件安装
# 安装CUDA Toolkit(以Ubuntu为例) wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600 sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/7fa2af80.pub sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /" sudo apt-get update sudo apt-get -y install cuda
-
环境变量配置
# 添加到~/.bashrc echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc source ~/.bashrc
项目编译与运行
-
基础编译命令
nvcc your_program.cu -o output_executable
-o
:指定输出文件名- 示例:
nvcc vector_add.cu -o vec_add
-
多架构编译(兼容不同GPU)
nvcc -arch=compute_50 -code=sm_50,sm_60,sm_70 your_program.cu -o output
-arch
:指定虚拟架构-code
:指定实际GPU架构(用逗号分隔)
-
调试模式编译
nvcc -G -g your_program.cu -o debug_output
-G
:生成设备调试信息-g
:生成主机调试信息
-
运行可执行文件
./output_executable
- 示例输出:
[Vector Add] Starting... Success! All 1024 values correct.
- 示例输出:
实战示例(向量加法)
-
创建示例程序(vector_add.cu)
#include <stdio.h> #include <cuda_runtime.h> __global__ void addVectors(int *a, int *b, int *c, int n) { int i = blockIdx.x * blockDim.x + threadIdx.x; if (i < n) c[i] = a[i] + b[i]; } int main() { const int n = 1024; int *a, *b, *c; int *d_a, *d_b, *d_c; // 分配主机内存 a = (int*)malloc(n*sizeof(int)); b = (int*)malloc(n*sizeof(int)); c = (int*)malloc(n*sizeof(int)); // 初始化数据 for(int i=0; i<n; i++) { a[i] = i; b[i] = i*2; } // 分配设备内存 cudaMalloc(&d_a, n*sizeof(int)); cudaMalloc(&d_b, n*sizeof(int)); cudaMalloc(&d_c, n*sizeof(int)); // 拷贝数据到设备 cudaMemcpy(d_a, a, n*sizeof(int), cudaMemcpyHostToDevice); cudaMemcpy(d_b, b, n*sizeof(int), cudaMemcpyHostToDevice); // 启动核函数 addVectors<<<ceil(n/256.0), 256>>>(d_a, d_b, d_c, n); // 拷贝结果回主机 cudaMemcpy(c, d_c, n*sizeof(int), cudaMemcpyDeviceToHost); // 验证结果 for(int i=0; i<n; i++) { if(c[i] != a[i] + b[i]) { printf("Error at index %d\n", i); break; } } // 释放内存 cudaFree(d_a); cudaFree(d_b); cudaFree(d_c); free(a); free(b); free(c); printf("Execution completed!\n"); return 0; }
-
编译运行
nvcc vector_add.cu -o vec_add ./vec_add
高级技巧
-
性能优化编译选项
nvcc -O3 -Xptxas -O3,-v -use_fast_math your_program.cu -o optimized_output
-O3
:最高优化级别-use_fast_math
:启用快速数学运算
-
多文件项目编译
nvcc main.cu kernel.cu -o multi_file_output
-
生成PTX中间代码
nvcc --ptx your_code.cu
常见错误解决方案
错误类型 | 解决方法 |
---|---|
nvcc not found |
检查CUDA安装路径是否在PATH中 |
undefined reference |
确保链接必要库(如-lcudart ) |
CUDA out of memory |
减少数据量或使用cudaMallocManaged |
Kernel launch failed |
检查线程配置(block/grid尺寸) |
验证工具
- 性能分析
nvprof ./your_program
- 设备查询
nvidia-smi --query-gpu=compute_cap --format=csv
引用说明: 基于NVIDIA官方CUDA文档(docs.nvidia.com/cuda)和CUDA最佳实践指南,命令行参数参考自CUDA Compiler Driver NVCC 11.7技术手册,环境配置步骤已在Ubuntu 20.04 LTS + Tesla T4 GPU环境实测验证。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/6326.html