看 LLVM 论坛发现未知术语 HIP,了解到是 AMD 做出来为了对标 CUDA 的 GPU 计算的,本文简单记录一下。

1、Heterogeneous-Compute(异构计算)

Heterogeneous computing refers to systems that use more than one kind of processor or core. These systems gain performance or energy efficiency not just by adding the same type of processors, but by adding dissimilar coprocessors, usually incorporating specialized processing capabilities to handle particular tasks.

异构计算是指使用多种处理器或内核的系统。通过组合添加多种处理器来获得更好的性能或效率,如 CPUs, GPUs, ASICs, FPGAs, NPUs,把不同的任务交由指定处理器进行处理。

在过去,异构计算意味着要以不同的方式处理不同的 ISA(instruction-set architectures,指令集架构);而在现代,异构计算对于用户而言是消除了不同处理器的使用差异的。

最近的研究结果表明,利用多个 ISA 提供的多样性的异构 ISA 芯片多处理器的性能,比最佳的相同 ISA 同类架构高出 21%,同时节能 23%,能量延迟积 (EDP) 降低 32% 。

2、HIP

HIP(Heterogeneous-Compute Interface for Portability) 是 C++ 的运行时 API 和内核语言,支持开发者创建同时兼容 AMD 和 NVIDA GPUs 的源代码。

Clang 通过 ROCm 平台(AMD 提供 GPU 计算的开源软件平台) 来在 AMD GPUs 上提供 HIP 的支持,HIP APIs 通过 HIP 的头文件和 ROCm 设备库(device library) 来实现。HIP 使得可以从 CUDA 进行迁移到其他平台。虽然 ROCm 一直被吐槽,但 HIP 还在一直不断地发展。

HIP 对处理器的支持:

  • AMD GPUs。Clang driver 使用 HIPAMD 工具链,通过 AMDGPU 编译器后端,来编译 HIP 设备代码,生成 AMDGPU 的 ISA 指令。
  • Intel GPUs。Clang 使用 CHIP-Star 来支持 Intel GPU 的 HIP 运行时,Clang driver 使用 HIPSPV 工具链编译 HIP 设备代码为 LLVM IR,然后再转成 SPIR-V(一种用于并行计算和图形的中间语言)。
  • NVIDIA GPUs。HIP 提供了只有头文件的库,转换 HIP 运行时 APIs 为 CUDA 运行时 APIs,然后代码会由 NVIDIA 的 nvcc 工具来编译。
  • CPUs。通过 HIP-CPU 来支持,这个只有头文件的库让 CPUs 去执行不需要修改适配的 HIP 代码。

参考