ETH官方钱包

切換
舊版
前往
大廳
主題

Vulkan初步使用感想

Lumi | 2016-04-06 20:18:41 | 巴幣 200 | 人氣 1807

Vulkan和Mantle相比有部分簡化,也有部分變複雜。例如之前煩人的記憶體配置變簡單了,各heap已經依照功能和讀寫效率排序好,取得記憶體時也不再是一口氣給你一個page大小。Mantle用轉換state的方式來同步資源的存取,Vulkan則改用更明確的memory barrier指令。用起來雖然比較複雜,但最佳化的空間更大。Mantle上傳vertex資料後需要對該記憶體做一次state轉換,好讓GPU看見CPU所寫入的資料。Vulkan則保證將command buffer送給queue時,被送出的cmd就能看見被寫入的資料(若資料儲存在cache heap則需要額外做flush),不須額外的memory barrier指令。

image物件的layout設定用起來有點像是mantle的state,用來指定該image的用途,目前這個值似乎只有AMD在使用。若是其他廠商的硬體可以直接將之設定為"general",但在AMD上必須依照該image的實際用途設值,否則程式會當給你看。難以想像Vulkan API的制定者為了一家公司做出這種妥協,目前我還不知道有沒有其他地方也有這種專門為了某一家廠商的設計。不過這代表了程式在其中一家的硬體上執行沒問題,不保證在其他硬體上也沒問題。就算用validation layer也沒辦法檢查到所有錯誤,唯一辦法就只有實際弄來不同廠商的硬體來測試。

大部分Vulkan API都改得更直覺,但還是有個令人困惑的設計。它允許我們在配置Vulkan物件記憶體的時候使用自己寫的allocator,但Vulkan不一定會使用我們給的allocator。就算它真的用了,效能也很有可能會變差,因為寫driver的人肯定比我們懂內部適合什麼記憶體配置法。AMD的人甚至建議不要用自己寫的,實在讓人懷疑這東西到底設計出來幹嘛的。

個人感覺整體來說還是比mantle複雜,因為多了許多新功能和新物件,光是寫個demo腦細胞就死很多。實際使用Vulkan時會發現細節幾乎都和Mantle不一樣,之前寫的Mantle程式碼大部都得重寫,而且程式碼暴增許多,Mantle可說是只有精神留了下來。
這回就不寫教學文了,上回的教學就已經寫得有夠長,寫Vulkan教學很可能會寫不完。現在學習最快的方式恐怕只能看範例還有官網的規格書


▲繪出8000個方塊,在GTX 750Ti上FPS為589,尚未完全最佳化

目前光是包裝一部份Vulkan物件就寫了3300行程式碼,還只能畫出如上圖般的簡單物體,更別提運用這些物件的程式也要重寫。Vulkan的render pipeline架構做了大修改,因此舊的pipleine程式碼只剩下少部分能用。從shader code撈資料變成得自己parse編譯後的binary,Vulkan沒有提供這方面的API。Instance rendering的實作倒是變得很容易,之前的AZDO設計可以直接沿用。
Shader code也只須小幅修改,但是要完全移植估計還要好一段時間。

4 / 8編輯:
現在Intel有落落長的教學文可以看了。

創作回應

=星之卡比=
有點不太理解"Vulkan則保證將command buffer送給queue時,被送出的cmd就能看見被寫入的資料(若資料儲存在cache heap則需要額外做flush),不須額外的memory barrier指令。"這句話的意思?如果在host寫入device memory的話,還是要設置flag去同步吧?

我個人目前看下來覺得現階段最大的問題還是文件:Spec真的寫得很難懂QQ
就算Spec本來就不是個解釋的東西,但他對於很多地方的規定描述,含糊不清到甚至有讓很多教學範例本身就錯了(Github issues裡面有提到),還有前後術語未統一導致語意模糊。像是當初我看Command Buffers這個章節,在前面Execution Model提到Command會照順序"played back",後面又說可能會"execute in arbitrary order",我是來回對照好幾次才知道大概這兩者不是同一個概念。

而同步那邊我認為算是本書最重要的章節,也算是描述的挺模糊的...像是Subpass Self-Dependency裡面提到要求srcStage裡面最晚的stage要早於等於dstStage裡面最早的stage,但翻到Pipeline這個章節,又說沒有規定stage間的執行順序(那張圖我沒記錯他是說參考,不需要按照這個實現)。

諸如此類的問題不斷,還有有些句子怎麼看都不太像是母語使用者能寫得出來的(像是一個句子裡面有若干個條件句),這些我都覺得會妨礙到Spec的理解。也是我目前學習Vulkan的最大障礙QQ
又,目前看下來我認為Vulkan雖然有一堆物件會被現階段的驅動無視,但我認為他算是取得各平臺的最大公因數了,像是RenderPass很顯然就針對手機設計。有的概念本身也蠻適合作為引擎的抽象化的,感覺看上去比當初的Mantle還要好些,我是這樣覺得啦。
2016-04-06 22:18:18
Lumi
在10.2.1節其中有一段確實說了Host寫入VK_MEMORY_PROPERTY_HOST_COHERENT_BIT的記憶體必須要用memory barrier,但是後面附加了一句such a barrier is performed implicitly upon each command buffer submission,也就是你呼叫vkQueueSubmit()的時候driver會自動幫你加barrier。在6.6節的最後一段則是換了個方式講同一件事情。

Spec我也是看到腦袋快爆炸,所以後來我只把前面基礎看完,然後程式寫到哪才看到哪。Spec現在還一直在修正小錯誤,幸好它放在github上讓大家都可以一起去找碴。

stage執行順序那邊我覺得有點像C++規格書和編譯器之間的關係,我們可以不用管編譯器到底怎麼實作的,只管遵守規格書就對了,若不是這樣可能很多工程師要暴動了。
2016-04-06 23:40:38

更多創作