使用C++进行CUDA编程需配置支持CUDA的显卡和开发环境,编写包含主机与设备代码的程序,通过核函数在GPU上并行执行任务,如向量加法示例所示。

CUDA 是 NVIDIA 推出的并行计算平台和编程模型,允许开发者使用 C++ 语言直接调用 GPU 进行高性能计算。在 C++ 中使用 CUDA 编程,需要通过 NVIDIA 提供的 CUDA Toolkit,在支持 CUDA 的 GPU 上运行并行任务。以下是使用 C++ 进行 CUDA GPU 编程的基本方法和步骤。
1. 准备开发环境
要开始 CUDA 编程,必须满足以下条件:
- 一块支持 CUDA 的 NVIDIA 显卡
- 安装最新版的 CUDA Toolkit(从 NVIDIA 官网下载)
- 支持 CUDA 的编译器(如 NVCC,它是 CUDA 的专用编译器)
- 开发环境推荐使用 Visual Studio(Windows)或 GCC(Linux)配合 NVCC
安装完成后,可以通过命令 nvcc --version 检查是否安装成功。
2. 编写第一个 CUDA 程序
一个典型的 CUDA 程序包含主机代码(Host Code,运行在 CPU 上)和设备代码(Device Code,运行在 GPU 上)。设备代码使用 __global__ 关键字定义核函数(Kernel),由主机调用并在 GPU 上执行。
立即学习“C++免费学习笔记(深入)”;
下面是一个简单的向量加法示例:
include iostream>
include
// 核函数:在 GPU 上执行
global void add(int a, int b, int c, int n) {
int idx = blockIdx.x blockDim.x + threadIdx.x;
if (idx
c[idx] = a[idx] + b[idx];
}
}
int main() {
const int n = 1024;
const int size = n sizeof(int);
// 主机内存分配
int h_a = (int)malloc(size);
int h_b = (int)malloc(size);
int h_c = (int)malloc(size);
// 初始化数据
for (int i = 0; i
h_a[i] = i;
h_b[i] = i 2;
}
// 设备内存分配
int 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);
// 配置执行配置:Grid 和 Block
int blockSize = 256;
int gridSize = (n + blockSize - 1) / blockSize;
add>>(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;
}
3. 理解关键概念
在上面的例子中,涉及几个核心概念:
- 核函数(Kernel):用 __global__ 修饰的函数,从主机调用,在设备(GPU)上并行执行。
-
线程组织结构:
- threadIdx.x:线程在线程块内的索引
- blockIdx.x:线程块在整个 grid 中的索引
- blockDim.x:每个 block 中的线程数
- 执行配置 >>:指定启动 kernel 时的网格大小和块大小。
-
内存管理:
- cudaMalloc:在 GPU 上分配内存
- cudaMemcpy:在主机与设备之间复制数据
- cudaFree:释放 GPU 内存
4. 编译与运行
保存代码为 vector_add.cu,使用 NVCC 编译:
nvcc vector_add.cu -o vector_add./vector_add
NVCC 能自动处理 .cu 文件中的主机和设备代码,并链接必要的 CUDA 运行时库。
基本上就这些。掌握这些基础后,可以进一步学习共享内存、流(Streams)、纹理内存、CUDA 与 cuBLAS/cuFFT 等库的集成,实现更复杂的并行算法。关键是理解“主机-设备”分离的编程模型和线程并行调度机制。











