Rocm-Programming with HIP 内存分配

1. 主机内存(Host Memory)

hipHostMalloc 是 HIP API 中的一个函数,它用于在主机上分配特殊的内存,这种内存被称为 "pinned" 或 "page-locked" 内存。这种内存有以下特点和用途:

  1. GPU 地址空间映射:分配的内存被映射到系统中所有 GPU 的地址空间。这意味着 GPU 可以直接访问这块内存,而不需要数据复制操作。

  2. 加速数据传输:使用 hipHostMalloc 分配的内存可以加速主机(Host)到设备(Device)以及设备到主机的数据传输速度。由于这种内存已经被映射到 GPU 的地址空间,因此在数据传输时可以减少一些设置步骤。

  3. 零拷贝 GPU 访问:GPU 能够直接访问使用 hipHostMalloc 分配的主机内存,无需复制数据到 GPU 的本地设备内存。这种特性称为 "zero-copy" 访问。然而,尽管避免了复制操作,但每次内核访问内存时,数据必须通过 CPU/GPU 互连传输,这可能比直接访问 GPU 的本地内存慢很多。

  4. 适用场景

    • 当内存访问不频繁时(例如仅访问一次),零拷贝内存是一个不错的选择。
    • 它可以用于需要 GPU 直接访问大量数据而不需要频繁复制的场景。
  5. 一致性与缓存

    • 零拷贝内存通常是 "Coherent"(一致的),意味着它不会被 GPU 缓存。这样可以保证数据的一致性,但可能会影响性能。
    • 如果需要,可以覆盖这一行为,允许 GPU 缓存这些内存,但这需要开发者根据具体的性能需求和数据一致性要求来决定。
  6. 工具使用:可以使用 hipBusBandwidth 工具来测试和比较使用 hipHostMalloc 分配的内存与普通内存在数据传输速度上的差异。通过 --unpinned--pinned 开关来测试不同的内存配置。

总结来说,hipHostMalloc 提供了一种方式来分配可以被 GPU 直接访问的主机内存,这可以用于加速数据传输和实现零拷贝访问,但同时也需要考虑内存访问模式和数据一致性的需求。

2. 内存分配标志

hipHostMallocPortable hipHostMallocMapped 是用于 hipHostMalloc 函数的标志(flags),它们定义了不同但相关的内存特性:

  1. hipHostMallocPortable

    • 此标志用于分配可以跨多个 GPU 使用的内存。当内存需要在多个设备之间共享时,使用 hipHostMallocPortable 可以确保分配的内存对所有参与的 GPU 都是可访问的。这种内存通常用于多 GPU 环境,其中不同的 GPU 需要直接访问同一块内存空间。
  2. hipHostMallocMapped

    • 此标志用于分配的内存会被映射到所有 GPU 的地址空间,允许 GPU 直接访问这些内存。这种映射通常用于零拷贝操作,其中 GPU 可以直接读取或写入主机内存,无需数据复制。这可以减少数据传输的开销,但可能涉及到跨 CPU 和 GPU 的内存访问延迟。
  3. hipHostMallocNumaUser:
    • 这个标志允许用户指定 NUMA(Non-Uniform Memory Access)策略,根据用户的设置来分配主机内存。NUMA 策略可以影响内存访问的性能,特别是在多处理器系统上。

区别主要在于它们的使用目的和行为:

  • hipHostMallocPortable 关注的是内存的可移植性和共享性,确保在多 GPU 系统中,所有 GPU 都能够识别和使用同一块内存。
  • hipHostMallocMapped 关注的是内存访问的直接性和性能,允许 GPU 直接与主机内存交互,避免了数据传输的需要。

在实际使用中,hipHostMalloc 通常会同时设置这两个标志,因为它们共同支持了多 GPU 环境下的高性能内存访问模式。这样分配的内存既能够被多个 GPU 共享,又能够被每个 GPU 直接访问,从而实现高效的数据传输和零拷贝操作。

3. NUMA-aware host memory allocation
  • NUMA(Non-Uniform Memory Architecture)是一种多处理器系统架构,它允许每个CPU(或CPU核心组)拥有自己的本地内存,并且可以通过互连访问其他CPU的内存。这种架构下,访问本地内存比访问远程内存更快。
  • NUMA-aware host memory allocation 是一种在多处理器和多GPU系统中优化内存分配的策略。NUMA策略决定如何分配内存,以及如何选择与每个GPU最近的CPU。这个策略会衡量GPU和CPU设备之间的距离(NUMA距离),并尽量将内存分配在与GPU最近的NUMA节点上。
  • 默认情况下,每个GPU会自动选择一个NUMA CPU节点,该节点与GPU之间的NUMA距离最短。这样,主机内存会自动分配在当前GPU设备所在NUMA节点的内存池中。
  • 使用hipSetDevice API切换到不同的GPU时,可以访问之前分配的主机内存。但是,如果新选择的GPU与该内存的NUMA节点距离较远,可能会增加内存访问延迟。
  • 在HIP API中,可以使用hipHostMallocNumaUser标志进行NUMA-aware的主机内存分配。这允许开发者根据NUMA策略手动指定内存应该分配在哪个NUMA节点上。
4. 托管内存分配(Managed Memory Allocation)

在 HIP (Heterogeneous-compute Interface for Portability) 中,托管内存分配(Managed Memory Allocation)是一种允许在 GPU 和 CPU 之间共享内存的机制,无需显式地在两者之间复制数据。

在调用托管内存 API hipMallocManaged 之前,HIP 应用程序会执行能力检查,以确保当前设备支持托管内存。

  • 如果设备不支持托管内存,hipMallocManaged 调用将退回到使用系统内存。在这种情况下,其他托管内存 API 调用可能会表现出未定义的行为。
  • 如果设备支持托管内存,使用 hipMallocManaged 分配的内存可以提供更好的性能,因为它允许 GPU 和 CPU 透明地访问同一块内存,避免了数据复制的开销。
  • 当分配了托
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值