GPU资源同步:coherent、总线协议、shareable
1. 背景介绍
之前在Vulkan内存与资源管理 提到
- VK_MEMORY_PROPERTY_HOST_COHERENT_BIT:
该标志位表示CPU的write数据flush给GPU时,无需调用vkFlushMappedMemoryRanges;GPU的write的数据想要对CPU可见时,无需调用vkInvalidateMappedMemoryRanges。
解析:
- CPU的write数据是暂存在CPU cache中,如果要刷给GPU,就需要手动调用vkFlushMappedMemoryRanges使数据从CPU Cache刷到memory中,这样GPU才能看到这个数据。
- GPU的write数据是暂存在GPU cache中,刷到memory中如果要被CPU看到,则需要invalidate CPU cache,就是让CPU cache中相对应缓存的对应数据失效,只有这样CPU才会从memory中取拿最新的数据;并且可以避免CPU cache中的过时数据被挤到memory中。
2. 硬件/协议支持
以上我们是从Vulkan Spec的角度来看待host_coherent的问题。在编码实践中,需要关心以上设置是如何实践的,基本上我们可以分为两种情况,硬件支持(总线支持)和软件支持(software setting workaround)。
以Arm的AMBA总线协议为例:
AMBA总线是由ARM公司提出的一种开放性的片上总线标准,它独立于处理器和工艺技术,具有高速度低功耗等特点。协议的主要动机是用一种标准和高效的方法来重用这些跨多个设计的IP。
AMBA总线最常见的协议 – APB>AHB>AXI>ACE>CHI,它们的复杂度、性能和设计难度都是递增的。

2.1 协议特点
基本上目前移动端用的是ACE协议或者ACE-Lite协议:
ACE协议特点
- 正确的跨缓存共享(CACHEs)
- 具有不同特征的器件交互
- 最大利用缓存数据
- 高性能低功耗之间的选择
ACE协议提供了系统级一致性框架,系统级设计包括
- 一致性存储范围
- 具有一致性扩展的存储系统器件
- 系统器件之间交互的软件模型
ACE协议实现通过
- 五个状态缓存模型,指明了Cache line的状态,决定接口可以执行哪些操作
- 扩展了AXI4接口信号,提供了新的传输类型
- 扩展了Cache Master与其他Master交互的通道,以便共享数据

上图一致性互联系统,即多个具有Cache的Master通过内部互联器件管理来访问主存。
2.2 Host-Coherent实现方式
硬件支持方式有io-coherent, full-coherent,如果我们想实现硬件支持host-coherent,则需要full-coherent的支持。
因此从这里我们可以看到,host-coherent有两种方式实现:
- 硬件总线支持,full-coherent,即各Master之间的cache(CPU,GPU等)通过coherent interconnect来支持,cache之间可以相连。
- 把对应的这块memory设为 cpu non-cacheable,CPU没有cache之后,即使没有coherent interconnect的总线支持,也可以实现host-coherent,即不用做flush/invalidate CPU cache的操作。
2.3 Arm Cache其他介绍
Cache line的五种状态:

Cache line:
- invalid、valid:表明Cache line是否在cache中
- Unique、Shared:表明Cache line存在一个Cache还是多个Cache中
- Dirty、Clean:表明cache line是否需要更新到主存
ACE中一些名词的概念
shareable :共享性属性使缓存对数据访问透明。这也意味着系统必须提供硬件一致性管理,以便内部可共享域中的内核看到标记为内部可共享的位置的一致副本。
个人理解:这里ARM把inner shareable和outer shareable说的非常模糊,没有说cpu和gpu是inner shareable还是outer shareable,原因可能跟arm的coherent interconnect设备有关:
- 如果有coherent interconnect对cpu和gpu的支持,他们的数据一致性由硬件保持,那么CPU和GPU就是inner shareable的。
- 反之,如果没有coherent interconnect对cpu和gpu的支持,他们的数据一致性需要软件来保证,那么CPU和GPU就是outer shareable的。
- Domains
- Non-shareable :仅由本地代理组成的域。从不需要与其他内核、处理器或设备同步的访问。此域通常不用于SMP系统。可理解为不具备数据一致性。
- Inner Shareable :由其他代理共享的域,但不一定是系统中的所有代理。可理解为Master0修改数据,Master1可直接看到修改后的数据,不需要做数据一致性操作。
- Outer Shareable:由多个代理共享的域,这些代理可以由一个或多个内部可共享域组成。影响外部可共享域的操作也会影响其中的所有内部可共享域。
System:

