# Day 22 Heterogeneous Memory Management (HMM) (二)

今天继续来看 HMM 的後续!

文件

输入输出汇流排、装置记忆体特性
===========================

由於某些限制,
输入输出汇流排使共享定址空间无法使用。
大多数输入输出汇流排
从装置对主记忆体只允许做基本的存取;
甚至快取一致性通常都是选配的。
而从 CPU 存取装置记忆体甚至有更多的限制。
且通常不是快取一致的。

如果我们只考虑 PCIE 汇流排,
那麽装置可以存取主记忆体
(通常是透过 IOMMU)并与 CPUs 保持快取一致。
然而,它在主记忆体上只允许来自装置的一些原子操作。
更糟的是在另一个方向:
CPU 只能存取有限范围的装置记忆体
并且不能对其执行原子操作。
因此从核心的角度来看,
装置记忆体并无法被认为和一般记忆体相同。

另一个因素是有限的频宽
(PCIE 4.0 和 16 通道约 32GBytes/s )。
这比最快的 GPU 记忆体 (1 TBytes/s) 少 33 倍。
最後一个限制是延迟。从装置存取主记忆体
与装置存取自己的记忆体相比,延迟要高出一个数量级。

一些平台正在开发新的输入输出汇流排
或对 PCIE 做些增强/修改来解决其中一些限制(OpenCAPI、CCIX)。
他们主要想达到 CPU 和装置之间有双向的快取一致性,
并能使用所有架构支援的原子操作。
但可惜的是,并非所有平台都遵循这样的趋势,
且一些主流架构并没有这些问题的硬体解决方案。

因此,要使共享定址空间能运作,
我们不仅必须让装置能够存取任何记忆体,
我们还必须使任何记忆体,
当装置正在使用的时候,都能被迁移到装置上
(在迁移发生时阻挡 CPU 存取)。

共享定址空间和迁移
=================

HMM 打算提供两个主要功能。
第一个是共享定址空间,
透过复制 CPU 的分页表到装置的分页表,
使得在装置定址空间中,
对任何有效的主记忆体位址,
都是具有相同的位址指向相同的实体记忆体的特性。

为了实现这一点,
HMM 提供了一套辅助函式来填充装置的分页表,
同时纪录 CPU 分页表的更新。
装置的分页表更新并不像 CPU 分页表更新那麽容易。
要更新装置分页表,您必须先分配缓冲区(或使用预先分配的缓冲区池)
并写入 GPU 特定的指令来执行更新(unmap, cache invalidations, and flush ...)。
并不能透过使用通用程序码来为所有装置完成这些。
因此这是 HMM 提供辅助函式来执行所有的通用部分,
并留下硬体相关的细节来给装置驱动程序做处理。

HMM 提供的第二个机制是一种新的 ZONE_DEVICE 记忆体,
允许为装置记忆体的每个分页分配一个 struct page。
这些分页是特殊的,因为 CPU 无法映射它们。
但是,是可以使用现有的迁移机制,从主记忆体迁移到装置记忆体上,
而从 CPU 角度来看,一切就像是分页被置换到硬碟上。
使用 struct page 提供了最简单和最乾净的方式与现有 mm 机制整合。
再一次,HMM 只提供辅助函数,
先热插拔新的、用於装置记忆体的 ZONE_DEVICE 记忆体;
再来,执行迁移。
决定迁移的内容和何时迁移的方针则由装置驱动程序决定。

请注意,任何 CPU 对装置分页的存取都会触发分页错误
和迁移回到主记忆体。
例如,若储存给定 CPU 位址 A 的分页从主记忆体分页被迁移到装置分页,
那麽任何 CPU 对於位址 A 的存取将会触发分页错误并启动迁移回到主记忆体。

有了这两个特性,HMM 不仅可以让装置镜像程序的定址空间、
保持 CPU 和装置分页表同步,
并且透过迁移部分装置正在使用的资料来利用装置的记忆体。

我的理解

今天阅读的文件内容描述了:

  • 输入输出汇流排、装置记忆体特性

    • IO bus 的特性限制了 shared address space 的使用
      • CPU 和 装置间透过这些 bus 存取会有 cache coherence、支不支援 atomic operation 的问题
        • 笔者也是近期才知道,原来某些 bus protocol 和 atomic operation 支援性有关 (ex. AXI exclusive access)
      • 还有频宽(bandwidth) 和延迟(latency) 的问题
    • 结论是:想要有 shared address space 需要
      • 让 device 能够存取所有的记忆体位址
      • 记忆体可以做 migration
  • 共享定址空间和迁移

    • HMM 提供了 shared memory space 和 migration 功能
      • shared memory space 意味着在 host、在 device 上看到的 address A 都会指向相同的实体记忆体位址
        • HMM 提供了 helper function 来让装置能镜像 CPU 的 page table (不过当然 device driver 也要处理一些 hardware specific 的细节),helper 则是做大部分的 generic flow。
      • migration 则是让资料可以自动的流来流去 (( 藉由 page fault 机制
        • 利用现有的 swap out 到 disk 的相关机制来整合实作

後记

看完这边在反过来想,为什麽会需要 shared address space,就发现昨天读的第一节就是在描述 split address space 的一些不理想之处,需要透过 driver specific memory allocator 来分配记忆体。
有了 shared address space 就没有这个烦恼了!
明天接着来往下看,看看 HMM 提供的 shared address space 和 migration 是怎麽实作的!

参考资料

延伸阅读


<<:  Day16 测试与进度计算,与客诉的关系

>>:  IOS、Python自学心得30天 Day-28 上传图片到Firebase Storage

110/12 - 把照片储存在Pictures/应用程序名称资料夹 - 2

Android 11开始把getExternalStoragePublicDirectory标记弃用...

[Day 28] 系统开发导入(下)

资讯审计人员需要能识别和了解所设计的控制,以确保输入和输出各种业务和应用程序的数据授权、完整性和准确...

[ Day 21 ] 路由管理 - React Router 2/2

在上一篇 Day 20 我们介绍了 React Router 的基本概念以及 React Rout...

Day17:17 - 结帐服务(1) - 後端 - 结帐、订单新增API

Здравейте,我是Charlie! 在Day16当中,我们完成了前端的购物车新增跟删除,而今天...

c语言中exit的用法

纪录一下遇到错误时直接exit的写法 #include <stdio.h> #inclu...