图形处理单元 ( GPU ) 传统上设计用于处理图形计算任务,例如图像和视频处理和渲染、2D 和 3D 图形、矢量化等。 2001 年之后,随着图形处理器上可编程着色器和浮点支持的出现,GPU 上的通用计算变得更加实用和流行。

值得注意的是,它涉及矩阵和向量的问题,包括二维、三维或四维向量。 这些很容易转换为 GPU,以原生速度运行并支持这些类型。 通用 GPU (GPGPU) 的一个重要里程碑是 2003 年,当时两个研究小组独立发现了基于 GPU 的方法来解决 GPU 上的 一般 线性代数问题,其运行速度比 CPU 快。

GPGPU进化

早期将 GPU 用作通用处理器的努力需要根据图形基元重新表述计算问题,这由两个主要的图形处理器 API 支持:OpenGL 和 DirectX。

紧随其后的是 NVIDIA 的 CUDA ,它使程序员能够放弃底层图形概念,转而使用更常见的高性能计算概念,例如 OpenCL 和其他高端框架。 这意味着现代 GPGPU 管道可以利用 GPU 的速度,而无需将数据完全明确地转换为图形形式。

NVIDIA 将 CUDA 描述为一个并行计算平台和应用程序编程接口 (API),它允许软件使用特定的 GPU 进行通用处理。 CUDA 是一个软件层,可以直接访问 GPU 的虚拟指令集和用于执行计算内核的并行计算元素。

不容忽视的是, AMD 在 2016 年推出了自己的通用计算平台,称为 Radeon 开放计算生态系统 ( ROCm )。 ROCm 主要针对独立的专业 GPU,例如 AMD 的 Radeon Pro 系列。 然而,官方支持更为广泛,并扩展到消费级产品,包括游戏 GPU。

与 CUDA 不同,ROCm 软件堆栈可以利用多个领域,例如通用 GPGPU、高性能计算 (HPC) 和异构计算。 它还提供多种编程模型,例如 HIP(基于 GPU 内核的编程)、OpenMP/消息传递接口 (MPI) 和 OpenCL。 这些还支持微架构,包括 RDNA CDNA ,适用于从 AI 和边缘计算到 IoT/IIoT 的无数应用。

NVIDIA 的 CUDA

NVIDIA 的 Tesla 和 RTX 系列中的大多数显卡都配备了一系列 CUDA 内核 (图 1) ,旨在同时处理多项计算。 这些内核类似于 CPU 内核,但它们封装在 GPU 上并且可以并行处理数据。 GPU 中可能嵌入了数千个这样的内核,这使得它们成为非常高效的并行系统,能够将以 CPU 为中心的任务直接卸载到 GPU。

并行计算被描述为将较大的问题分解为较小的、独立的部分的过程,这些部分可以由通过共享内存进行通信的多个处理器同时执行。 然后在完成后将这些组合起来作为整体算法的一部分。 并行计算的主要目标是增加可用的计算能力,以加快应用程序处理和解决问题的速度。

为此,CUDA 架构旨在与 C、C++ 和 Fortran 等编程语言协同工作,使并行程序员更容易使用 GPU 资源。 这与之前的 API(如 Direct3D 和 OpenGL)形成对比,后者需要高级图形编程技能。 CUDA 驱动的 GPU 还通过将此类代码编译为 CUDA 来支持 OpenMP、OpenACC、OpenCL 和 HIP 等编程框架。

与大多数 API、软件开发工具包 (SDK) 和软件堆栈一样,NVIDIA 为前面提到的流行编程语言提供了 库、编译器指令和扩展,这使得编程更容易、更高效。 其中包括 cuSPARCE、NVRTC 运行时编译、GameWorks Physx、MIG 多实例 GPU 支持、cuBLAS 等。

这些软件堆栈中有很大一部分被设计用于处理基于 AI 的应用程序,包括机器学习和深度学习、计算机视觉、对话式 AI 和推荐系统。