3. innershareable和outershareable的区别
在OpenCL及底层硬件架构(如ARM、AMD、Intel平台)中,INNERSHAREABLE(内部共享)与OUTERSHAREABLE(外部共享)是内存共享域的核心概念,二者在共享范围、一致性维护、适用场景及性能优化上存在显著差异,具体如下:
3.1 核心定义与共享范围
- INNERSHAREABLE(内部共享)
- 共享范围:限定在Inner Shareable Domain(内部共享域)内,通常指同一SoC(系统级芯片)内的硬件单元(如CPU集群、GPU计算单元、L1/L2缓存)。例如,ARM架构中同一CPU集群内的核心(如Cortex-A76集群)或同一GPU的多个计算单元。
- 一致性保证:硬件自动维护域内数据一致性,无需手动同步。例如,同一工作组(Work-Group)内的工作项(Work-Item)通过局部内存(Local Memory)共享数据时,Inner Shareable属性确保数据在域内自动同步。
- OUTERSHAREABLE(外部共享)
- 共享范围:扩展至Outer Shareable Domain(外部共享域),可能跨越多个SoC、不同CPU集群或系统级设备(如CPU与GPU之间、多核处理器与协处理器之间)。例如,AMD APU中CPU核心与GPU的共享内存区域,或ARM big.LITTLE架构中大小核集群间的共享数据。
- 一致性保证:需结合缓存协议(如MESI、MOESI)和内存屏障(如
barrier、mem_fence)手动维护一致性。例如,CPU与GPU共享系统内存时,需通过clEnqueueMapBuffer和clEnqueueUnmapMemObject实现异步数据传输,并配合缓存刷新指令确保数据可见性。
3.2 关键区别对比
| 维度 | INNERSHAREABLE | OUTERSHAREABLE |
|---|---|---|
| 共享范围 | 同一SoC内的硬件单元(如CPU集群、GPU) | 跨SoC/跨设备(如CPU与GPU、多核集群间) |
| 一致性维护 | 硬件自动同步,无需手动操作 | 需手动同步(如内存屏障、缓存刷新) |
| 缓存行为 | 通常与L1/L2缓存强关联,支持快速访问 | 可能涉及系统内存或跨设备缓存,延迟较高 |
| 适用场景 | 工作组内数据共享、同一设备内计算单元间 | CPU-GPU协同计算、多设备并行任务 |
| 性能优化重点 | 减少域内同步开销,提升局部计算效率 | 平衡跨域数据传输带宽与一致性开销 |
3.3 技术实现与厂商差异
- ARM架构:
- Inner Shareable通常对应CPU集群内的L1/L2缓存一致性,Outer Shareable涉及系统内存或跨集群共享。例如,ARM的MAIR_EL1寄存器配置中,Inner Shareable属性与Write-Back缓存结合,优化同一集群内的数据访问;Outer Shareable则与Non-Cacheable或Write-Through缓存配合,确保跨域数据一致性。
- 典型场景:Cortex-A系列CPU集群内的工作负载共享使用Inner Shareable,而与GPU或协处理器的共享数据需配置为Outer Shareable。
- AMD/Intel APU:
- 在AMD的Fusion APU中,本地显存(Local Memory)配置为Inner Shareable,GPU通过高速总线(如Radeon Memory Bus)访问;系统内存(如DDR)配置为Outer Shareable,支持CPU与GPU的跨域共享,需通过IOMMU和缓存一致性协议(如CCI)维护数据一致性。
- Intel的Xe架构GPU中,Tile Memory(瓦片内存)使用Inner Shareable属性优化片上计算单元间的数据交换,而与CPU共享的统一内存(Unified Memory)则采用Outer Shareable属性。
- NVIDIA GPU:
- 在CUDA/OpenCL中,全局内存(Global Memory)默认支持Outer Shareable,通过全局内存控制器和缓存层次(如L2缓存)实现跨线程块(Thread Block)的数据共享;而共享内存(Shared Memory)则通过Inner Shareable属性优化同一线程块内的数据交换,减少全局内存访问次数。
3.4 实践建议
- 内存分配策略:
- 对工作组内高频共享的数据(如局部变量、临时数组),优先使用Inner Shareable属性,结合局部内存(Local Memory)减少全局内存访问。
- 对跨设备或跨域共享的数据(如CPU与GPU间的输入/输出数组),配置为Outer Shareable,并配合异步传输(如
clEnqueueMapBuffer)和内存屏障(如barrier(CLK_GLOBAL_MEM_FENCE))确保一致性。
- 性能优化技巧:
- 缓存对齐:确保内存访问符合硬件对齐要求(如128-bit对齐),避免缓存行分裂(Cache Line Split)导致的性能下降。
- 避免伪共享(False Sharing):对频繁更新的共享数据,采用数据填充(Padding)或局部缓存(如工作项私有变量)减少跨域同步开销。
- 硬件特性适配:结合具体设备的内存架构(如AMD的Infinity Fabric、Intel的UPI总线)调整内存属性,平衡带宽与延迟。
通过合理配置INNERSHAREABLE和OUTERSHAREABLE属性,可显著提升OpenCL程序在异构系统中的性能与数据一致性。具体实现需参考设备厂商的OpenCL扩展文档(如ARM的MAIR配置、AMD的APU内存架构)及硬件白皮书,结合应用程序的访问模式进行调试优化。
参考链接
- 由浅入深,全面解析AMBA ACE&CHI协议 https://zhuanlan.zhihu.com/p/597903850?utm_id=0
- ARM memory类型理解 https://zhuanlan.zhihu.com/p/353995383?utm_id=0
- ARM ACE协议学习 https://www.pianshen.com/article/4284349981/
- https://developer.arm.com/documentation/100941/0101/Memory-attributes
浙公网安备 33010602011771号