前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Intel:统一内存架构(UMF)

Intel:统一内存架构(UMF)

作者头像
数据存储前沿技术
发布2025-02-11 19:49:01
发布2025-02-11 19:49:01
2600
举报

全文概览

本文介绍Intel公司开发的统一内存框架(UMF)项目,旨在解决现代服务器平台中日益增长的数据处理需求所导致的异构内存系统挑战。UMF提供了统一的解决方案,用于管理和分配不同类型的内存资源,包括本地DRAM、高带宽内存(HBM)、直连存储器(CXL)、以及GPU内存,从而实现数据有效加载和迁移。该框架通过一种灵活的混合和匹配API设计,允许开发者根据特定的应用场景进行调整,并且与操作系统的能力相补充,提供了从操作系统级别的页大小抽象到应用程序对象级别的精细管理。

UMF的核心在于其架构,它定义了堆管理器和内存提供商的接口,并提供了多种实现这些接口的静态库,允许用户根据需要动态链接。这使得开发者能够创建自定义的内存管理策略,同时充分利用不同硬件的优势。此外,UMF还支持高级API,如memspaces和memory targets,供应用开发者轻松地针对特定性能需求(例如高带宽或低延迟)来创建和选择内存池。

异构内存的现况

  • 对数据处理的需求增加,导致现代服务器平台的内存子系统变得复杂。
  • 一个应用程序可以利用多种类型的内存: 本地DRAM(动态随机存取存储器) HBM(高带宽内存) CXL附加内存 GPU内存(GDDR)
  • 使用异构内存需要(挑战): 发现可用的内存资源。 决定数据存放的位置,以及如何在不同内存类型之间迁移数据(SNIA提出SDXI方案来实现跨内存数据同步)。 与不同的API进行交互,以实现内存分配和数据迁移。

Cite

GPU内存通常是GDDR(图形双倍数据速率)内存,它比传统的DRAM有更高的带宽,专为GPU进行图形渲染和并行计算优化。虽然它的带宽高于普通DRAM,但相对于HBM来说,带宽和效率略逊一筹。

  • HBM 是为了提供极高的数据传输带宽和低延迟而设计的内存,通常应用在需要大量并行计算的领域,甚至与GPU协同工作,但不仅仅限于GPU。
  • GPU内存 则专注于图形处理和并行计算,通常是GDDR内存,主要用于显卡中,适合图形密集型任务。

统一内存架构 UMF 提出

目标:统一异构内存分配和资源发现的路径,适用于高级运行时(如SYCL、OpenMP、统一运行时、MPI、oneCCL等)以及外部库/应用程序。

它是什么

  • 一个单一项目,用于汇聚与内存管理相关的技术。
  • 灵活的混合匹配API,允许针对特定使用场景进行调整。
  • 补充(而非与操作系统能力竞争)操作系统的功能:
    • 操作系统的页面大小粒度;应用程序的对象级抽象。

常规应用内存的分配

展示了常见的内存分配结构。在这种结构中,应用程序通过应用层接口与内存分配系统交互,采用C++兼容的分配器和内存资源来管理内存。底层通过C风格的API(如 mallocfree)与堆管理器交互,堆管理器则负责管理内存的分配。内存提供者(如 mmapVirtualAlloc)提供实际的内存分配,并通过内存池或缓存机制优化内存使用,尤其是在处理大块内存、并发、碎片化等问题时。此外,系统级接口提供更低层次的内存管理,但可能带来较高的开销。

图示应用内存调用过程中,分配器、堆管理器、内存设备三者的功能差异。

  • 分配器(应用程序层接口):对象大小粒度、细粒度分配;
  • 堆管理器(内存池/缓存):从内存提供者那里池化大块内存、为应用程序分配内存、为不同使用场景优化的多种实现(如并发、碎片化等)
  • 内存设备(系统级接口):页大小粒度

UMF:技术概览

  • 常规的malloc流程
    • 应用程序通过malloc请求内存分配,指定所需的内存大小和对齐方式。
    • malloclibc的内存池中分配内存,接着通过mmap向操作系统请求内存。
    • 内存最终分配到本地DRAM。
  • UMF流程内存池的示例
    • Pool 1:驻留在GPU上的内存池。
    • Pool 2:依赖操作系统的内存分层,类似于常规的malloc。
    • Pool 3:绑定到DRAM和CXL.mem,可以让操作系统在DRAM和CXL内存之间迁移页面。 多个堆具有不同的属性,适用于不同类型的内存分配需求。 通过将不同类型的内存分配分离到不同的池中,提高内存管理的灵活性和效率。 UMF还支持对内存页面的监控(如Linux DAMON)并向操作系统提供建议(如madvise)。
    • 应用程序通过umfPoolMalloc请求内存,指明需要分配的内存类型以及应该从哪个内存池中分配。
    • UMF框架提供多个内存池(如Pool 1、Pool 2、Pool 3),可以根据需求选择合适的内存池进行分配。
    • UMF框架通过驱动程序和操作系统与不同的硬件资源(如GPU内存、DRAM、HBM等)进行交互。

内存对齐的概念与具体方式

在内存分配中,对齐方式(alignment)是指数据在内存中的存放方式,确保数据在内存中的起始地址符合特定的对齐要求。这是为了提高内存访问效率和兼容性。

为什么需要对齐?
  1. 硬件要求很多处理器要求数据以某种方式对齐,特别是对于访问性能的提升。例如,一些处理器对访问32位数据时要求其起始地址是4字节的倍数,对64位数据要求8字节的倍数。
  2. 提高性能适当的对齐可以避免由于非对齐访问而导致的额外的CPU周期消耗。例如,在某些架构上,非对齐的访问可能会导致两次内存读取,降低效率。
  3. 兼容性和稳定性一些硬件和操作系统对内存访问有严格的对齐要求,如果数据没有正确对齐,可能会导致访问错误或程序崩溃。
