CUDA 是 NVIDIA 推出的并行计算平台和编程模型。CUDA C 程序包含两部分:
__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);
int idx = threadIdx.x + blockIdx.x * blockDim.x;
| 变量 | 说明 |
|---|---|
| threadIdx.x | 线程在 block 内的编号 |
| blockIdx.x | block 在 grid 中的编号 |
| blockDim.x | 每个 block 的线程数 |
| gridDim.x | grid 中的 block 数 |
int *d_a;
cudaMalloc((void**)&d_a, N * sizeof(int));
cudaMemcpy(d_a, h_a, size, cudaMemcpyHostToDevice); // 主机到设备
cudaMemcpy(h_a, d_a, size, cudaMemcpyDeviceToHost); // 设备到主机
cudaFree(d_a);
调用核函数时通过 <<<gridSize, blockSize>>> 设置执行规模:
int blockSize = 256;
int gridSize = (N + blockSize - 1) / blockSize;
myKernel<<<gridSize, blockSize>>>(args...);
| 类型 | 说明 | 访问范围 |
|---|---|---|
| Global Memory | 全局大容量内存 | 所有线程可访问 |
| Shared Memory | 同一个 block 的线程共享 | block 内共享 |
| Local Memory | 线程私有临时变量 | 线程私有 |
| Constant Memory | 设备常量存储(只读) | 所有线程可读 |
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 | 设备内存管理 |