1. 初始化 GPU
创建一个 CUDA 上下文,用于管理 GPU 资源。
分配 GPU 内存。
2. 转换数据到 GPU
将数据从主机内存(CPU)复制到 GPU 内存(显存)。
3. 编写内核
内核是 GPU 上运行的并行函数。
内核指定如何处理数据。
4. 编译和加载内核
使用 CUDA 编译器编译内核。
将编译后的内核加载到 GPU。
5. 启动内核
调用 cudaLaunchKernel() 函数启动内核。
指定内核函数、线程块配置和数据指针。
6. 同步内核
使用 cudaDeviceSynchronize() 函数等待内核完成执行。
7. 转换数据回主机
将数据从 GPU 内存复制回主机内存。
8. 释放 GPU 资源
释放 GPU 内存。
销毁 CUDA 上下文。
示例代码 (C++)
cpp
#include
__global__ void add(int a, int b, int c, int n) {
int idx = threadIdx.x;
c[idx] = a[idx] + b[idx];
}
int main() {
// CUDA 初始化
cudaInit();
// 分配设备内存
int a_dev, b_dev, c_dev;
cudaMalloc(&a_dev, n sizeof(int));
cudaMalloc(&b_dev, n sizeof(int));
cudaMalloc(&c_dev, n sizeof(int));
// 转换数据到 GPU
cudaMemcpy(a_dev, a, n sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(b_dev, b, n sizeof(int), cudaMemcpyHostToDevice);
// 编译和加载内核
cudaDeviceCompile(add, ...);
// 启动内核
cudaLaunchKernel(add, gridDim, blockDim, ...);
// 同步内核
cudaDeviceSynchronize();
// 转换数据回主机
cudaMemcpy(c, c_dev, n sizeof(int), cudaMemcpyDeviceToHost);
// 释放资源
cudaFree(a_dev);
cudaFree(b_dev);
cudaFree(c_dev);
cudaDeviceReset();
}
优势
并行性:GPU 可以同时执行数千个线程,从而显著提高计算速度。
内存带宽:GPU 具有比 CPU 高得多的内存带宽,可以快速访问大量数据。
专用处理:GPU 专为图形处理而设计,在执行某些计算任务(如矩阵乘法)方面具有优势。
应用
GPU 用于各种应用,包括:
图形处理
科学计算
机器学习
数据分析