1. 主机内存(Host Memory)
hipHostMalloc 是 HIP API 中的一个函数,它用于在主机上分配特殊的内存,这种内存被称为 "pinned" 或 "page-locked" 内存。这种内存有以下特点和用途:
-
GPU 地址空间映射:分配的内存被映射到系统中所有 GPU 的地址空间。这意味着 GPU 可以直接访问这块内存,而不需要数据复制操作。
-
加速数据传输:使用
hipHostMalloc分配的内存可以加速主机(Host)到设备(Device)以及设备到主机的数据传输速度。由于这种内存已经被映射到 GPU 的地址空间,因此在数据传输时可以减少一些设置步骤。 -
零拷贝 GPU 访问:GPU 能够直接访问使用
hipHostMalloc分配的主机内存,无需复制数据到 GPU 的本地设备内存。这种特性称为 "zero-copy" 访问。然而,尽管避免了复制操作,但每次内核访问内存时,数据必须通过 CPU/GPU 互连传输,这可能比直接访问 GPU 的本地内存慢很多。 -
适用场景:
- 当内存访问不频繁时(例如仅访问一次),零拷贝内存是一个不错的选择。
- 它可以用于需要 GPU 直接访问大量数据而不需要频繁复制的场景。
-
一致性与缓存:
- 零拷贝内存通常是 "Coherent"(一致的),意味着它不会被 GPU 缓存。这样可以保证数据的一致性,但可能会影响性能。
- 如果需要,可以覆盖这一行为,允许 GPU 缓存这些内存,但这需要开发者根据具体的性能需求和数据一致性要求来决定。
-
工具使用:可以使用
hipBusBandwidth工具来测试和比较使用hipHostMalloc分配的内存与普通内存在数据传输速度上的差异。通过--unpinned和--pinned开关来测试不同的内存配置。
总结来说,hipHostMalloc 提供了一种方式来分配可以被 GPU 直接访问的主机内存,这可以用于加速数据传输和实现零拷贝访问,但同时也需要考虑内存访问模式和数据一致性的需求。
2. 内存分配标志
hipHostMallocPortable 和 hipHostMallocMapped 是用于 hipHostMalloc 函数的标志(flags),它们定义了不同但相关的内存特性:
-
hipHostMallocPortable:
- 此标志用于分配可以跨多个 GPU 使用的内存。当内存需要在多个设备之间共享时,使用
hipHostMallocPortable可以确保分配的内存对所有参与的 GPU 都是可访问的。这种内存通常用于多 GPU 环境,其中不同的 GPU 需要直接访问同一块内存空间。
- 此标志用于分配可以跨多个 GPU 使用的内存。当内存需要在多个设备之间共享时,使用
-
hipHostMallocMapped:
- 此标志用于分配的内存会被映射到所有 GPU 的地址空间,允许 GPU 直接访问这些内存。这种映射通常用于零拷贝操作,其中 GPU 可以直接读取或写入主机内存,无需数据复制。这可以减少数据传输的开销,但可能涉及到跨 CPU 和 GPU 的内存访问延迟。
- 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节点的内存池中。
- 使用
hipSetDeviceAPI切换到不同的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 透明地访问同一块内存,避免了数据复制的开销。 - 当分配了托

最低0.47元/天 解锁文章
1702

被折叠的 条评论
为什么被折叠?



