try ai
科普
编辑
分享
反馈
  • 内核融合

内核融合

SciencePedia玻尔百科
核心要点
  • 内核融合包含两种截然不同的计算策略:一种通过融合操作来提升性能,另一种通过融合数据来节省内存。
  • 在高性能计算中,融合内核通过改善数据复用减少内存延迟,但可能需要在 GPU 占用率等资源利用率方面进行权衡。
  • 在操作系统中,内核同页合并 (KSM) 通过对相同数据页进行去重来节省内存,这是虚拟化中的一项关键技术。
  • KSM 技术使用写时复制 (COW) 来维持进程隔离,但可能会引入 CPU 开销和侧信道攻击等安全风险。

引言

在计算机科学领域,“内核融合”一词代表了一种深刻的优化哲学:消除冗余以提高效率。然而,这同一个术语描述了两种根本不同的策略,每种策略都旨在解决现代系统中的一个独特瓶颈。一种形式的融合通过简化处理器操作来加速计算,而另一种形式则通过整合数据来节省大量内存。这种模糊性常常掩盖了每种方法独特的强大功能和目的。本文旨在揭开内核融合双重本质的神秘面纱,为其两种强大的化身提供清晰的指南。我们将首先深入探讨核心的“原理与机制”,探索融合操作如何加速高性能计算,以及通过一种名为“内核同页合并”的技术融合数据页如何彻底改变内存管理。随后,“应用与跨学科联系”一章将展示这些原理的实际应用,阐明它们在推动人工智能、科学模拟和云计算等不同领域发展中的关键作用,同时也将审视它们所带来的复杂权衡和安全挑战。

原理与机制

在计算领域,“融合”的核心概念是一种对抗浪费的优美而深刻的策略。它认识到冗余,无论是行为上的还是实质上的,都是一种可以通过精巧的工程设计消除的低效形式。但引人入胜的是,这同一个理念在数字世界的两个截然不同的角落都找到了用武之地。在一个角落,它是追求原始速度的工具,是让超级计算机更快的方法。在另一个角落,它是一项安静的基础性原则,让我们的操作系统能够施展内存魔法般的壮举。让我们来探索内核融合的这两种生命形态。

避免重复的艺术:为性能而融合

想象你是一家繁忙厨房的厨师,任务是烘烤两种不同的蛋糕:香草海绵蛋糕和巧克力熔岩蛋糕。你注意到,两个食谱都需要面粉、糖和鸡蛋,而这些都储存在走廊尽头的食品储藏室里。一种幼稚的做法是完全按照第一个食谱来:走到储藏室,取面粉,拿回来;走到储藏室,取糖,拿回来;以此类推。当第一个蛋糕进烤箱后,你再开始做第二个,为了同样的原料重复同样乏味的储藏室之旅。

经验丰富的厨师会嘲笑这种低效率。他们会查看两个食谱,意识到有共同的原料,然后只去一次储藏室,把两种蛋糕所需的全部东西都带回来。通过在制作两种蛋糕时将共享的原料放在操作台上,厨师节省了无数次往返,从而显著加快了制作过程。

这正是高性能计算 (HPC) 中​​内核融合​​背后的原理。在这个比喻中,厨师是中央处理器 (CPU) 或图形处理器 (GPU),厨房操作台是速度极快但空间很小的片上​​缓存​​,而食品储藏室是容量巨大但相对缓慢的主内存 (RAM)。现代计算中最大的瓶颈不是计算速度,而是从“储藏室”获取数据所花费的时间。因此,策略便是要最大限度地减少这些往返。

当我们要求计算机执行一系列操作,比如两次连续的矩阵乘法时,可能会遇到如下情况:

  1. C←C+A1BC \leftarrow C + A_1 BC←C+A1​B
  2. D←D+A2BD \leftarrow D + A_2 BD←D+A2​B

在这里,矩阵 BBB 是一个共同的“原料”。如果分开执行,计算机会将整个矩阵 BBB 从主内存加载到其缓存中以计算第一个结果。完成后,它可能会将 BBB 从缓存中丢弃,以便为其他数据腾出空间。然后,为了执行第二个操作,它将不得不再次加载整个 BBB。对于一个大小为 n×nn \times nn×n、使用 8 字节数字的大矩阵 BBB 来说,这意味着从慢速内存中读取 8n28n^28n2 字节,然后再读取 8n28n^28n2 字节,总共产生 16n216n^216n2 字节的流量。

