鲲鹏社区首页
中文
注册
开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

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模式:

  • 用户编程接口
    1. “hbm” 和 “nohbm” 关键字属性,作用于全局变量、局部变量和函数参数。“hbm”用于标记优先使用HBM模块的数据,“nohbm”相反。
    2. __builtin_hbm_prefetch 接口,在循环中使用,将指定数据预取到HBM缓存。
    3. #pragma clang loop prefetch导语,作用于循环,通过指定预取数据和预取层级将数据预取到HBM缓存;#pragma clang loop noprefetch导语,作用于循环,对于指定的数据,编译器不会对其做任何软件预取相关优化。当前仅支持C/C++。
  • 编译器自动分配

    添加编译选项”-fhbm-mode=cache”,使能编译器自动预取功能,编译器通过分析循环中数据访存特征,识别热点数据并插入预取指令将数据预取到HBM缓存中。

flat模式:

添加编译选项“-fhbm-mode=flat”,使能编译器自动malloc替换功能,编译器通过分析malloc分配的内存使用特征,将符合条件的malloc自动替换为hbw_malloc(依赖memkind库),分配HBM存储。用户也可以通过手动替换malloc为hbw_malloc使能HBM。