📜  cuda 版本 (1)

📅  最后修改于: 2023-12-03 14:40:23.684000             🧑  作者: Mango

CUDA 版本介绍

CUDA(Compute Unified Device Architecture,通用计算架构)是由 NVIDIA 公司推出的 GPU 编程平台和 API,它能够充分利用 NVIDIA 显卡的强大并行计算能力,加速复杂计算任务,提高计算机系统的性能。

CUDA 版本历史

CUDA 平台自发布以来,经历了数次重大版本升级,以下是 CUDA 版本的历史记录。

  • CUDA 1.0:2007 年 6 月发布。
  • CUDA 2.0:2008 年 3 月发布,支持高级纹理、64 位浮点运算、共享内存等特性。
  • CUDA 3.0:2009 年 6 月发布,增加了多进程共享显存、全局内存通信等特性。
  • CUDA 4.0:2011 年 2 月发布,引入了统一虚拟内存、GPU 代码调试器等新功能。
  • CUDA 5.0:2012 年 5 月发布,支持动态并行性、超过 100 个新的 GPU 高级 API 等。
  • CUDA 6.0:2014 年 4 月发布,引入了 GPU Boost 2.0、Unified Memory 等重要特性。
  • CUDA 7.0:2015 年 4 月发布,支持全局内存原子操作,带宽测试和互操作性功能的改进。
  • CUDA 8.0:2016 年 10 月发布,支持无需主机代码修改的即插即用式深度学习,引入了 Pascal 架构支持和简洁的 C++ 前端。
  • CUDA 9.0:2017 年 9 月发布,首次支持流化多个内核的异步执行,支持 CUDA 图形学和 OpenCV。
  • CUDA 10.0:2018 年 9 月发布,引入来自 Turing 架构的新特性,支持划时代的光线追踪技术。
  • CUDA 11.0:2020 年 9 月发布,加入数据层次化的Programming模型,包含CUDA Graph, Math Libraries,缩减开发者的状态数据存储负担。
使用CUDA编写程序

使用 CUDA 编写程序可以加速计算密集型的任务,如图像处理、物理仿真和机器学习等,以下是使用 CUDA 编写程序的基本步骤。

  1. 安装CUDA SDK:首先需要从 NVIDIA 官网下载并安装 CUDA SDK,安装完成后会包含一系列的 CUDA 相关开发工具和库文件。

  2. 创建 CUDA 项目:在编写 CUDA 程序前,需要创建一个 CUDA 项目,可以使用 Visual Studio、Eclipse 等 IDE 实现。

  3. 编写 CUDA 核函数:核函数是在 GPU 上运行的函数,可以使用 CUDA 编写与 CPU 代码类似的 C 代码,同时加上 CUDA 的扩展指令和语法。

  4. 在主机端调用 CUDA 核函数:在编写程序的主机端,可以使用 CUDA API 函数来调用核函数,并将需要计算的数据传递给核函数。

  5. 处理结果数据:核函数计算完成后,将结果数据传回主机端,并进行后续的处理和输出。

CUDA 示例代码

下面是一个简单的 CUDA 示例程序,它计算两个向量的点积。

#include <stdio.h>

// CUDA 核函数:计算点积
__global__ void DotProduct(float *a, float *b, float *c) {
    __shared__ float cache[256];
    int tid = threadIdx.x + blockIdx.x * blockDim.x;
    float tmp = 0;
    while (tid < N) {
        tmp += a[tid] * b[tid];
        tid += blockDim.x * gridDim.x;
    }
    cache[threadIdx.x] = tmp;
    __syncthreads();
    int i = blockDim.x / 2;
    while (i != 0) {
        if (threadIdx.x < i) {
            cache[threadIdx.x] += cache[threadIdx.x + i];
        }
        __syncthreads();
        i /= 2;
    }
    if (threadIdx.x == 0) {
        c[blockIdx.x] = cache[0];
    }
}

int main() {
    float *a, *b, *c;
    float *device_a, *device_b, *device_c;
    int size = N * sizeof(float);
    a = (float*)malloc(size);
    b = (float*)malloc(size);
    c = (float*)malloc(size);
    cudaMalloc(&device_a, size);
    cudaMalloc(&device_b, size);
    cudaMalloc(&device_c, size);
    for (int i = 0; i < N; i++) {
        a[i] = i;
        b[i] = N - i;
    }
    cudaMemcpy(device_a, a, size, cudaMemcpyHostToDevice);
    cudaMemcpy(device_b, b, size, cudaMemcpyHostToDevice);
    int numBlocks = 1;
    int blockSize = 256;
    DotProduct<<<numBlocks, blockSize>>>(device_a, device_b, device_c);
    cudaMemcpy(c, device_c, size, cudaMemcpyDeviceToHost);
    float result = 0;
    for (int i = 0; i < numBlocks; i++) {
        result += c[i];
    }
    printf("Dot product of two vectors is %f\n", result);
    cudaFree(device_a);
    cudaFree(device_b);
    cudaFree(device_c);
    free(a);
    free(b);
    free(c);
    return 0;
}

上述代码中,核函数 DotProduct 计算点积,并使用共享内存对数据进行优化,主机端使用 CUDA API 函数 cudaMemcpy 在主机端和设备端之间拷贝数据,最终计算结果传回主机端。