内核融合将这两个独立的操作合并成一个更大、更复合的内核。融合后的操作明白 BBB 是两个计算都需要的。它将 BBB 的一部分加载到缓存中一次,并在该部分被丢弃之前用它来更新 CCC 和 DDD。通过在数据还在“操作台”上时复用它,这种融合方法将矩阵 BBB 的内存流量减少了一半,降至仅 8n28n^28n2 字节。这种对缓存中数据的改进复用被称为增强​​时间局部性​​,是编写快速代码的基石。

但这个优化故事伴随着一个微妙而重要的权衡。融合内核并非普遍“有益”,它是一种平衡之术。当我们合并操作时,新的、更大的内核通常需要同时处理更多数据片段。在通过并行运行数千个线程来实现惊人速度的 GPU 世界里,这种处理发生在称为​​寄存器​​的微小、超快的存储单元中。

考虑一个两步过程:第一个内核读取输入 XXX 产生中间结果 AAA,第二个内核读取 AAA 产生最终输出 YYY。融合它们意味着创建一个直接从 XXX 到 YYY 的单一内核,将中间结果保留在寄存器中,而不是将其写出到慢速的全局内存。避免这次内存往返所节省的开销可能是巨大的。

但问题在于:寄存器是 GPU 线程拥有的最宝贵的资源。如果一个融合内核为每个线程要求过多的寄存器,GPU 就无法在其处理核心上容纳同样多的线程。活动线程数量的减少被称为​​占用率​​的下降。高占用率至关重要,因为这是 GPU 隐藏内存访问延迟的方式——当一些线程在等待数据时,其他线程可以执行。如果占用率降得太低,就没有足够的线程来隐藏延迟,GPU 就会停顿下来等待数据。

因此,我们面临着一个绝妙的矛盾。融合减少了内存访问的次数,但可能会削弱我们隐藏剩余访问延迟的能力。过于激进的融合实际上可能使程序变慢。例如,对于一个由四个内核组成的流水线,最好的方法可能不是将所有四个内核融合成一个巨大的内核。相反,两两融合(d=2d=2d=2)可能恰到好处,既消除了一些内存流量,又不会因增加寄存器压力而严重影响占用率。找到这个最佳的融合深度是一门艺术,是在内存流量和执行资源之间进行的精妙舞蹈。

合而为一的艺术:为内存而融合

现在,让我们从高速计算的世界转向操作系统 (OS) 安静而基础的领域。在这里,“内核融合”指的是一个不同但同样优雅的概念,通常被称为​​内核同页合并 (KSM)​​。其原理不是避免冗余的行为,而是消除冗余的数据。如果你在内存中有二十个完全相同的数据页副本,为什么要浪费空间存储它二十次呢?

想象一个大型的大学图书馆。如果一个 500 人的班级里每个学生都需要阅读《白鲸记》(Moby Dick),图书馆去库存 500 本独立、相同的副本是荒谬的。图书馆的书架空间会立刻用完。相反,它只库存几本,学生们共享它们。KSM 是你计算机 RAM 的一个神奇版图书馆。它有一个守护进程,不断扫描内存,寻找内容逐字节完全相同的页。当它找到这些页时,它会执行一个无声的优化:释放所有重复的物理页,并将所有进程重新映射到单个共享的物理副本上。

这项技术是现代云计算和虚拟化的基石。考虑一台运行着 24 个相同虚拟机 (VM) 的服务器。每个 VM 都加载相同的操作系统、相同的库、相同的服务。如果没有 KSM,所需的 RAM 将是单个 VM 内存占用量的 24 倍。有了 KSM,这其中绝大多数的内存——所有相同的操作系统和应用程序页——只存储一次。这可以带来惊人的节省;对于一个典型的工作负载,它可能在单个主机上释放近 44 GiB 的 RAM,从而允许运行比物理上可能支持的更多的 VM。

这就提出了一个关键问题:如果其中一个 VM 试图更改共享页上的某些内容会发生什么?在我们的图书馆比喻中,你不能直接在图书馆共享的《白鲸记》副本上写笔记。这会破坏这本书对其他所有人的完整性。这时,操作系统施展了它最聪明的技巧:​​写时复制 (COW)​​。

