jollen.org

Jollen 的 Blog
Jollen's email: jollen # jollen.org
more:  Jollen's Training

Typed Memory 架構:簡介 MTLHeap / IOSurface

.作者:Jollen
.日期:August 25, 2026 at 8:00 AM


AI 推論引擎的記憶體管理,現在看起來是一門「硬功夫」;也是 AI ASIC 晶片的核心技術之一。

把記憶體裝好裝滿,或許能滿足大部分 LLM 的 Runtime 需求。不過,記憶體不夠就加,這種「一點也不手軟」的解決方案,或許適合 GPU 工作站,但對手機硬體來說,實在太奢侈。

面對「非皇家頂規」的硬體,比起泛化的「記憶體越大越好」觀念,做好記憶體管理,反倒比較實際一點。

Typed Memory 架構:簡介 MTLHeap / IOSurface

延續 Qwen3.5 的研究;討論記憶體管理時,最直覺的想法通常是「還剩多少 RAM」。但面對圖形運算、影像處理與 AI 推論來說,真正的問題是:

  • 如何配置有效記憶體
  • 這塊記憶體拿來做什麼
  • 多久後要回收此記憶體(記憶體空間可以存活多久)

這個技術議題,統稱為 Typed Memory

認識 Typed Memory

用白話的方式來講,Typed Memory 就是讓記憶體依照用途、硬體特性與生命週期,分成不同類型。

例如,QNX OS 的 POSIX Typed Memory,就是很經典的 Typed Memory 實作。QNX 能在系統啟動時,事先規劃並預留 memory pool,例如 reserved video memory,讓這些特定用途的記憶體與一般 SYSRAM 分開;應用程式再透過具名(typed)的 memory object 使用這些 memory region。

Typed Memory 也能指定 contiguous allocation,適合有實體位址或 DMA 條件的硬體。於是記憶體開始有了「用途」:

System RAM
├── General Memory
├── Graphics Memory
├── DMA Memory
└── Special-purpose Memory

iOS App 透過 Metal 技術,也能實作 typed memory 技術;而其中最值得研究的是 MTLHeapIOSurface

MTLHeap:建立 Memory Resources

Apple Metal 將 MTLHeap 定義為可進一步配置 resources 的 memory pool。開發者可先配置一大塊 GPU 專用的記憶體,再經由 Heap 建立 MTLBufferMTLTexture 等存取資源。

一個簡單的 Swift 實作範例如下:

let length = 16 * 1024 * 1024

let layout = device.heapBufferSizeAndAlign(
    length: length,
    options: .storageModePrivate
)

let descriptor = MTLHeapDescriptor()
descriptor.storageMode = .private
descriptor.size = layout.size

let heap = device.makeHeap(descriptor: descriptor)

let buffer = heap?.makeBuffer(
    length: length,
    options: .storageModePrivate
)

heapBufferSizeAndAlign() 會先計算 Heap resource 所需要的大小與 alignment,再建立 Heap。

更重要的能力是 aliasing

  1. 假設運算流程有 A、B、C 三個大型暫存 buffer
  2. A 用完後才會使用 B
  3. B 用完才使用 C
  4. 當以上 A/B/C 三者沒有同時存在的必要時,就有機會重複利用同一段 Heap backing memory

Apple Silicon 也把這種 transient resource sharing 列為重要記憶體管理技術;這也是降低 Metal App memory footprint 的方法。

因此,MTLHeap 真正管理的問題是:

需要多少記憶體
+
什麼時候需要
+
什麼時候可以重用

這已經非常接近 Typed Memory Architecture 的設計哲學。

IOSurface:共享記憶體

IOSurface 處理的是另一個常見問題:共享 image buffer。 影像處理的 Pipeline 流程如下:

Image
→ Pixel Buffer
→ RGB Buffer
→ Metal Texture
→ Tensor

若每一流程,都產生一份 image copy,Memory Peak 很快快速上升(記憶體使用量突增)。因此,成熟的 App 架構會思考:哪些工作能共用 backing memory。

IOSurface 就是為了這類問題,所提供的記憶體管理基礎設施。

Apple 將 IOSurface 定義為可分享 hardware-accelerated framebuffer 與 texture data 的機制,目的之一就是更有效率地管理 image memory。

例如,可以建立一個簡單的影像 surface:

import IOSurface

let width = 1920
let height = 1080
let bytesPerRow = width * 4

let surface = IOSurface(properties: [
    .width: width,
    .height: height,
    .bytesPerElement: 4,
    .bytesPerRow: bytesPerRow,
    .allocSize: bytesPerRow * height
])

這塊 backing memory 可以成為不同影像處理元件之間交換資料的基礎。Apple 的官方文件也指出,IOSurface-backed pixel buffer 可以在 CPU、GPU,甚至跨 process 分享。

MTLHeap 與 IOSurface 解決不同問題

MTLHeap 著重 Metal resources 的 allocation、lifetime 與 memory reuseIOSurface 則著重 image buffer 的共享與跨元件交換

兩者以 Typed Memory 架構的角度來看,可以得到以下結論:

Memory
├── Persistent
│   └── 長時間存在
├── Transient
│   └── 運算完成即可重用
└── Shared Image
    └── 多個處理階段共用

使用 Typed Memory 觀念,iOS App 的記憶體管理就會具有「角色」與「生命週期」。

為什麼 AI 推論引擎需要這種架構

AI 推論引擎(inference runtime),對 Typed Memory 有迫切需求。

一個完整的 inference runtime,包含以下處理單元:

  • Model Weights
  • KV Cache
  • Recurrent State
  • Activations
  • Compute Scratch
  • Image Buffer
  • Vision Encoder intermediate tensors
  • Output tokens

每一個處理單元都會「用到記憶體」。如果老是用「暴力法」來管理記憶體,就會造成 Memory Peak 問題。所謂的暴力法,就是不顧一切地配置記憶體(memory malloc),需要更大量的記憶體時,就升級硬體以滿足需求。

Memory Peak 經常出現在多組大型 buffer 同時存活 的情況。

在 iPhone 作業系統環境下,iOS 會監控 App 的總記憶體使用量,當其使用量超過限制時,系統會直接終止 App,造成「閃退」現象。

解決「閃退」問題的方法,就是使用 Metal Heap 來實作 Typed Memory 記憶體管理架構。

未來的 on-device AI Runtime(Local LLM),需要管理的不只是模型,也包含整個 inference pipeline 的記憶體生命週期。MTLHeapIOSurface 提供了兩個很好的切入點:前者管理 GPU resource 的配置與重用,後者降低影像資料在不同處理階段反覆複製的需求。

本文由 Jollen 純手工撰寫,網站由 AI Agent 維護。轉載請註明出處與作者,並全文引用。轉載時請在文章開頭或結尾明顯處註明「本文出處:https://www.jollen.org,已取得原作者同意並授權使用。」
訂閱電子報:不定期 Jollen's Blog 精選文章隨 Moko365 電子報寄送;請透過 Moko365 電子報訂閱(可隨時取消)。

Copyright(c) 2001–2026 www.jollen.org. All rights reserved.
Site build: August 25, 2026 at 1:44 PM