# Day 21 Heterogeneous Memory Management (HMM) (一)

今天来看看在 # Day 18 Physical Memory Model (三) 的文件中提到的 HMM!
在要求效能又要求功耗的现今,异质运算系统是一个很热门的研究和实作方向;
笔者在硕士班期间加入的实验室,也是在做相关的研究,想方设法的结合 CPU 和 GPU 的运算能力,来实现一个高效能的系统;
这份文件描述的就是 kernel 中提供的异质系统下记忆体管理的基础设施 (facility),直接看下去吧!

文件

.. _hmm:

===================
异质记忆体管理 (HMM)
===================

提供基础设施和辅助函数来整合非传统记忆体
(装置上的记忆体,例如 GPU 上的记忆体)
至一般的核心执行路径,
以特规化的 struct page 作为此类记忆体的基石。
(参见本文件第 5 至 7 节)

HMM 也为 SVM(共享虚拟记忆体)提供了可选择的辅助函数,
即,允许装置存取程序的定址空间,
意味着任何对 CPU 是有效的指标,对於装置也会是有效的。
这对於简化进阶的异质架构,
包含使用 GPU、DSP、FPGA 来为程序做各式各样不同的运算,
已经是个必要的存在。

本文件分为以下部分:
在第一部分中揭露了和使用特定於装置的记忆体分配器的相关问题。
在第二部分,提到了许多平台天生的硬体限制。
第三部分描述了 HMM 设计概观。
第四部分解释 CPU 分页表的镜像是如何运作的,
并且在其中使用 HMM 的目的。
第五部分涉及在核心中,装置的记忆体是如何表示的。
最後,最後一节介绍了一个新的转移辅助函数,
它能够利用装置的 DMA 引擎。

.. contents:: :local:

使用装置特定记忆体分配器的问题
============================

具有大量板载记忆体(几 GB)的装置,如 GPU
从过去就一直透过专用的驱动程序 API 来管理它们的记忆体。
这会造成装置驱动程序分配和管理的记忆体和一般应用程序的记忆体 
(私有匿名的、共享记忆体或是一般档案备份的记忆体) 之间有断层。
从这里开始,我将把这部分称为拆分的定址空间。
并使用共享定址空间来指称相反的情况:
即,装置可以使用任何应用程序的记忆体区域。

拆分的定址空间是因为装置只能存取专用的
装置 API 所分配的记忆体而产生。
这意味着程序中的所有记忆体物件
和从装置的角度来看是不对等的,
而这使得使用广泛函式库的大型程序变得更为复杂。

具体来说,这意味着想要利用像 GPU 等装置,
程序码需要在一般分配的记忆体 (malloc、mmap private、mmap share)
和通过装置驱动 API 分配的记忆体之间复制记忆体物件。
(这仍然是使用 mmap 但是是在装置文件上)。

对於扁平的资料集合(阵列、网格、图像等),这并不难实现,
但是对於复杂的资料集合(列表、树状结构等),则很难做到正确。
复制一个复杂的资料集合,
需要重新映射其每个元素之间的所有指标关系。
因为这些重复的资料集合和位址,使得程序很容易出错并且更难除错。

拆分的定址空间也意味着,函式库不能直接使用
从主要程序或是其他函式库所取得的资料。
因此每个函式库可能必须使用特定於装置的记忆体分配器来复制其输入资料。
大型专案受此影响困扰,也因为各种记忆体副本浪费资源。

复制每个函式库的 API 来实作
以接受由装置特定的分配器所分配的输入或输出记忆体,
不是一个可行的选择。这将导致一个函式库的入口点有爆炸多的组合。

最後,随着高级语言结构的进步(在 C++ 中,在其他语言也有)
现在编译器可以利用 GPU 和和其他装置,在程序设计师不知情的情况下。
一些编译器识别的模式只能使用在共享定址空间。
对於所有其他模式,使用共享定址空间也比较合理。

我的理解

目前阅读的部分,提到了这份文件的架构以及第一节的使用特定於装置记忆体分配器的问题。
其实还稍微有些感觉呢,大部分有稍微使用过 CUDA、OpenCL 框架,或是任何异质装置管理框架的读者想必对这个议题都不陌生!
在使用实际装置来做运算之前,要先使用装置驱动程序相关的 API,例如:CUDA 上的 cudaMalloc 来取的一块装置上的记忆体,接下来使用 cudaMemcpy 将 host 上的资料传到 GPU 上,进行运算後,再将 GPU 上运算过後的资料复制回 host 上,才算真正的完成一次运算并且得到资料;有时候在 GPU 的加速之下,甚至会看到复制资料使用的时间还比实际运算的时间来的长!
也许这个 HMM 会是一个可以稍微缓解这个问题的技术噢!那麽我们明天继续一起看下去吧!
(( p.s. 虽然现在看起来 CUDA driver 是还没有支援 HMM XD 连结

後记

transparently 和 coherently 要怎麽翻啊?XD
transparently 应该是指"透明的",有一种不会影响到其他、或是不会被感知到的感觉。
coherently 是指会看到一致性的资料,的那种感觉吧!XD

参考资料

延伸阅读


<<:  DAY30 - [React] useMemo 与 後续

>>:  Leetcode: 785. Is Graph Bipartite?

Day 12:vim 配色方案

俗话说人要衣装,佛要金装,我们的 vim 也得要有漂亮的外观。今天就让我们来看看如何调教调整 vim...

13. 关於 IIFE 的 4 题练习

IIFE 立即函式 定义 IIFE (Immediately Invoked Function Ex...

Day05-v-on事件处理

Vue中还有一个很重要的指令就是事件绑定v-on,让DOM可以去做更多的事情。 v-on事件绑定(简...

【Day 08】List 介绍!

前言 list 是 Python 中最常见的资料类型,有许多的应用都会用到 list 喔! 今天会先...

D13. 学习基础C、C++语言

D13. 基础题3n+1跟进阶3n+1(Uva100) 3n+1是很基本的练习题目,题目大致上是输入...