AMD ROCm™ Platform
1.1 ROCm简介
参考:https://github.com/RadeonOpenCompute/ROCm
ROCm(Radeon Open Compute)开源软件栈。
在NVIDIA GPU上,术语“CUDA”通常是指GPU编程编译器、API和运行时库,但ROCm不那么单一,通常根据其组件进行描述。
图1显示了ROCm中涉及的主要组件堆栈。
ROCm的顶部面向用户的组件通常是HIPAPI可移植性接口,它与CUDA几乎相同,主要的实际区别只是API函数的名称。
HIP程序中的GPU内核使用LLVM编译器的AMD GPU后端进行编译,并使用ROCclr(ROCm公共语言运行时)运行时库运行。
ROCclr下面是一个实现HSA(异构系统架构)API的低级用户空间库,它创建和管理驱动程序和硬件的内存映射队列和命令。
图 1:ROCm 软件栈的组成部分
ROCm是一个开源软件栈,主要由开源软件(OSS)组成,设计用于图形处理单元(GPU)计算。
ROCm由一组驱动程序、开发工具和api组成,支持从低级内核到最终用户应用程序的GPU编程。使用ROCm,您可以自定义GPU软件以满足您的特定需求。您可以在免费、开源、集成和安全的软件生态系统中开发、协作、测试和部署您的应用程序。
ROCm特别适合gpu加速的高性能计算(HPC)、人工智能(AI)、科学计算和计算机辅助设计(CAD)。
ROCm由AMD的可移植性异构计算接口(HIP)、OSS c++ GPU编程环境及其相应的运行时提供支持。HIP允许ROCm开发人员通过在一系列平台(从专用游戏gpu到百亿亿级HPC集群)上部署代码,在不同的平台上创建便携式应用程序。
ROCm支持编程模型,如OpenMP和OpenCL,并包括所有必要的OSS编译器、调试器和库。ROCm完全集成到机器学习(ML)框架中,如PyTorch和TensorFlow。
1.1.1 ROCm主要组件
ROCm是AMD的开源GPU计算软件堆栈,旨在提供一个可移植、高性能的GPU计算平台。
ROCm支持AMD的GPU和APU,以及x86和ARM架构的处理器,提供了与CUDA相似的编程模型,使得在AMD GPU上编写和运行GPU计算应用程序变得更加容易。
ROCm的主要组件包括:
ROCm驱动程序:用于管理AMD GPU和APU的硬件资源,提供GPU计算所需的基本功能。
ROCm编译器:包括AMD的HIP编译器和HCC编译器,用于将HIP和C++ AMP代码编译为底层GPU指令。
ROCm运行时库:包括AMD的HIP运行时库和HCC运行时库,提供GPU计算所需的核心功能,如内存管理、线程调度、并发控制等。
ROCm工具集:包括AMD的GPU调试器、性能分析器、代码优化工具等,用于帮助开发人员调试和优化GPU计算应用程序。
ROCm的目标是成为一个全面的GPU计算平台,支持各种编程语言和应用场景。它已经得到了广泛的应用,尤其是在深度学习、科学计算和大数据分析等领域。
ROC —— Radeon Open Computing,即 “Radeon 开放计算”。其中,Radeon 是 AMD GPU 产品的品牌名。
ROCm——ROC platforM 的简称,是基于一系列开源项目的 AMD GPU 计算生态。ROCm 之于 AMD GPU,基本上相当 于 CUDA 之于 NVIDIA GPU。除 ROCm 外,还有一系列 ROCx 的简称,如 ROCr —— ROC Runtime,ROCk —— ROC kernel driver, ROCt —— ROC Thunk 等。
HSA——Heterogeneous system architecture,可以简单理解为硬件上的一层抽象。 AMD 等为支持 CPU+GPU 混合计算生态而成立了非赢利组织 HSA 基金,提供 runtime 和架构 API 标准。现成员包括 AMD、三星、高通、ARM、TI、Imagination、MTK等。
GCN——Graphics Core Next,是 AMD 11年推出的全新架构,以区别于之前基于基于 VLIW (超长指令字)的架构。由于现在所有 AMD GPU 都建于 GCN 架构,失去 ”next“ 的对象,因此,GCN 可以简单理解为 AMD GPU 架构
1.2 ROCm与CUDA对比
主要模块的对比
了解 ROCm 最快的方式可能是和 CUDA 对比。表1给出了主要模块的对比。
CUDA | ROCm | 备注 |
CUDA API | HIP | C++ 扩展语法 |
NVCC | HCC | 编译器 |
CUDA 函数库 | ROC 库、HC 库 | |
Thrust | Parallel STL | HCC 原生支持 |
Profiler | ROCm Profiler | |
CUDA-GDB | ROCm-GDB | |
nvidia-smi | rocm-smi | |
DirectGPU RDMA | ROCn RDMA | peer2peer |
TensorRT | Tensile | 张量计算库 |
CUDA-Docker | ROCm-Docker |
编程模型
ROCm是AMD的一个软件平台,用来加速GPU计算
A卡上编程模型使用的是HIP或者OpenCL,而运行环境是ROCm
N卡上,编程模型是CUDA,运行环境也是CUDA
软件栈对比
数学库:
rocFFT:快速傅里叶变换库,用于加速频域计算任务。
rocBLAS:基本线性代数子程序库,用于加速矩阵计算任务。
rocRAND:随机数生成库,用于生成随机数序列。
rocSPARSE:稀疏矩阵计算库,用于加速稀疏矩阵计算任务。
llvm-project
https://github.com/RadeonOpenCompute/llvm-project
The LLVM Compiler Infrastructure
LLVM编译器基础结构
欢迎来到LLVM项目!此存储库包含LLVM的源代码,LLVM是用于构建高度优化的编译器、优化器和运行时环境的工具包。
LLVM项目有多个组件。
该项目的核心本身被称为“LLVM”。这包含了处理中间表示并将其转换为目标文件所需的所有工具、库和头文件。工具包括汇编器、反汇编器、位码分析器和位码优化器。类c语言使用Clang前端。该组件将C、c++、Objective-C和objective - c++代码编译成LLVM位码,并使用LLVM从那里编译成目标文件。其他组件包括:libc++ c++标准库、LLD链接器等。
HIP
ROCm-Developer-Tools/HIP: HIP: C++ Heterogeneous-Compute Interface for Portability (github.com)
HIP概述
HIP是一种c++运行时API和内核语言,允许开发人员从单个源代码为AMD和NVIDIA gpu创建可移植应用程序。
主要特性包括:
-
HIP非常薄,在CUDA模式下直接编码对性能影响很小或没有影响。
-
HIP允许使用单源c++编程语言进行编码,包括模板、c++ 11 lambdas、类、名称空间等特性。
-
HIP允许开发人员在每个目标平台上使用“最佳”开发环境和工具。
-
hiify工具自动将源从CUDA转换为HIP。
-
开发人员可以专门为平台(CUDA或AMD)调整性能或处理棘手的情况。
新项目可以直接用可移植的HIP c++语言开发,并且可以在NVIDIA或AMD平台上运行。此外,HIP提供了移植工具,可以很容易地将现有的CUDA代码移植到HIP层,与原始CUDA应用程序相比,没有性能损失。HIP并不打算成为CUDA的临时替代品,开发人员应该期望做一些手动编码和性能调优工作来完成移植。
HIP 与 CUDA 对比
HIP是一种编程模型,对标CUDA编程模型。
HIP 可以说是 CUDA API 的”山寨克隆“版。除了一些不常用的功能(e.g. managed memory)外,几乎全盘拷贝 CUDA API,是 CUDA 的一个子集。
HIP is a C++ runtime API 。我们使用C++语言,可以调用HIP的API来进行编程。
HIP可以运行在ROCm平台,也可以运行在CUDA平台。
所以既可以运行在A卡,但是也可以运行在N卡上(N卡主要还是CUDA) 。
HIP 的API和CUDA非常类似,大多数情况下他们代码稍加修改就可以直接转换。
CUDA转HIP
HIP提供了移植工具 “hipify”,可以帮助你将cuda源代码转换成HIP,与原始的CUDA应用程序相比没有开销。
CUDA与HIP术语对比
CUDA与HIP API
HIP 目录之旅
-
包括:
-
hip_runtime_api.h :定义 HIP 运行时 API,可以使用许多标准 Linux 编译器(GCC、ICC、CLANG 等)在 C 或 C++ 模式下进行编译。
-
hip_runtime.h :包括 hip_runtime_api.h PLUS hipLaunchKernelGGL 中的所有内容以及用于编写设备内核和设备函数的语法。hip_runtime.h 可以使用标准C++编译器进行编译,但会公开可用函数的子集。
-
amd_detail/** , nvidia_detail/** :特定平台的实现详细信息。HIP 应用程序不应直接包含这些文件。
-
-
bin:帮助髋关节移植的工具和脚本
-
hipcc :编译器驱动程序,可用于替换现有CUDA代码中的nvcc。HICC 将根据平台调用 NVCC 或 HIP-Clang,并包含适当的特定于平台的标头和库。
-
hipconfig :打印 HIP 配置(HIP_PATH、HIP_PLATFORM、HIP_COMPILER、HIP_RUNTIME、CXX 配置标志等)
-
-
文档:文档 - 降价和 doxygen 信息。
HIP 源码编译
HIP/docs/developer_guide/build.md at develop · ROCm-Developer-Tools/HIP (github.com)
HIP 代码可以在使用 HIP-Clang 编译器的 AMD ROCm 平台上开发,也可以在安装了 nvcc 的 CUDA 平台上开发。 在构建和运行 HIP 之前,请确保驱动程序和预构建包已正确安装在平台上。
存储库分支
在获取 HIP 源代码之前,请在变量 处设置存储库的预期分支。 例如,对于 ROCm5.6 发行版分支,设置ROCM_BRANCH
export ROCM_BRANCH=rocm-5.6.x
ROCm5.6 发布分支,设置
export ROCM_BRANCH=rocm-5.6.x
未来分支的类似格式。
ROCM_PATH是安装 ROCM 的路径。缺省情况下为 。ROCM_PATH/opt/rocm
在 AMD 平台上构建 HIP
获取 HIP 源代码
git clone -b "$ROCM_BRANCH" https://github.com/ROCm-Developer-Tools/clr.git
git clone -b "$ROCM_BRANCH" https://github.com/ROCm-Developer-Tools/hip.git
git clone -b "$ROCM_BRANCH" https://github.com/ROCm-Developer-Tools/HIPCC.git
设置环境变量
export CLR_DIR="$(readlink -f clr)"
export HIP_DIR="$(readlink -f hip)"
export HIPCC_DIR="$(readlink -f hipcc)"
请注意,从 ROCM 5.6 版本开始,clr 是一个新的存储库,包括以前的 ROCclr、HIPAMD 和 OpenCl 存储库。 ROCclr 是在 AMD 平台上定义的,HIP 使用 Radeon Open Compute Common Language Runtime (ROCclr),这是一个虚拟设备接口,HIP 运行时与不同的后端进行交互。 HIPAMD专门为AMD平台提供实施。 OpenCL 提供 ROCclr 运行时当前依赖的标头。
构建 HIPCC 运行时
cd "$HIPCC_DIR"
mkdir -p build; cd build
cmake ..
make -j4
Build HIPCLR
HIPCLR 依赖 HIPCC
cd "$CLR_DIR"
mkdir -p build; cd build
cmake -DHIP_COMMON_DIR=$HIP_DIR -DHIP_PLATFORM=amd -DCMAKE_PREFIX_PATH="/opt/rocm/" -DCMAKE_INSTALL_PREFIX=$PWD/install -DHIPCC_BIN_DIR=$HIPCC_DIR/build -DHIP_CATCH_TEST=0 -DCLR_BUILD_HIP=ON -DCLR_BUILD_OCL=OFF ..
make -j$(nproc)
sudo make install
请注意,如果未指定,hip 运行时将安装到 。 默认情况下,将生成 HIP 的发布版本。
CMAKE_INSTALL_PREFIX <ROCM_PATH>/hip
默认路径和环境变量
-
默认情况下,HIP 在 中查找 HSA(可以通过设置环境变量来覆盖)。HSA_PATH <ROCM_PATH>/hsa
-
默认情况下,HIP 安装在(可以通过设置环境变量来覆盖HIP_PATH)。<ROCM_PATH>/hip
-
默认情况下,HIP 会查找 clang in(可以通过设置环境变量来覆盖)HIP_CLANG_PATH <ROCM_PATH>/llvm/bin
-
默认情况下,HIP 在 中查找设备库(可以通过设置环境变量来覆盖)。DEVICE_LIB_PATH<ROCM_PATH>/lib
-
(可选)请考虑添加到您的工具中,以便更轻松地使用这些工具。PATH <ROCM_PATH>/bin
-
(可选)设置为输出命令行进行编译。HIPCC_VERBOSE=7
执行 make install 命令后,请确保指向 。HIP_PATH$PWD/install/hip
ROCm-Device-Libs
ROCm Device libraries.
https://github.com/RadeonOpenCompute/ROCm-Device-Libs
ROCm 设备库。
此存储库包含 一组特定于 AMD 的设备端语言运行时库。具体说来:
Name | Comments | Dependencies |
oclc* | Open Compute library controls (documentation) | |
ocml | Open Compute Math library (documentation) | oclc* |
ockl | Open Compute Kernel library (documentation) | oclc* |
opencl | OpenCL built-in library | ocml, ockl, oclc* |
hip | HIP built-in library | ocml, ockl, oclc* |
hc | Heterogeneous Compute built-in library | ocml, ockl, oclc* |
USING BITCODE LIBRARIES
ROCm语言编译器和运行时自动链接在创建代码对象过程中调用的所需位码文件。默认情况下,clang将在默认的ROCm安装位置中以amdhsa为目标搜索这些库。要指定一组特定的库,——rocm-path参数可以指向安装位码库的根目录,这是链接库的推荐方式。
BUILDING
依赖LLVM
该构建需要 clang 和几个 llvm 开发工具。这可以 使用 RadeonOpenCompute 的 amd-stg-open 分支构建 修改了 LLVM 项目存储库,但上游 LLVM 项目应该 也工作。
有两种不同的方法来构建设备库;作为一个 独立项目或作为 LLVM 外部子项目。
对于独立构建,这将找到预先存在的 clang 和 llvm 使用标准 CMAKE 搜索机制的工具。如果您希望使用 特定版本,您可以使用CMAKE_PREFIX_PATH 变量:
git clone https://github.com/RadeonOpenCompute/ROCm-Device-Libs.git -b amd-stg-open
并从其顶层运行以下命令:
mkdir -p build
cd build
export LLVM_BUILD=... (path to LLVM build directory created previously)
cmake -DCMAKE_PREFIX_PATH=$LLVM_BUILD ..
make
要构建为 llvm 外部项目,请执行以下操作:
LLVM_PROJECT_ROOT=llvm-project-rocm
git clone https://github.com/RadeonOpenCompute/llvm-project.git -b amd-stg-open ${LLVM_PROJECT_ROOT}
cd ${LLVM_PROJECT_ROOT}
mkdir -p build
cd build
cmake ${LLVM_PROJECT_ROOT}/llvm -DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_PROJECTS="clang;lld" \
-DLLVM_EXTERNAL_PROJECTS="device-libs" \
-DLLVM_EXTERNAL_DEVICE_LIBS_SOURCE_DIR=/path/to/ROCm-Device-Libs
测试需要 ROCm 运行时中的 amdhsacod 实用程序。
To install artifacts: make install
To create packages for the library: make package
从 CMAKE 使用
位码库导出为 CMake 目标,在 CMake 中组织 包。在确保包含构建目录或安装前缀 位码库。包定义一个变量,其中包含导出的 CMake 的列表 目标。find_package(AMDDeviceLibs REQUIRED CONFIG)CMAKE_PREFIX_PATHAMD_DEVICE_LIBS_TARGETS
ROCm-CompilerSupport
https://github.com/RadeonOpenCompute/ROCm-CompilerSupport
ROCm-CompilerSupport/lib/comgr at amd-stg-open · RadeonOpenCompute/ROCm-CompilerSupport (github.com)
编译器支持
编译器支持库提供各种与闪电编译器相关的服务。它目前包含一个库,代码对象管理器(Comgr)在lib/ Comgr。
代码对象管理器
代码对象管理器是一个共享库,它提供创建和检查代码对象的操作。请参阅头文件lib/comgr/include/amd_comgr.h中的文档。
代码对象管理器 (Comgr)
Comgr 库提供了用于编译和检查 AMDGPU 代码的 API 对象。API 记录在头文件中
Building the Code Object Manager
Comgr依赖于LLVM和AMDDeviceLibs(ROCm-Device-Libs)。
单程 要使这些对 Comgr 构建过程可见,方法是将 设置为 包括构建目录或安装前缀 其中每个组件都用分号分隔。两者都应使用 具有相同 ROCm 发布标记的源,或来自分支的源。LLVM 应至少使用 和 构建。CMAKE_PREFIX_PATHamd-stg-openLLVM_ENABLE_PROJECTS='llvm;clang;lld'LLVM_TARGETS_TO_BUILD='AMDGPU;X86'
使用 GNUMakefiles 在 Linux 上构建 Comgr 的示例会话是:bash
$ LLVM_PROJECT=~/llvm-project
$ DEVICE_LIBS=~/device-libs
$ COMGR=~/support/lib/comgr
$ mkdir -p "$LLVM_PROJECT/build"
$ cd "$LLVM_PROJECT/build"
$ cmake \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_PROJECTS="llvm;clang;lld" \
-DLLVM_TARGETS_TO_BUILD="AMDGPU;X86" \
../llvm
$ make
$ mkdir -p "$DEVICE_LIBS/build"
$ cd "$DEVICE_LIBS/build"
$ cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_PREFIX_PATH="$LLVM_PROJECT/build" \
..
$ make
$ mkdir -p "$COMGR/build"
$ cd "$COMGR/build"
$ cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_PREFIX_PATH="$LLVM_PROJECT/build;$DEVICE_LIBS/build" \
..
$ make
$ make test
Depending on the Code Object Manager
Comgr 导出一个以构建和安装命名的 CMake 包 树。此包定义一个名为 的库目标。要依赖 这在您的 CMake 项目中,请使用:amd_comgramd_comgrfind_package
find_package(amd_comgr REQUIRED CONFIG)
...
target_link_libraries(your_target amd_comgr)
如果 Comgr 未安装到标准 CMake 搜索目录,则指向 构建或安装树可以通过以下方式提供给CMake:CMAKE_PREFIX_PATH
cmake -DCMAKE_PREFIX_PATH=path/to/comgr/build/or/install
环境变量
Comgr 在某个环境变量的值第一个时懒惰地计算它们 必填。如果使用该值,则在需要时读取一次,并且 然后缓存。在执行期间更改这些值时的确切行为 在调用 Comgr API 后,未定义进程。
Comgr 支持一些环境变量来定位 ROCm 堆栈的各个部分。 其中包括:
-
ROCM_PATH:如果设置了此选项,则将其用作 ROCm 安装,在确定 和 的默认值时使用(见下文)。如果未设置并且 ROCM 在构建过程中提供包,ROCM 路径设置为它。否则 Comgr 尝试从amd_comgr库的路径构造 ROCM 路径 位于。HIP_PATHLLVM_PATH
-
HIP_PATH:如果设置了此选项,则将其用作 热等静压安装。如果未设置,则其默认值为 “${ROCM_PATH}/hip”。
-
LLVM_PATH:如果设置了此选项,则将其用作 LLVM 安装,当前用于 HIP 编译以定位 某些运行时标头。如果未设置,则其默认值为 “${ROCM_PATH}/llvm”.
Comgr还支持一些环境变量来帮助调试。这些 包括:
-
AMD_COMGR_SAVE_TEMPS:如果设置了此选项,并且不是“0”,则 Comgr 不会删除 编译期间生成的临时文件。这些文件不会出现在 当前工作目录,但保留在特定于平台的目录中 临时目录(通常在 Linux 和 或 路径上 在 Windows 上的环境变量中找到)。/tmpC:\TempTEMP
-
AMD_COMGR_REDIRECT_LOGS:如果未设置或设置为“0”,则日志为 照常返回呼叫者。如果设置为“stdout”/“-”或“stderr”, 日志被重定向到标准输出或错误流, 分别。如果将其设置为任何其他值,则将其解释为 应追加到的日志的文件名。
-
AMD_COMGR_EMIT_VERBOSE_LOGS:如果设置了此选项,并且不是“0”,则日志将 包括其他特定于 Comgr 的信息性消息。
-
AMD_COMGR_TIME_STATISTICS:如果设置了此选项,并且不是“0”,则日志将 包括编译操作的其他特定于 Comgr 的计时信息。
ROCT-Thunk-Interface
https://github.com/RadeonOpenCompute/ROCT-Thunk-Interface
https://github.com/RadeonOpenCompute/ROCT-Thunk-Interface.git
ROCt Library
该存储库包括用于与ROCk驱动程序交互的用户模式API接口。
从1.7版本开始,ROCt使用drm渲染设备。这需要用户属于视频组。如果用户还没有加入视频组,使用sudo usermod -a -G video username命令将用户加入视频组。注意:Ubuntu 20.04的用户需要将用户添加到新的“render”组中,因为Ubuntu已经将/dev/kfd的所有者组更改为render:render
ROCt 库不是独立产品,要求您安装正确的 ROCk 驱动程序,或者使用兼容的上游内核。 请参阅“入门指南”下 AMD ROCm™ Documentation — ROCm 5.7.1 Documentation Home,了解支持的操作系统和内核版本以及支持的硬件的列表。
Building the Thunk
一个简单的基于 cmake 的系统可用于构建 thunk。要从 ROCT-Thunk-Interface 目录构建 thunk,请执行:
mkdir -p build
cd build
cmake ..
make
如果需要 hsakmt-roct 和 hsakmt-roct-dev 软件包:
mkdir -p build
cd build
cmake ..
make package
如果选择不构建和安装包,则可以通过以下方式手动安装二进制文件和头文件:
make install
注意:对于存在 hsakmt-dev.txt 的旧版本的 thunk,需要“make package-dev”和“make install-dev”来生成/安装开发者包。目前,这些是通过“make package”和“make install”命令创建的。
ROCR-Runtime
https://github.com/RadeonOpenCompute/ROCR-Runtime.git
HSA运行时API和用于ROCm的运行时
这个存储库包括主机应用程序将计算内核启动到可用的HSA ROCm内核代理所需的用户模式API接口和库。还提供了核心运行时的参考源代码。
源代码
ROCR 运行时的 HSA 核心运行时源代码位于 src 子目录中。有关内容和构建说明,请参阅相关的 README.md 文件。
基础设施
HSA 运行时是一个精简的用户模式 API,它公开了访问由 AMDGPU 驱动程序集和 ROCK 内核驱动程序驱动的图形硬件并与之交互所需的接口。它们共同使程序员能够直接利用 AMD 独立显卡设备的强大功能,允许主机应用程序直接向图形硬件启动计算内核。
HSA 运行时 API 表示的功能包括:
-
错误处理
-
运行时初始化和关闭
-
系统和代理信息
-
信号和同步
-
架构调度
-
内存管理
-
HSA 运行时适合典型的软件架构堆栈。
HSA 运行时提供对图形硬件的直接访问,使程序员能够更好地控制执行。低级硬件访问的一个示例是支持一个或多个用户模式队列,为程序员提供低延迟内核调度接口,允许他们开发特定于其应用程序的自定义调度算法。
HSA 架构队列语言是一种开放标准,由 HSA 基金会定义,指定用于控制支持的 AMD/ATI Radeon (c) 图形设备的数据包语法。
AQL(Architected Queueing Language) 语言支持多种数据包类型,包括可以命令硬件自动解析数据包间依赖关系(屏障 AND 和 barrier OR 数据包)、内核调度数据包和代理调度数据包的数据包。
除了用户模式队列和 AQL 之外,HSA 运行时还公开了可由系统的一个或多个图形设备(可能还有主机)访问的各种虚拟地址范围。公开的虚拟地址范围支持细粒度或粗粒度访问。
细粒度区域中内存的更新对所有可以访问它的设备都是立即可见的,但一次只有一个设备可以访问粗粒度分配。可以使用 HSA 运行时内存 API 更改粗粒度区域的所有权,但此所有权转移必须由主机应用程序显式完成。
程序员应查阅 HSA 运行时程序员参考手册,了解 HSA 运行时 API、AQL 和 HSA 内存策略的完整说明
编译说明:
ROCR-Runtime/src/README.md at master · RadeonOpenCompute/ROCR-Runtime (github.com)
源和包含目录
core- 包含 AMD 实现核心 HSA 的源代码 运行时 API。
cmake_modules- CMake 支持模块和文件。
inc- 包含公开 HSA 的公共和 AMD 特定头文件 运行时的接口。
libamdhsacode- 代码对象定义和接口。
loader- 用于加载代码对象。
utils- 构建核心运行时所需的实用程序。
Building the Runtime
依赖 ROCT-Thunk-Interface
若要生成运行时,必须提供库和头文件的兼容版本。这些文件的最新版本 可以从 ROCT-Thunk-Interface 存储库获得,可在此处获得:libhsakmthsakmt.h
https://github.com/RadeonOpenCompute/ROCT-Thunk-Interface
从 ROCm 3.7 版开始,开发包现在包含一个 CMake 包配置文件。运行时现在将通过 if 安装到标准位置进行定位。对于执行以下操作的安装 不使用 ROCm 标准路径设置 CMake 变量或覆盖搜索路径。libhsakmtlibhsakmtfind_packagelibhsakmtCMAKE_PREFIX_PATHhsakmt_DIRfind_package
从 ROCm 版本 3.7 开始,运行时包括一个可选的映像支持模块 (以前)。默认情况下,此模块包含在 运行时。可以通过设置 CMake 变量为 。hsa-ext-rocr-devIMAGE_SUPPORTOFF
构建可选映像模块时,其他构建依赖项包括 必填。必须安装 AMDGCN 兼容的证书和设备库 以构建映像模块。这些要求的最新版本可以是 从 ROCm 软件包存储库获取 (见:Quick Start (Linux) — ROCm 5.7.1 Documentation Home) 这些项目的最新来源可以在这里找到:
https://github.com/RadeonOpenCompute/llvm-project
https://github.com/RadeonOpenCompute/ROCm-Device-Libs
此外,必须安装。xxd
运行时可以选择支持使用 cmake 用户包注册表。由 默认情况下,不修改注册表。将 CMake 变量设置为启用更新包 注册表。EXPORT_TO_USER_PACKAGE_REGISTRYON
例如,在具有标准的系统上构建、安装和生成包 已安装 ROCm 软件包,请从 执行以下命令:src/
mkdir build
cd build
cmake -DCMAKE_INSTALL_PATH=/opt/rocm ..
make
make install
make package
具有自定义安装路径、生成依赖项路径和选项的示例:
cmake -DIMAGE_SUPPORT=OFF \
-DEXPORT_TO_USER_PACKAGE_REGISTRY=ON \
-DCMAKE_VERBOSE_MAKEFILE=1 \
-DCMAKE_PREFIX_PATH=<alternate path(s) to build dependencies> \
-DCMAKE_INSTALL_PATH=<custom install path for this build> \
..
Other(数学库)
数学库:
rocFFT:快速傅里叶变换库,用于加速频域计算任务。
rocBLAS:基本线性代数子程序库,用于加速矩阵计算任务。
rocRAND:随机数生成库,用于生成随机数序列。
rocSPARSE:稀疏矩阵计算库,用于加速稀疏矩阵计算任务。
▪ hipBLAS: https://github.com/ROCmSoftwarePlatform/rocBLAS
▪ hipRAND: https://github.com/ROCmSoftwarePlatform/rocRAND
▪ hipFFT: https://github.com/ROCmSoftwarePlatform/rocFFT
▪ hipSPARSE: https://github.com/ROCmSoftwarePlatform/hipSPARSE
▪ hippcub: https://github.com/ROCmSoftwarePlatform/hipCUB
▪ RCCL (ROCm analogue of NCCL): https://github.com/ROCmSoftwarePlatform/rccl
▪ rocPRIM: https://github.com/ROCmSoftwarePlatform/rocPRIM
▪ MIOpen: https://github.com/ROCmSoftwarePlatform/MIOpen
▪ hipThrust: https://github.com/ROCmSoftwarePlatform/rocThrust
9.编译
rocm组件编译