当 KSM 合并页面时,它会在所有共享进程的内存映射(页表)中将这个单一的共享物理页标记为​​只读​​。如果一个进程(我们称之为 P1P_1P1​)随后尝试写入该页,硬件会触发一个​​缺页中断​​。这不是一个错误,而是一个信号,通知操作系统需要进行特殊处理。操作系统的中断处理程序被唤醒并执行 COW 之舞:

  1. 它识别出这是一个对共享只读页的写操作。
  2. 它迅速为 P1P_1P1​ 分配一个新的、私有的物理页。
  3. 它将共享页的全部内容复制到这个新的私有页中。
  4. 它更新 P1P_1P1​ 的页表,使其指向新页,并将其标记为​​可写​​。
  5. 然后,它恢复 P1P_1P1​ 的执行,现在 P1P_1P1​ 在自己的私有副本上完成写入,完全没有意识到刚才发生的魔法。

与此同时,所有其他进程继续共享原始的、未被触动的页面。这个机制完美地保留了​​进程隔离​​——一个程序不能干扰另一个程序内存的基本原则——同时仍然获得了共享带来的巨大好处。为了实现这一点,操作系统必须维护仔细的元数据,确保在进行任何合并之前,它知道哪些页面是共享的、由谁共享,并且它们的内容是逐字节相同的。

隐藏的成本与危险

与任何强大的技术一样,融合并非没有成本和风险。其优雅之处隐藏着一层复杂性,可能导致一些微妙的问题。

在 KSM 的情况下,共享行为本身就产生了开销。操作系统需要为每个物理页维护一个​​反向映射​​——一个列出指向它的每个进程和虚拟地址的列表。通常,这个列表只有一个条目。对于一个由 32 个 VM 共享的页面,它有 32 个条目。如果操作系统需要修改该页面(例如,将其交换到磁盘),它现在必须遍历所有 32 个进程的页表来更新它们的条目。这使得管理一个共享页的成本显著增加,这是我们为节省内存而付出的隐藏 CPU 成本。

在“写入抖动”场景中,这种开销可能成为一个严重问题。如果进程频繁地写入共享页,它们会引发一场 COW 中断的风暴(这会消耗 CPU),并留下一连串新私有化的页面。然后,KSM 守护进程在后台疯狂工作,消耗更多 CPU 来寻找并重新合并这些页面,结果它们又被再次拆分。系统可能会进入一种状态,即花费大量时间仅用于管理内存,导致应用程序吞吐量低下。这产生的症状看起来和感觉上都像​​颠簸​​,但瓶颈是 CPU 争用,而不仅仅是磁盘 I/O。因此,KSM 的效用深度依赖于工作负载的写入行为;它在稳定、以读为主的数据上表现最佳。

最阴险的是,KSM 可能会打开一个安全漏洞。COW 机制,对于隔离至关重要,却有一个可观察到的副作用:触发 COW 中断的写入比对私有页的正常写入慢几个数量级。与受害者在同一台机器上的攻击者可以利用这一点。攻击者创建一个包含“猜测”的秘密(如密码)的页面,他们怀疑这个秘密存在于受害者的内存中。然后他们等待。如果 KSM 将攻击者的页面与受害者的页面合并,这意味着猜测是正确的。攻击者可以通过简单地写入自己的页面并测量所需时间来检测到这次合并。长时间的延迟意味着发生了 COW 中断,从而证实了合并。这是一种​​时间侧信道攻击​​,一种让系统自身的优化泄露信息的巧妙方法。

解决方案不是放弃 KSM 这个强大的理念,而是更明智地应用它。我们可以限制 KSM 只在受信任的安全域内操作,例如,只合并属于同一用户或同一虚拟机的页面。这可以防止攻击者窥探不相关的受害者,在保留安全性的同时,仍然在良性情况下实现显著的内存节省。这是现代系统中性能、效率和安全性之间持续、演变的博弈的完美例证。

无论是融合计算以节省宝贵的纳秒,还是融合数据以节省宝贵的千兆字节,其核心原则都是一场对抗冗余的优美斗争。这是计算机科学独创性的证明,揭示了一种深刻的模式,即通过识别和统一相似之处来找到效率和优雅。

应用与跨学科联系

在掌握了内核融合的原理之后,我们现在踏上一段旅程,去看看这个优雅的理念在何处焕发生机。你可能会惊讶地发现,这个概念以其各种形式,在人工智能、天体物理学和网络安全等迥然不同的领域中,都是一个隐藏的幕后功臣。其原则在于统一:通过智能地组合原本分离的东西,我们可以实现原本无法企及的性能和效率。我们将发现,“融合”本身在计算世界中有两种深刻而截然不同的含义。一种是关于融合操作以提高速度;另一种是关于融合数据以节省空间。

计算融合的艺术:加速我们的数字宇宙

