顾文强
顾文强
Published on 2025-01-20 / 3 Visits
0
0

CUDA C++计算实例

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、输入向量ab的指针。在核函数内部,每个线程计算一个结果元素,线程索引通过threadIdx.x(当前线程在线程块内的索引)和blockIdx.x(当前线程块在网格内的索引)以及blockDim.x(线程块内的线程数)计算得出。

主函数中,我们首先定义了向量大小N,并分配了主机内存来存储向量abc。然后,我们初始化这些向量,并使用cudaMalloc函数为它们在GPU上分配内存。接着,我们使用cudaMemcpy函数将主机内存中的数据传输到设备内存。

之后,我们计算了网格和线程块的大小,并调用了核函数add。计算完成后,我们将结果从设备内存复制回主机内存,并打印出来进行验证。

最后,我们释放了分配的内存资源。

请注意,这只是一个简单的CUDA编程实例,用于展示CUDA编程的基本结构。在实际应用中,你可能需要考虑更复杂的错误处理和性能优化。

此外,还有使用Python进行CUDA编程的实例,如使用Numba或PyCUDA库。这些库提供了更高级别的接口,使得在Python中进行CUDA编程变得更加方便和灵活。


Comment