# Day 25 Heterogeneous Memory Management (HMM) (Summary)

文件

摘要

  • 这份文件介绍了 HMM 机制,HMM 整合一些非传统记忆体(ex. GPU 上的记忆体)到 kernel code path,以及提供一些 helper function 来达成 SVM (shared virtual memory)。
  1. 第一小节提到的是 driver specific memory allocator 的问题,一直以来,device 上的记忆体通常由 device driver 来管理和分配 (ex. GPU),这里提出了这样分配方式的一些问题
    • device 跟 host 使用的是不同的定址空间,所以要使用 device 来作一些运算的话,需要从 host 把资料复制到 device 上
    • 阵列资列还算相对好复制,但是复杂的资料结构,如 tree、list,有很多 pointer 指来指去的,相对容易在复制上出错
    • 所以使用 shared memory space,意即 host 和 device 有着相同的定址空间。
  2. 第二小节则是说明汇流排还有装置记忆体特性,并解释 SVM 为何不容易达成,不过老实说,笔者觉得文件里面并没有提到如何解决"因为 I/O bus 和 device memory 特性所造成的困难",所以这边就简单纪录结论:要达成 SVM 要,device 能存取所有记忆体(包含 host 的),并且任何记忆体都要能"被迁移"(be migrated)到 device 上
  3. 第三小节提到 HMM 提供 helper 来达成的主要两大功能:Shared Address SpaceMigration
    • 透过 mirror CPU page table 来达成 Shared Address Space,而 device mirror CPU page table,需要 device 自己做一些 device 端的记忆体管理操作 (例如 unmmap、invalidate),所以 HMM 只提供 helper 来作通用的部分,device specific 的部分要 device 自行实作。
    • 还有透过 ZONE_DEVICE 来提供 device memory struct page 使用,让 CPU 可以透过 struct page 将 device memory 纳入 mm 的管辖,以此来实现 migration
      • 从 host migrate 记忆体到 device 对 CPU 来说就像是 swap out 机制,已经有现行可用的程序码
      • 从 device migrate 回 host,则是当 CPU 想要存取 device memory 的时候,会触发 page fault 来做处理
  4. 4~7 小节提到的就是实作上的细节还有一些范例程序,如何利用现有的程序码以及变数来实作 HMM,以及使用 HMM 的 driver 需要注意哪些地方和 HMM 的使用方法;不瞒各位说,这部分笔者其实没有看的很懂XDD,如果有相关经验的读者,笔者有描述不当的地方,或是有想要补充的话,再麻烦各位了!XD
  5. 第8、9小节则是描述加入 HMM 後,会有哪些影响
    • 第 8 小节提到的是 Exclusive Access Memory,这是提供 atomic operation 需要的基础设施,HMM 这里提供了 make_device_exclusive_range() 这个函数来标记,让整个 shared memory space 是可以提供 atomic operation 实作的。
    • 最後一个小节则是描述 cgroup 中的 memcg 还有 RSS 计算上的影响,在 HMM 这样的实作下,device memory 在 memcg 和 RSS 的计算上,都会等同於一般记忆体,这是故意这样设计的,想要让不管有没有使用 device memory 都会觉得这个改变是 transparent 的,会再有更多相关经验後来检验这个决定是不是合理的!目前这样子做唯一的坏处是 OOM 有可能会把使用太多 device memory 的 process 优先清除,但这样并不能释放最多的 host 端记忆体。

後记

  • 第三小节提到的 ZONE_DEVICE 就是我们在前一个系列,Physical Memory Model 有看到过的!(也是我们阅读这篇文件的原因之一 XD)
  • 这个系列第三篇文章有提到 sync_cpu_device_pagetables 这个 function 已经不存在在v5.15的 kernel 了,有用 git bisect 来找了一下,是在哪个 commit 把这个相关的 function 删除的
commit a22dd506400d0f4784ad596f073b9eb5ed7c6a2a (refs/bisect/bad)
Author: Jason Gunthorpe <[email protected]>
Date:   Tue Nov 12 16:22:30 2019 -0400

    mm/hmm: remove hmm_mirror and related

    The only two users of this are now converted to use mmu_interval_notifier,
    delete all the code and update hmm.rst.

    Link: https://lore.kernel.org/r/[email protected]
    Reviewed-by: Jérôme Glisse <[email protected]>
    Tested-by: Ralph Campbell <[email protected]>
    Reviewed-by: Christoph Hellwig <[email protected]>
    Signed-off-by: Jason Gunthorpe <[email protected]>

sync_cpu_device_pagetables 这个其实是 struct hmm_mirror 的一个成员,是一个 function pointer,不过这个还并不是唯一的修改,在这个 commit 之後,文件和 HMM code 都还有再做修改,所以之後会继续来研究要如何修改现在文件中的 sync_cpu_device_pagetables 的!

  • 原来 GUP 是指 get user page! XDD

  • 这篇文件提到 page migration,那麽下一篇文件,我们就来看看 page migration 吧!

参考资料

延伸阅读


<<:  [Day26] Vue 3 - Hello Vue

>>:  [Day 24] 字形渲染(Text Rendering) - 渲染文字

Day3|【Git】终端机常用基本指令 - Mac 作业系统为主

学习 Git 时,常常都是在终端机(Terminal)操作,虽然现在有很多图形介面工具(GUI,Gr...

RISC-V: Memory Fence 指令

CPU 运作过程中很容易遇到需要等待的情况, 例如 Cache Miss、Data Dependen...

Golang-Slice 使用copy()与宣告的不同

这篇算是笔记 看到有人发问slice有关的问题 有人回答用copy()进行复制slice,我就想跟用...

Day-18 Pytorch 的 Logistic Regrssion

昨天看过 Linear Regression 的部分了,那我们今天来还债 XDD 大家还记得在 D...

[Day - 30] 不完美的结束

最後,还是到了这最後一天,这第 30 天不完美的完赛,有时候时常都会想,上班就很忙了,开的 Tick...