对齐方式的类型

内存对齐的方式通常根据对齐边界(alignment boundary)来决定。以下是一些常见的对齐方式:

  1. 按字节对齐(Byte Alignment)
    • 数据以字节为单位对齐。通常,字节对齐不要求特定的对齐方式,数据可以在内存中的任何位置开始。
    • 适用于存储字符(char)类型的变量。
  2. 按字(Word)对齐
    • 字通常是16位(2字节)或32位(4字节)等。按字对齐要求数据的起始地址是字长的倍数。
    • 例如,32位系统通常要求数据以4字节对齐。
  3. 按双字(Double-word)对齐
    • 双字对齐是指数据的起始地址必须是8字节的倍数,通常用于64位系统。
    • 例如,64位类型的数据(如long)通常要求8字节对齐。
  4. 按缓存行对齐
    • 缓存行对齐通常用于需要优化内存访问和性能的高性能应用。在现代处理器中,缓存行通常为64字节,数据按64字节对齐可以减少缓存未命中(cache miss)的次数。
    • 这对于需要大量并行处理的应用(如大数据处理和高性能计算)非常重要。
  5. 按特定类型对齐
    • 某些特定的数据类型(例如浮点数类型或结构体)可能有其自己的对齐要求。例如,某些平台要求结构体的成员以某个字节边界对齐,通常通过编译器提供的alignas关键字来指定。
  6. 按内存页面对齐
    • 对齐到内存页面大小(通常为4KB或更大),这种对齐方式通常用于虚拟内存管理和大规模数据处理。

UMF 技术架构

  • UMF 是一个框架,用于构建分配器并组织内存池。
  • 内存池池管理器内存提供者 的结合:
    • 内存提供者 执行实际的内存分配(粗粒度分配)。
    • 堆管理器 管理池并处理细粒度的 malloc/free 请求。
  • UMF 定义了堆管理器和内存提供者接口:
    • 提供了多种实现(如不相交池、可扩展池、jemalloc池)来支持堆管理器和内存提供者。
    • 堆管理器和内存提供者的实现是静态库,可以按需链接。
    • 允许使用外部堆管理器和内存提供者,用户可以选择现有的或提供自己的实现。

Note

从技术功能来看,Intel 提出的UMF 统一内存访问,和 Alluxio 的统一数据平台(缓存)较为类似,差异点在于:UMF(C++) 是基于底层OS接口实现的内存资源调度,而 Alluxio (Java)基于元数据层挂载,统一访问不同数据源的存储资源(DRAM、SSD、HDDs、CXL等),UMF的技术更底层。


展示了UMF(统一内存框架)的结构和提供的不同API集。UMF提供了多种类型的API,满足不同用户需求:包括低级的池创建API、高级的内存池管理、分配API、内存选择API和可观察性API。这些API的目标是帮助开发者更有效地管理内存,选择合适的内存设备,并支持跨进程的内存管理(如IPC句柄)。

梳理表格如下:


高阶特性:memspaces

  • Memspace 是对内存资源的抽象,它是多个内存目标的集合。
  • Memspace 可以用于内存资源的发现或池的创建。
  • Memory target 表示单一的内存源(例如 NUMA 节点、内存映射文件等),并可以具有某些属性(如延迟、带宽、容量等)。
  • UMF 提供了预定义的 memspace 类型,如 HOST_ALLHBMLOWEST_LATENCY 等。

memspaces 创建的代码示例与内存分配(基于C++实现)


UMF 互操作能力

内存是高效互操作的关键

  • 现代应用程序非常复杂:
    • 一个应用程序可能会使用多个库/运行时。
    • 一个库分配的内存可能会被另一个库使用。
  • UMF 汇总了关于内存分配的数据:
    • 它可以提供已分配区域的内存属性。

示例

  • OpenMP/SYCL 分配的内存被 MPI 用于扩展(scale-out)。UMF 可以提供以下信息:
    • 是否是操作系统管理的内存,还是由 GPU 驱动程序管理的内存。
    • 使用了哪个 NUMA 节点。
    • MPI 可以获取 IPC 句柄,将内存映射到其他进程。

进展与路标

当前状态和2024年计划

  • 首次发布作为 oneAPI 2025.0 的内部组件,计划在2024年第三季度发布。
  • 开源仓库已创建开源仓库用于开放开发。

主要参与者

Unified Runtime:用于 SYCL 和 OpenMP 卸载的 USM 内存池。 Intel MPI:基于可观察性和 IPC API 与 SYCL 和 OpenMP 的互操作。 oneCCL:大内存分配和 IPC 功能的内存池。 libiomp:在 UMF 上构建 OpenMP 6.0 支持。 CAL:基于 UMF 的 malloc/free 拦截。


关键要点

  1. UMF是一种框架,用于解决异构内存系统中的挑战,包括利用多种类型的内存和发现可用资源等。
  2. UMF提供了一致的API,使得不同运行时和库可以协同工作,并提供了自定义内存分配器的功能。
  3. UMF的架构包括池管理和内存提供商接口,以及堆管理器和服务应用程序请求的细粒度内存分配等功能。
  4. UMF支持多种内存类型,如本地DRAM、HBM、CXL-attached内存、GPU内存等,并提供不同的属性和行为。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-01-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 王知鱼 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 全文概览
    • 异构内存的现况
    • 统一内存架构 UMF 提出
    • 常规应用内存的分配
    • UMF:技术概览
    • UMF 技术架构
    • 高阶特性:memspaces
    • UMF 互操作能力
    • 进展与路标
    • 关键要点
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档