CUDA,CUDA runtime等概念辨析

Alice Yu Lv3

CUDA包含的核心组件

  • CUDA C/C++语言拓展(现在最新的还支持python了,nv真的强)
  • CUDA工具链:nvcc,nsight等
  • CUDA driver API:底层驱动接口,直接操作GPU硬件

CUDA runtime

  • 是CUDA架构中的软件中间层,是CUDA driver API的封装
  • 比如提供了cudaMalloc/cudaMemcpy等函数
  • 说白了就是各种.so,dll等动态链接库、头文件、CUDA Driver API库(libcuda.so或nvcuda.dll)
  • 一个简化的工作流程:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    // 示例:CPU调用CUDA Runtime API完成向量加法
    #include <cuda_runtime.h>

    __global__ void addVectors(float *a, float *b, float *c, int n) {
    int i = threadIdx.x + blockIdx.x * blockDim.x;
    if (i < n) c[i] = a[i] + b[i];
    }

    int main() {
    int n = 1024;
    float *h_a, *h_b, *h_c; // 主机内存
    float *d_a, *d_b, *d_c; // 设备显存

    // 1. Runtime分配显存
    cudaMalloc(&d_a, n * sizeof(float));
    cudaMalloc(&d_b, n * sizeof(float));
    cudaMalloc(&d_c, n * sizeof(float));

    // 2. 数据从主机复制到设备(Runtime管理传输)
    cudaMemcpy(d_a, h_a, n * sizeof(float), cudaMemcpyHostToDevice);
    cudaMemcpy(d_b, h_b, n * sizeof(float), cudaMemcpyHostToDevice);

    // 3. 启动GPU内核(Runtime调度执行,runtime将内核交给CUDA driver)
    addVectors<<<ceil(n/256.0), 256>>>(d_a, d_b, d_c, n);

    // 4. 数据从设备复制回主机(Runtime同步等待完成)
    cudaMemcpy(h_c, d_c, n * sizeof(float), cudaMemcpyDeviceToHost);

    // 5. Runtime释放显存
    cudaFree(d_a);
    cudaFree(d_b);
    cudaFree(d_c);
    return 0;
    }

CUDA driver

  • 是CUDA架构中的底层驱动接口,直接操作GPU硬件
  • 比如提供了cuMemAlloc/cuMemcpy等函数
目录
CUDA,CUDA runtime等概念辨析