CUDA编程需配置NVIDIA驱动和Toolkit,使用__global__定义核函数,通过grid和block配置并行线程,管理主机与设备间内存传输,实现如向量加法等并行计算任务。

CUDA 是 NVIDIA 推出的并行计算平台和编程模型,允许开发者使用 C++ 编写在 GPU 上运行的高性能代码。通过 CUDA,你可以将计算密集型任务从 CPU 卸载到 GPU,大幅提升执行效率。下面介绍如何用 C++ 进行 CUDA 编程,包括环境搭建、核函数编写以及基本的内存管理。
配置开发环境
要开始 CUDA 编程,你需要:
- 一台支持 CUDA 的 NVIDIA 显卡
- 安装对应版本的 NVIDIA 驱动
- 安装 CUDA Toolkit(包含编译器 nvcc、库和头文件)
- 推荐使用支持 CUDA 的 IDE,如 Visual Studio(Windows)或 VS Code / CLion(Linux/macOS)
安装完成后,可以通过命令 nvcc --version 检查是否安装成功。
编写第一个 CUDA 程序:向量加法
下面是一个简单的 C++ CUDA 程序,实现两个数组的并行加法:
立即学习“C++免费学习笔记(深入)”;
#include iostream>#include
// 核函数:在 GPU 上执行
__global__ void addVectors(float* a, float* b, float* c, int n) {
int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx c[idx] = a[idx] + b[idx];
}
}
int main() {
const int N = 1 const int size = N * sizeof(float);
// 主机内存分配
float *h_a = (float*)malloc(size);
float *h_b = (float*)malloc(size);
float *h_c = (float*)malloc(size);
// 初始化数据
for (int i = 0; i h_a[i] = i * 1.0f;
h_b[i] = i * 2.0f;
}
// 设备内存分配
float *d_a, *d_b, *d_c;
cudaMalloc(&d_a, size);
cudaMalloc(&d_b, size);
cudaMalloc(&d_c, size);
// 主机到设备内存拷贝
cudaMemcpy(d_a, h_a, size, cudaMemcpyHostToDevice);
cudaMemcpy(d_b, h_b, size, cudaMemcpyHostToDevice);
// 配置核函数执行参数
int blockSize = 256;
int gridSize = (N + blockSize - 1) / blockSize;
addVectors>>(d_a, d_b, d_c, N);
// 等待 GPU 执行完成
cudaDeviceSynchronize();
// 结果从设备拷贝回主机
cudaMemcpy(h_c, d_c, size, cudaMemcpyDeviceToHost);
// 验证结果(例如前几个)
for (int i = 0; i std::cout }
// 释放内存
free(h_a); free(h_b); free(h_c);
cudaFree(d_a); cudaFree(d_b); cudaFree(d_c);
return 0;
}
理解核函数与执行配置
__global__ 函数是核函数,由主机调用,在设备(GPU)上执行。其调用语法为:
kernel_name>>(args);
- blockSize:每个线程块中的线程数(如 256)
- gridSize:线程块的数量
- 总线程数 = gridSize × blockSize
- 每个线程通过 threadIdx.x + blockIdx.x * blockDim.x 计算唯一索引
这种结构使每个线程独立处理数组中的一个元素,实现数据并行。
内存管理与错误检查
CUDA 使用不同的内存空间:
- 主机内存:malloc / free
- 设备内存:cudaMalloc / cudaFree
- 数据传输使用 cudaMemcpy,注意方向(HostToDevice 或 DeviceToHost)
建议加入错误检查以调试问题:
#define CUDA_CHECK(call) \do { \
cudaError_t err = call; \
if (err != cudaSuccess) { \
std::cerr exit(1); \
} \
} while(0)
用 CUDA_CHECK(cudaMemcpy(...)) 替代裸调用,能快速定位错误。
基本上就这些。掌握核函数结构、内存管理和执行配置后,就可以开始编写更复杂的并行算法,比如矩阵乘法、图像处理或深度学习算子。CUDA 虽然有一定学习曲线,但对性能提升非常显著。不复杂但容易忽略的是线程索引边界检查和内存对齐问题,写代码时多留意。










