HBM简介
HPC典型应用中存在大量内存瓶颈的场景,同时,多线程的并发访问增大了问题规模及内存使用量,又进一步加剧了内存瓶颈问题。HBM相比于传统DDR具有更高的带宽,可以有效缓解带宽瓶颈。在鲲鹏920 72F8(hip11)中扩展了HBM硬件模块,为了充分发挥HBM硬件能力提升程序性能,毕昇编译器设计了HBM模块整体解决方案,提供用户编程接口和编译器自动使能方案。
鲲鹏920 72F8中HBM支持cache和flat两种模式。在cache模式下,HBM被配置为LLC(last-level cache),在程序执行过程中通过软件或硬件预取可以将数据提前预取到HBM中,访存操作执行时,如果数据在HBM中找到则返回,否则会继续在主存中查找。在flat模式下,HBM被当做主存使用,与传统的DDR共享同一套地址空间,可以通过numa、memkind接口等方式将特定数据分配到HBM上。针对不同的HBM模式,毕昇编译器提供如下HBM使能方法:
"-fhbm-mode=$value"选项为编译器自动使能HBM的统一选项,支持default/cache/flat/disable四种值,用户可以通过添加“-fhbm-mode=disable”关闭编译器自动使能HBM的相关功能。编译器默认设置为“-fhbm-mode=default”,默认关闭cache模式自动预取和flat模式的malloc自动替换,仅支持builtin和pragma编程接口功能。
cache模式:
- 用户编程接口
- “hbm” 和 “nohbm” 关键字属性,作用于全局变量、局部变量和函数参数。“hbm”用于标记优先使用HBM模块的数据,“nohbm”相反。
- __builtin_hbm_prefetch 接口,在循环中使用,将指定数据预取到HBM缓存。
- #pragma clang loop prefetch导语,作用于循环,通过指定预取数据和预取层级将数据预取到HBM缓存;#pragma clang loop noprefetch导语,作用于循环,对于指定的数据,编译器不会对其做任何软件预取相关优化。当前仅支持C/C++。
flat模式:
添加编译选项“-fhbm-mode=flat”,使能编译器自动malloc替换功能,编译器通过分析malloc分配的内存使用特征,将符合条件的malloc自动替换为hbw_malloc(依赖memkind库),分配HBM存储。用户也可以通过手动替换malloc为hbw_malloc使能HBM。