CUDA 编程简介
在本文中,我们将介绍 CUDA 编程的概述,主要关注 CUDA 需求的概念,我们还将讨论 CUDA 的执行模型。最后,我们将看到应用程序。让我们一一讨论。
CUDA 代表计算统一设备架构。它是 C/C++ 编程的扩展。 CUDA 是一种使用图形处理单元 (GPU) 的编程语言。它是一个并行计算平台和 API(应用程序编程接口)模型,Compute Unified Device Architecture 由 Nvidia 开发。这允许并行执行计算,同时提供良好的速度。使用 CUDA,可以利用 Nvidia GPU 的强大功能来执行常见的计算任务,例如处理矩阵和其他线性代数运算,而不是简单地执行图形计算。
为什么我们需要 CUDA?
- GPU 旨在执行高速并行计算以显示游戏等图形。
- 使用可用的 CUDA 资源。已经部署了超过 1 亿个 GPU。
- 对于某些应用,它比其他微处理器提供 30-100 倍的加速。
- 与稍大的 CPU 相比,GPU 具有非常小的算术逻辑单元 (ALU)。这允许许多并行计算,例如计算屏幕上每个像素的颜色等。
CUDA的架构
- 16 个流式多处理器 (SM) 图如上图所示。
- 每个流式多处理器有 8 个流式处理器 (SP),即我们总共有 128 个流式处理器 (SP)。
- 现在,每个 Streaming 处理器都有一个 MAD 单元(乘法和加法单元)和一个附加的 MU(乘法单元)。
- GT200 拥有 240 个流处理器 (SP),以及超过 1 TFLOP 的处理能力。
- 每个流处理器都有优雅的线程,每个应用程序可以运行数千个线程。
- G80 卡支持每个流式多处理器 768 个线程(注意:不是每个 SP)。
- 最终,在每个 Streaming Multiprocessor 有 8 个 SP 之后,每个 SP 最多支持 96 个线程。可以运行的总线程数 – 128 * 96 = 12,228 次。
- 因此这些处理器被称为大规模并行。
- G80 芯片的内存带宽为 86.4GB/s。
- 它还具有与 CPU 的 8GB/s 通信通道(4GB/s 用于上传到 CPU RAM,4GB/s 用于从 CPU RAM 下载)。
CUDA 是如何工作的?
- GPU 一次运行一个内核(一组任务)。
- 每个内核由块组成,这些块是独立的 ALU 组。
- 每个块都包含线程,它们是计算级别。
- 每个块中的线程通常一起工作以计算一个值。
- 同一块中的线程可以共享内存。
- 在 CUDA 中,从 CPU 向 GPU 发送信息通常是计算中最典型的部分。
- 对于每个线程,本地内存是最快的,其次是共享内存,全局内存、静态内存和纹理内存最慢。
工作如何分配?
- 每个线程“知道”它所在块的 x 和 y 坐标,以及它在块中的坐标。
- 这些位置可用于计算每个线程的唯一线程 ID。
- 完成的计算工作将取决于线程 ID 的值。
例如,线程 ID 对应于一组矩阵元素。
CUDA 应用程序
CUDA 应用程序必须对大量数据运行并行操作,并且是处理密集型的。
- 计算金融
- 气候、天气和海洋建模
- 数据科学与分析
- 深度学习和机器学习
- 国防和情报
- 制造/AEC
- 媒体和娱乐
- 医学影像
- 油和气
- 研究
- 安全和安保
- 工具和管理
CUDA 的好处
与具有图形 API 的传统通用图形处理器 (GPU) 计算机相比,CUDA 具有以下几个优势:
- 集成内存(CUDA 6.0 或更高版本)和集成虚拟内存(CUDA 4.0 或更高版本)。
- 共享内存为 CUDA 线程提供了一个快速的共享内存区域。它可以用作缓存机制,并提供比纹理查找更多的带宽。
- 可以从内存中的任何地址读取分散的读取代码。
- 改进了下载和读取的性能,这在 GPU 和 GPU 上运行良好。
- CUDA 完全支持按位和整数运算。
CUDA 的局限性
- CUDA 源代码在主机或 GPU 上给出,由 C++ 语法规则定义。 CUDA 的长期版本使用 C 语法规则,这意味着最新的 CUDA 源代码可能会也可能不会按要求工作。
- CUDA 与 OpenGL 等转让语言具有单方面的互操作性(计算机系统或软件交换和利用信息的能力)。 OpenGL 可以访问 CUDA 注册内存,但 CUDA 不能访问 OpenGL 内存。
- CUDA 的后续版本不为旧版本提供模拟器或回退支持。
- CUDA 仅支持 NVIDIA 硬件。