CPU与外设的统一虚拟地址寻址是OpenCL SVM的基石,为OpenCL和AI计算编程提供了生产力工具。
1. 64 位地址空间的实际使用限制
在 AMD64 和 IA64 架构中,虽然理论上提供了 64 位(2^64 ≈ 18.4 亿 TB)的虚拟地址空间,但 CPU 实际仅使用其中的一部分:
-
低地址区域:VA[63:47] = 0(0x00000),覆盖地址范围 0x0000 0000 0000 ~ 0x0000 FFFF FFFF(约 256TB)
-
高地址区域:VA[63:47] = 0x1FFFF(全 1),覆盖地址范围 0xFFFF 0000 0000 ~ 0xFFFF FFFF FFFF(约 256TB)
-
中间区域:VA [63:47] 为 0x00001 ~ 0x1FFFE 的范围,这部分地址空间被称为空洞(Hole),CPU 无法直接访问。
因此,实际有效的虚拟地址宽度为 48 位(2^48 ≈ 256TB),这是硬件设计的限制,而非软件限制。
2. 为什么会有 “空洞”
这种设计主要出于以下考虑:
-
兼容性:保持与 32 位系统的向后兼容性,低地址区域(0~4GB)可直接映射到 32 位地址空间。
-
简化硬件:减少需要处理的地址位数,降低地址转换硬件的复杂度。
-
安全隔离:空洞区域可用于防止意外或恶意访问,增强系统安全性。
3. GPU 如何利用这个 “空洞”
在 SUA(系统统一寻址)模式下,GPU 会将自己的GPUVM 地址空间(40 位,2^40 ≈ 1TB)映射到这个空洞区域:
-
GPUVM 的 40 位地址被扩展为 64 位,高 17 位(VA [63:47])通常设置为 0x00001 或其他未被 CPU 使用的值。
-
例如,GPUVM 地址 0x0000 0000 1234 可能被映射为 64 位地址 0x0000 1000 0000 1234,落在空洞区域内。
这样,GPU 可以同时访问:
-
ATC 地址空间(通过 IOMMU 访问系统内存,对应 CPU 的低区和高区)
-
GPUVM 地址空间(通过 GPUVM 页表访问专用内存,对应空洞区域)
4. 地址转换流程示例
假设 GPU 要访问一个 64 位地址 0x0000 1000 0000 1234:
-
判断地址归属:检查高 17 位(VA [63:47] = 0x00001),发现属于 GPUVM 空洞区域。
-
地址压缩:
-
从 64 位地址中减去GPUVM_Base(例如 0x0000 1000 0000 0000),得到 40 位相对地址 0x0000 0000 1234。
-
设置ATC 位 = 0,表示使用 GPUVM 页表。
-
-
地址转换:通过 GPUVM 页表将 40 位地址转换为物理地址。
若地址属于 ATC 空间(如 VA [63:47]=0 或 0x1FFFF),则:
-
直接使用低 48 位地址(VA [47:0])。
-
设置ATC 位 = 1,通过 IOMMU 转换为物理地址。
5. 图示说明

6.总结
-
CPU 限制:AMD64/IA64 CPU 仅使用 64 位地址空间中的 48 位,形成中间空洞。
-
GPU 优化:GPU 利用这个空洞区域映射自己的 GPUVM 地址空间,实现与系统内存的统一寻址(SUA)。
-
地址转换:通过 ATC 位和孔径机制,硬件自动区分访问路径(ATC/IOMMU 或 GPUVM),确保高效且安全的内存访问。

被折叠的 条评论
为什么被折叠?



