今天继续来看 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 和装置分页表同步,
并且透过迁移部分装置正在使用的资料来利用装置的记忆体。
今天阅读的文件内容描述了:
输入输出汇流排、装置记忆体特性
共享定址空间和迁移
看完这边在反过来想,为什麽会需要 shared address space,就发现昨天读的第一节就是在描述 split address space 的一些不理想之处,需要透过 driver specific memory allocator 来分配记忆体。
有了 shared address space 就没有这个烦恼了!
明天接着来往下看,看看 HMM 提供的 shared address space 和 migration 是怎麽实作的!
>>: IOS、Python自学心得30天 Day-28 上传图片到Firebase Storage
Android 11开始把getExternalStoragePublicDirectory标记弃用...
资讯审计人员需要能识别和了解所设计的控制,以确保输入和输出各种业务和应用程序的数据授权、完整性和准确...
在上一篇 Day 20 我们介绍了 React Router 的基本概念以及 React Rout...
Здравейте,我是Charlie! 在Day16当中,我们完成了前端的购物车新增跟删除,而今天...
纪录一下遇到错误时直接exit的写法 #include <stdio.h> #inclu...