在计算机系统中,可分页内存(Pageable Memory)、固定内存(Pinned Memory)和显存(GPU Memory) 是三种不同的内存类型,它们在性能、用途和管理方式上有显著区别。以下是它们的详细对比:
1. 可分页内存(Pageable Memory)
-
定义:
普通的主机内存(CPU 内存),由操作系统通过分页机制管理,内存页可以按需交换到磁盘(swap)。 -
特点:
-
可被换出:当系统内存不足时,部分内存页可能被交换到磁盘(虚拟内存)。
-
访问较慢:如果数据被交换到磁盘,访问时会触发 Page Fault(缺页中断),导致延迟。
-
适用于一般计算:适合不频繁访问或非实时任务。
-
-
在 ONNX Runtime 中的使用:
-
默认情况下,CPU EP 使用可分页内存。
-
如果数据需要传输到 GPU,必须先拷贝到 固定内存(否则会降低传输速度)。
-
2. 固定内存(Pinned Memory / Page-Locked Memory)
-
定义:
主机内存的一种特殊形式,锁定在物理 RAM 中,不会被交换到磁盘(Page-Locked)。 -
特点:
-
不可换出:确保内存始终驻留在物理 RAM 中,避免 Page Fault。
-
适合高速数据传输:GPU(如 CUDA)可以直接通过 DMA(直接内存访问) 从固定内存高速拷贝数据,比可分页内存快得多。
-
占用物理 RAM:过度使用可能导致系统内存紧张。
-
-
在 ONNX Runtime 中的使用:
-
当使用 CUDA EP 时,输入数据通常需要先拷贝到固定内存,再传输到 GPU 显存。
-
可以通过
OrtMemoryInfo
指定内存类型(如OrtMemTypeCPUInput
)。
-
3. 显存(GPU Memory / Device Memory)
-
定义:
显卡(GPU)专用的高速内存,CPU 无法直接访问,必须通过 PCIe 总线传输数据。 -
特点:
-
访问速度极快:适合并行计算(如深度学习推理)。
-
独立管理:由 CUDA / TensorRT 等 GPU 运行时管理。
-
容量有限:通常比主机内存小(如 8GB~80GB)。
-
-
在 ONNX Runtime 中的使用:
-
使用 CUDA EP / TensorRT EP 时,模型权重、中间张量等存储在显存中。
-
可以通过
cuda_mem_limit
限制显存使用量。
-
三者的关键区别
特性 | 可分页内存 | 固定内存 | 显存 |
---|---|---|---|
是否可交换到磁盘 | ✅(可能触发 Page Fault) | ❌(锁定在 RAM) | ❌(GPU 专用) |
访问速度 | 慢(受分页影响) | 快(DMA 支持) | 极快(GPU 访问) |
适用场景 | 普通 CPU 计算 | CPU-GPU 数据传输 | GPU 计算 |
管理方式 | 操作系统管理 | 手动分配(cudaMallocHost ) | CUDA / TensorRT 管理 |
ONNX Runtime 相关 | CPU EP 默认使用 | 用于 GPU 输入/输出缓冲 | CUDA EP / TensorRT EP |
在 ONNX Runtime 中的优化建议
-
减少 CPU-GPU 数据传输:
-
使用 固定内存 提升
Host→Device
拷贝速度。 -
避免频繁在可分页内存和显存之间传输数据。
-
-
控制显存使用:
-
通过
cuda_mem_limit
限制显存占用,防止 OOM。 -
启用
memory_pattern_enabled
复用显存(适合固定输入尺寸的推理)。
-
-
避免不必要的内存拷贝:
-
使用
Ort::Allocator
直接分配 GPU 显存(如OrtMemTypeDefault
)。
-
总结
-
可分页内存 → 普通 CPU 内存,可能被换出,适合非实时任务。
-
固定内存 → 锁定在 RAM,适合高速 GPU 数据传输。
-
显存 → GPU 专用内存,计算速度最快,但容量有限。
在 ONNX Runtime 中,合理选择内存类型可以显著提升推理性能,特别是在 GPU 加速场景下。