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中一些名词的概念
- Domains
- Non-shareable
- Inner Shareable
- Outer Shareable
System:
参考链接
- 由浅入深,全面解析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/