CUDA编程实例可以展示如何在NVIDIA的GPU上利用并行计算能力来加速计算密集型任务。以下是一个简单的CUDA编程实例,该实例实现了两个整型向量相加的操作:
#include <cuda_runtime.h>
#include <stdio.h>
// 定义CUDA核函数,用于计算向量相加
__global__ void add(int *c, int *a, int *b) {
int index = threadIdx.x + blockIdx.x * blockDim.x;
if (index < N) {
c[index] = a[index] + b[index];
}
}
int main() {
int N = 1024; // 向量大小
size_t size = N * sizeof(int);
int *h_a = new int[N], *h_b = new int[N], *h_c = new int[N];
// 初始化h_a和h_b
for (int i = 0; i < N; i++) {
h_a[i] = i;
h_b[i] = i * 2;
}
int *d_a, *d_b, *d_c;
// 分配GPU内存
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);
// 计算网格和线程块大小
int blockSize = 256;
int gridSize = (int)ceil((float)N / blockSize);
// 调用核函数
add<<<gridSize, blockSize>>>(d_c, d_a, d_b);
// 将结果从设备内存复制回主机内存
cudaMemcpy(h_c, d_c, size, cudaMemcpyDeviceToHost);
// 检查结果
for (int i = 0; i < N; i++) {
printf("%d + %d = %d\n", h_a[i], h_b[i], h_c[i]);
}
// 清理
cudaFree(d_a);
cudaFree(d_b);
cudaFree(d_c);
delete[] h_a;
delete[] h_b;
delete[] h_c;
return 0;
}
在这个实例中,我们定义了一个CUDA核函数add
,它接受三个参数:指向结果向量c
、输入向量a
和b
的指针。在核函数内部,每个线程计算一个结果元素,线程索引通过threadIdx.x
(当前线程在线程块内的索引)和blockIdx.x
(当前线程块在网格内的索引)以及blockDim.x
(线程块内的线程数)计算得出。
主函数中,我们首先定义了向量大小N
,并分配了主机内存来存储向量a
、b
和c
。然后,我们初始化这些向量,并使用cudaMalloc
函数为它们在GPU上分配内存。接着,我们使用cudaMemcpy
函数将主机内存中的数据传输到设备内存。
之后,我们计算了网格和线程块的大小,并调用了核函数add
。计算完成后,我们将结果从设备内存复制回主机内存,并打印出来进行验证。
最后,我们释放了分配的内存资源。
请注意,这只是一个简单的CUDA编程实例,用于展示CUDA编程的基本结构。在实际应用中,你可能需要考虑更复杂的错误处理和性能优化。
此外,还有使用Python进行CUDA编程的实例,如使用Numba或PyCUDA库。这些库提供了更高级别的接口,使得在Python中进行CUDA编程变得更加方便和灵活。