计算机视觉应用程序使用深度学习从数字图像和视频中获取知识。 对话式 AI 应用程序帮助计算机通过自然语言理解和交流。 推荐系统利用图像、语言和用户的兴趣来提供有意义和相关的搜索结果和服务。

GPU 加速的深度学习框架为设计和训练自定义神经网络提供了一定程度的灵活性,并为常用的编程语言提供了接口。 每个主要的深度学习框架,如 TensorFlow、PyTorch 等,都已经是 GPU 加速的,因此数据科学家和研究人员可以在没有 GPU 编程的情况下加快速度。

超越 AI 的 CUDA 架构的当前使用包括生物信息学、分布式计算、模拟、分子动力学、医学分析(CTI、MRI 和其他扫描图像应用程序)、加密等。

AMD 的 ROCm 软件堆栈

AMD 的 ROCm (图 2) 软件堆栈类似于 CUDA 平台,只是它是开源的,并使用该公司的 GPU 来加速计算任务。 Radeon Pro W6000 和 RX6000 系列中的最新显卡配备了计算核心、光线加速器(光线追踪)和利用 RDNA 架构进行并行处理的流处理器,包括 GPGPU、HPC、HIP(类 CUDA 编程模型) )、MPI 和 OpenCL。

由于 ROCm 生态系统由开放技术组成,包括框架 (TensorFlow/PyTorch)、库 (MIOpen/Blas/RCCL)、编程模型 (HIP)、互连 (OCD) 和上游 Linux 内核支持,该平台会定期进行优化用于各种编程语言的性能和效率。

AMD 的 ROCm 是为扩展而构建的,这意味着它支持通过远程直接内存访问 (RDMA) 进出服务器节点通信的多 GPU 计算,这提供了直接访问主机内存而无需 CPU 干预的能力。 因此,系统的 RAM 越大,ROCm 可以处理的处理负载就越大。

当驱动程序直接包含 RDMA 对等同步支持时,ROCm 还简化了堆栈,从而简化了应用程序的开发。 此外,它还包括独立于语言并利用 HAS(异构系统架构)运行时 API 的 ROCr 系统运行时,为执行 HIP 和 OpenMP 等编程语言提供了基础。

与 CUDA 一样,ROCm 是 AI 应用程序的理想解决方案,因为一些深度学习框架已经支持 ROCm 后端(例如,TensorFlow、PyTorch、MXNet、ONNX、CuPy 等)。 根据 AMD 的说法,任何 CPU/GPU 供应商都可以利用 ROCm,因为它不是专有技术。 这意味着用 CUDA 或其他平台编写的代码可以移植到供应商中立的 HIP 格式,用户可以从那里为 ROCm 平台编译代码。

该公司提供一系列库、附加组件和扩展以进一步扩展 ROCm 的功能,包括 C++ 编程语言的解决方案 (HCC),允许用户将 CPU 和 GPU 集成到单个文件中。

ROCm 的功能集非常广泛,包括对粗粒度虚拟内存的多 GPU 支持、处理并发和抢占的能力、HSA 信号和原子、DMA 和用户模式队列。 它还提供标准化的加载程序和代码对象格式、动态和离线编译支持、支持 RDMA 的 P2P 多 GPU 操作、跟踪和事件收集 API 以及系统管理 API 和工具。 最重要的是,有一个不断发展的第三方 生态系统 为任何给定的应用程序打包自定义 ROCm 发行版,具有多种 Linux 风格。

本文只是对 NVIDIA 的 CUDA 平台和 AMD 的 ROCm 软件堆栈的简单概述。 深入的信息,包括指南、演练、库等,可以在上面链接的各自网站上找到。

并行计算领域没有顶级平台——每个平台都提供了一个优秀的系统,可以方便地在各个行业开发应用程序。 两者都易于使用,具有直观的菜单、导航元素、可访问的文档和适合初学者的教育材料。

refer: https://www.electronicdesign.com/technologies/embedded-revolution/article/21254328/electronic-design-whats-the-difference-between-cuda-and-rocm-for-gpgpu-apps