//cuda
#include <stdio.h>
__global__ void add(int *a, int *b, int *c) {
c[blockIdx.x] = a[blockIdx.x] + b[blockIdx.x];
}
#define N 512
int main() {
int a[N], b[N], c[N];
int *dev_a, *dev_b, *dev_c;
// 在 GPU 上分配内存
cudaMalloc((void**)&dev_a, N * sizeof(int));
cudaMalloc((void**)&dev_b, N * sizeof(int));
cudaMalloc((void**)&dev_c, N * sizeof(int));
// 初始化数组 a 和 b
for (int i = 0; i < N; i++) {
a[i] = i;
b[i] = i * i;
}
// 将数组 a 和 b 复制到 GPU
cudaMemcpy(dev_a, a, N * sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(dev_b, b, N * sizeof(int), cudaMemcpyHostToDevice);
// 调用 GPU 函数
add<<<N, 1>>>(dev_a, dev_b, dev_c);
// 将结果从 GPU 复制回主机
cudaMemcpy(c, dev_c, N * sizeof(int), cudaMemcpyDeviceToHost);
// 打印结果
for (int i = 0; i < N; i++) {
printf("%d + %d = %d\n", a[i], b[i], c[i]);
}
// 释放 GPU 内存
cudaFree(dev_a);
cudaFree(dev_b);
cudaFree(dev_c);
return 0;
}
以下是几个基本的 CUDA 操作和概念:
1. **Kernel 函数**:在 CUDA 中,您可以定义一个称为 Kernel 函数的函数,它在 GPU 上并行执行。Kernel 函数由 `__global__` 修饰符标记。
2. **Grid 和 Block**:CUDA 使用网格(Grid)和块(Block)的概念来组织线程。Grid 是由多个块组成,每个块又包含多个线程。Grid 和 Block 的维度可以是一维、二维或三维。
3. **CUDA 内存管理**:CUDA 提供了不同类型的内存,如全局内存、共享内存和常量内存。了解如何在主机和设备之间传输数据,以及如何在 GPU 上分配和释放内存是很重要的。
4. **CUDA 核心函数**:CUDA 提供了一些核心函数,如 `cudaMalloc`(分配内存)、`cudaMemcpy`(内存传输)、`cudaFree`(释放内存)等,这些函数对于管理 GPU 内存非常重要。
5. **线程同步**:在 CUDA 中,您可能需要使用同步操作来协调线程之间的执行。CUDA 提供了原子操作和同步函数来实现线程同步。
6. **共享内存**:共享内存是一种高速缓存内存,可以在块内的线程之间共享数据。合理地使用共享内存可以提高程序的性能。
7. **错误处理**:学习如何处理 CUDA 函数返回的错误代码是很重要的,这可以帮助您调试和优化 CUDA 程序。