内核融合的第一个,或许也是更常见的含义,是作为一种编译器优化。想象一位大师级厨师正在准备一道复杂的菜肴。新手可能会按部就班地遵循食谱:切好所有洋葱,放入碗中;然后切好所有胡萝卜,放入另一个碗中;然后取锅,加热,最后加入配料。然而,大师级厨师会融合这些步骤。他们切一个洋葱,直接滑入热锅中,然后切一个胡萝卜,也加进去。这避免了不断切换任务以及将中间配料在操作台上移来移去的开销。

在计算中,“厨师”是处理器,“配料”是数据,“操作台”是主内存。与处理器本身的速度相比,访问主内存的速度慢得令人难以置信。内核融合是编译器重写“食谱”的艺术,旨在让数据在处理器快速的本地缓存中流动,就像厨师的砧板和锅一样,避免到主内存的长途旅行。

助燃人工智能革命

在现代深度学习中,这一原则的重要性无出其右。神经网络由多层数学运算组成,形成一个计算图。对这个图的幼稚执行就像那个新手厨师:启动一个内核执行卷积,其输出被写入内存,然后启动另一个内核执行批处理归一化,以此类推。每次内核启动都有开销,而内存流量造成了主要瓶颈。

然而,一个智能的编译器可以融合这些操作。考虑一个神经网络中的常见序列:一个卷积,接着是批处理归一化,再加上一个偏置项。在推理期间(当模型进行预测时),这些独立步骤的数学运算可以在代数上组合成一个等效的“融合”操作。编译器可以用一个节点替换图中的三个独立节点,从而显著减少开销和内存流量,使模型运行得更快。

这不仅仅是一个小小的调整;它能从根本上改变性能格局。以许多移动端友好神经网络中使用的“深度可分离卷积”(DSC) 架构为例。DSC 包括两个步骤:一个深度卷积和一个逐点卷积。如果作为两个独立的、未融合的内核执行,启动两个内核和将中间结果写入内存的开销可能会使这个“高效”的 DSC 比单个、更大的标准卷积还要慢!但是,当这两个步骤融合成一个内核时,中间数据停留在快速的片上内存中,启动开销减半,DSC 的真正计算效率得以释放。正是这种融合行为使得许多现代轻量级 AI 模型变得实用。这整个策略是现代机器学习编译器框架的基石,这些框架将高级模型转换为高性能代码。

助力科学发现

同样的计算融合原则在高性能计算 (HPC) 领域有着悠久的传统,科学家们在这里模拟从星系碰撞到机翼上的气流等一切事物。在许多数值方法中,例如用于模拟电磁波的时域有限差分 (FDTD) 方法,计算涉及遍历一个网格并应用一系列模板操作。例如,一个内核可能计算一个场的“旋度”,而第二个内核使用该结果来更新场随时间变化的值。

通过融合这些“旋度”和“更新”内核,我们可以计算网格一小块区域的旋度,并立即用它来更新同一区域,而所有必要的数据此时仍然在处理器的缓存中“炙手可热”。这极大地提高了“算术强度”——即执行的计算量与移动数据的比率——将模拟从受内存带宽瓶颈限制推向仅受处理器计算速度限制。该技术广泛适用于许多基于模板的科学代码,包括像间断伽辽金 (DG) 方法这样的复杂数值方法,其中融合计算的体、面和更新阶段是在现代 GPU 上实现高性能的关键策略。

优化大数据

这个概念甚至延伸到了大数据和数据库的世界。当你运行一个像“查找‘工程’部门的所有员工并计算他们的平均工资”这样的查询时,数据库系统将其处理为一个逻辑运算符的计划:首先是选择(按部门筛选),然后是聚合(计算平均值)。一个幼稚的引擎可能会执行筛选,将所有结果员工记录写入一个临时表,然后让聚合运算符读取该临时表。

现代“向量化”或 JIT 编译的数据库引擎做得更聪明:算子融合。它们编译一个紧凑的单一循环,对于每条记录,检查部门,如果匹配,就立即更新用于计算平均值的总和与计数。没有任何中间表被写入内存。这与编译器中的内核融合完全类似,并且可以通过将数据库算子映射到不同的指令集架构 (ISA) 来概念化。一个非融合的、破坏流水线的模型类似于一个效率较低的架构,而一个融合的、流水线化的模型可以被看作是一个高效的加载-存储架构,其中数据通过寄存器(片上内存)在操作之间流动,而不是被物化到主内存。

内存融合的艺术:凭空创造空间

