HIP异构编程模型
本次比赛的HIP编程方法,是在类GPU加速器DCU上运行高性能的并行计算。
使用的编程模型是ROCm HIP模型,是C/C++为基础的异构并行编程模型,和CUDA编程类似。
具体在另一篇博客提过:异构计算技术与DTK异构开发套件-优快云博客
HIP编程模型中有两个部分,在CPU上运行的是主机端host,DCU加速器上运行的是设备端device
- 主机端代码在CPU运行,入口函数main,使用C/C++编写,HIP使用Runtime API在主机端分配设备显存,管理主机端和设备端的内存拷贝,运行设备端核函数等
- 设备端代码在加速器DCU上运行,使用扩展的C语法(HIP_C),设备端代码组织成核函数运行
- **核函数Kernel:**设备端代码由HIP_C构成并运行在加速器上,被称为核函数
HIP异构程序的实现是什么样的:
将数据从主机端传到设备内存->启动核函数对数据运算->将结果传回CPU
HIP模型线程组织模式
核函数执行模型的三层结构:thread-block-grid
每个核函数启动的线程有唯一的线程ID,可以通过HIP内置的变量hipthreadIdx进行访问。hipthreadIdx设计成三分量矢量,也就是xyz三个轴
一个线程块会被划分为一定数量的线程束,每个线程束有64个线程。
在同一线程束中的线程执行不同的指令,被称为线程束分化,也会影响性能。比如if和else使用,会把不执行的线程禁用闲置,占用线程。
HIP内存层次结构
存储结构有global memory全局内存、shared memory(LDS)共享内存、thread-local memory(寄存器)等
寄存器是对线程私有的,延迟低。共享内存是HIP编程模型提供的可编程缓存,优于全局内存。全局内存是DCU容量最大延迟最高,但是最常用的内存。
HIP代码分解
主机端对设备端显存分配
主机端控制与设备显存间数据的传输
HIP kernel从主机端运行
HIP核函数
CPU代码
加速器代码
_global_
使核函数在加速器运行
返回值声明必须void
传入参数必须设备端指针和立即数
执行核函数线程是并发的
执行核函数的每个线程拥有独立的thread ID