国产加速器DCU采用ROCm软件栈作为基础支撑。ROCm(Radeon Open Computing Platform)是首个开源的GPU通用计算平台,是一种轻量级、模块化的GPU软件开发环境,可以提供多种开发工具和运行时环境。ROCm拥有丰富的系统关键功能组件支持,可适用于大规模应用程序计算,编译器及程序运行时组件开发。
ROCm中每个组件根据其功能自底向上构建出了完整的平台功能,使得开发者可以方便快捷在CPU、DCU、GPU等设备上开发支持异构计算的应用程序。各组件对下层功能进行封装,并对上层提供必须的功能.
上图展示ROCm组件结构,自底向上分别为加速器驱动ROCk、运行时系统ROCt和ROCr、HIP并行编程模型和基础数学库,同时还有管理工具、优化和调试工具。除HIP并行编程模型外,ROCm还提供对OpenCL和C++ AMP并行编程模型的支持。ROCm各组件整体支撑起各领域应用程序。
与CUDA相比,ROCm拥有完善的软件生态,下图展示CUDA生态组件结构与ROCm生态组件的对比:
由于CUDA主要组件均闭源,上图中以CUDA部分以相关文献中公布的组件为基础。构成CUDA的主要系统组件为CUDA Driver、CUDA Runtime和CUDA Library。从ROCm和CUDA组件层次对比可以看出,CUDA Driver对应了ROCm中ROCk和ROCt组件,表示内核态驱动及其封装的接口,这些接口在CUDA中定义为CUDA Driver API,在ROCm中则以ROCt组件所提供的API为接口。内核态驱动随启动而加载。内核态驱动之上是用户态驱动,在CUDA中即CUDA Runtime,对应的接口为CUDA Runtime API;其对应了ROCm中HIP Runtime或其他编程模型的Runtime。用户态驱动,也称运行系统是随异构程序启动而加载的,负责上层资源管理和调度。
目前ROCm支持2种异构并行编程模型分别是HIP和OpenCL,均提供了相应的开发组件和运行时环境支持。HIP(Heterogeneous-Compute Interface for Portability)是ROCm软件栈中的最主要的异构并行编程模型,它定义了一种可以同时在多个平台(包括Nvidia GPU、DCU等)下编译运行的编程模型。通过HIP提供的hipifiy工具可以将CUDA源代码转化为由HIP所定义的编程模型,HIP编译器会根据当前系统环境选择对应的平台作为HIP源码编译的目标。HIP的数据结构和接口模型与CUDA保持高度一致,核函数语法结构也基本相同。
ROCm提供了HIPCC编译器实现异构代码的编译,HIPCC同时包含的对Clang和NVCC编译器的调用,以实现平台选择编译。与CUDA所使用编译器NVCC相同,HIPCC对DCU异构程序同样将主机端代码和设备端代码分开编译,最终组成可在DCU上运行的可执行文件。主机端代码和设备端代码均由Clang进行编译。Clang是基于LLVM的编译器,Clang会将所支持的C/C++和其他扩展语言代码编译为LLVM支持的中间层表示IR,然后根据编译设定,由对应LLVM编译器后端分别生成主机端可执行代码和设备端可执行代码,最终两部分代码合并组成可在DCU异构平台上运行的可执行程序。
在ROCm生态中,提供了丰富了针对HIP并行编程模型的数学库和优化调试工具,以供开发者使用高效的库函数完成程序设计,并进行代码调试和优化。
下述表描述了ROCm生态中的主要数学库功能和其对应的CUDA相同功能的数学库。
HIP数学库 | CUDA数学库 | 数学库功能 |
---|---|---|
hipblas | cublas | 基础矩阵运算数学库 |
hiprand | curand | 随机数数学库 |
hipsparse | cusparse | 稀疏矩阵数学库 |
hipfft | cufft | 快速傅利叶变换数学库 |
miopen | cudnn | 深度学习基础数学库 |
hipcub | cub | 基础算法库 |
rccl | nccl | 通信库 |
rocThrust | Thrust | 并行库 |
下述表2描述了ROCm生态中的主要优化和调试工具。除此之外,ROCm还提供了rocm-smi管理工具,以便开发者查看系统中DCU的状态。
工具名称 | 作用 |
---|---|
rocprofiler | 用于程序分析和绘制时间线 |
roctracer | 用于跟踪程序 |
以上构建出整个ROCM软件生态环境。