现在我们转向内核融合的第二个,同样深刻的含义。这无关乎融合操作,而在于融合数据。在操作系统中,这项技术被称为​​内核同页合并 (KSM)​​。这个想法非常简单:操作系统内核定期扫描物理内存,寻找包含相同数据的页面。如果找到两个或更多相同的页面,它会将它们合并成一个单一的物理页面,并更新进程的页表,使它们全部指向这个单一的共享副本。该页面被标记为“写时复制”,因此如果之后有任何进程试图修改它,系统会无缝地为该进程创建一个私有副本。

这无关乎速度;而在于节省内存。想象一个云服务提供商运行着数百个使用相同客户操作系统的虚拟机 (VM)。没有 KSM,每个 VM 在内存中都会有自己的一份相同的操作系统内核和标准库副本。有了 KSM,主机操作系统可以找到所有这些相同的页面并将它们合并,从而极大地减少总内存占用。它实质上是对内存进行实时“去重”。这是使虚拟化和云计算在经济上可行的基础技术。

现代操作系统的精妙之舞

这个强大的功能并非孤立存在。它与操作系统的其他部分以引人入胜的方式相互作用。

  • ​​遗忘的代价:​​ 当系统内存不足,一个合并的页面需要被换出时会发生什么?如果页面置换算法,比如简单的先入先出 (FIFO) 策略,换出了一个共享页面,那么节省的内存就丢失了。当再次需要这些数据时,它将作为私有页面被缺页调入。KSM 守护进程最终将不得不重新扫描并重新合并它,从而产生 CPU 成本。这在 KSM 节省的内存和在内存受限环境中维持这种节省所需的 CPU 开销之间创造了一种微妙的权衡。

  • ​​保留新近度:​​ 与更复杂的页面置换算法(如最近最少使用 (LRU))的交互更为微妙。这些算法跟踪页面的最近使用情况来决定要换出哪个页面。当 KSM 合并两个页面时,新合并的页面的“年龄”是多少?一个幼稚的选择可能会使一个非常“热”(最近使用)的页面突然显得“冷”,使其成为被换出的首选。正确的方法是也合并元数据,确保新的共享页面继承其父页面的“最热”属性——例如,通过取其老化计数器的最大值。这保留了 LRU 近似算法的完整性,并展示了让复杂的操作系统功能协同和谐工作所需的深思熟虑。

共享的阴暗面:安全与监控

然而,共享行为本身打开了安全问题的潘多拉魔盒。内存去重创造了一个“侧信道”——一个微妙的、间接的信息泄露渠道。一个 VM 中的攻击者可以试图推断另一个 VM 中受害者的内存内容。攻击者创建一个包含特定内容的页面(例如,一个已知的密码哈希值)并等待。如果该页面被 KSM 合并,就意味着受害者的内存中有一个相同的页面!通过仔细计时写操作(由于写时复制中断,对共享页面的写操作更慢),攻击者可以探测受害者私有内存中是否存在特定数据。

这是一个严重的威胁。主要的缓解措施是为敏感的 VM 或应用程序选择性地禁用 KSM。但这当然是有代价的:你会失去内存节省。这让系统管理员陷入了在安全与性能效率之间进行权衡的典型困境。

然而,在一个美妙的转折中,同样的机制可以被转化为一种防御工具。一个安全监控系统可以观察主机上的 KSM 活动。如果两个本应完全不相关的进程突然通过 KSM 开始共享大量页面,这是一个强烈的异常信号。它可能表明存在隐蔽信道、进程注入或其他恶意协调。曾经的漏洞变成了一种情报来源。

最后,这场精妙的舞蹈与其他安全功能继续交织。地址空间布局随机化 (ASLR) 是一种防御机制,它随机化代码和数据在内存中的位置,使攻击者更难利用内存损坏漏洞。这种随机化意味着,即使两个进程加载了相同的库,包含绝对内存地址的可写数据页在每个进程中的内容也会不同。这有效地阻止了 KSM 合并这些页面。在这种情况下,一个安全功能 (ASLR) 部分抵消了一个效率功能 (KSM) 的作用,但仅限于某些类型的数据——来自库的只读代码页仍然可以由操作系统的文件系统缓存高效地共享。

从加速人工智能到模拟宇宙,从使云计算变得经济实惠到打开和关闭安全漏洞,“融合”这个简单的理念揭示了现代计算深刻、相互关联且常常充满悖论的本质。它证明了工程师和科学家们不懈的创造力,他们通过在微小之处寻求统一,从而在宏大的尺度上实现了复杂性。