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/