CUDA C 重要语法科普介绍

一、CUDA C 架构简介

CUDA 是 NVIDIA 推出的并行计算平台和编程模型。CUDA C 程序包含两部分:

二、关键语法元素

1. 核函数 __global__

__global__ void add(int *a, int *b, int *c) {
    int idx = threadIdx.x;
    c[idx] = a[idx] + b[idx];
}

调用方式:

add<<<blocksPerGrid, threadsPerBlock>>>(a, b, c);

2. 线程索引获取

int idx = threadIdx.x + blockIdx.x * blockDim.x;
变量说明
threadIdx.x线程在 block 内的编号
blockIdx.xblock 在 grid 中的编号
blockDim.x每个 block 的线程数
gridDim.xgrid 中的 block 数

三、内存管理

1. 分配设备内存

int *d_a;
cudaMalloc((void**)&d_a, N * sizeof(int));

2. 拷贝数据

cudaMemcpy(d_a, h_a, size, cudaMemcpyHostToDevice); // 主机到设备
cudaMemcpy(h_a, d_a, size, cudaMemcpyDeviceToHost); // 设备到主机

3. 释放设备内存

cudaFree(d_a);

四、并行执行配置

调用核函数时通过 <<<gridSize, blockSize>>> 设置执行规模:

int blockSize = 256;
int gridSize = (N + blockSize - 1) / blockSize;
myKernel<<<gridSize, blockSize>>>(args...);

五、CUDA 内存类型

类型说明访问范围
Global Memory全局大容量内存所有线程可访问
Shared Memory同一个 block 的线程共享block 内共享
Local Memory线程私有临时变量线程私有
Constant Memory设备常量存储(只读)所有线程可读

六、常见 CUDA 工具函数

cudaGetDeviceCount(&count);             // 获取 GPU 数量
cudaGetDeviceProperties(&prop, i);      // 获取第 i 个 GPU 属性
cudaSetDevice(i);                       // 选择使用的 GPU
cudaDeviceSynchronize();                // 同步 GPU 与 CPU 操作

七、完整示例:向量加法

__global__ void add(int *a, int *b, int *c) {
    int i = threadIdx.x + blockIdx.x * blockDim.x;
    c[i] = a[i] + b[i];
}

int main() {
    const int N = 512;
    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 < N; i++) {
        h_a[i] = i;
        h_b[i] = i * 2;
    }

    int *d_a, *d_b, *d_c;
    cudaMalloc((void**)&d_a, size);
    cudaMalloc((void**)&d_b, size);
    cudaMalloc((void**)&d_c, size);

    cudaMemcpy(d_a, h_a, size, cudaMemcpyHostToDevice);
    cudaMemcpy(d_b, h_b, size, cudaMemcpyHostToDevice);

    add<<<N/256, 256>>>(d_a, d_b, d_c);

    cudaMemcpy(h_c, d_c, size, cudaMemcpyDeviceToHost);

    for (int i = 0; i < 10; i++) {
        printf("%d + %d = %d\n", h_a[i], h_b[i], h_c[i]);
    }

    cudaFree(d_a); cudaFree(d_b); cudaFree(d_c);
    free(h_a); free(h_b); free(h_c);
    return 0;
}

总结

元素说明
__global__定义 GPU 核函数
<<<grid, block>>>指定并行执行规模
threadIdx / blockIdx索引计算唯一线程 ID
cudaMalloc / cudaMemcpy / cudaFree设备内存管理