對於這個問題的目的,我們會說vkMapMemory
這樣的設備上的所有分配不能失敗;它們是普通的主機可見的,其結果是直接指向其他某些主機內存區域(不需要完成任何工作)。共享主機內存的設備上的Vulkan
有什麼方法可以檢測到這種情況嗎?
記住的目的是基於競技場的分配器,主動映射任何主機可見內存,目標是避免在這樣的硬件上進行冗餘分配。
對於這個問題的目的,我們會說vkMapMemory
這樣的設備上的所有分配不能失敗;它們是普通的主機可見的,其結果是直接指向其他某些主機內存區域(不需要完成任何工作)。共享主機內存的設備上的Vulkan
有什麼方法可以檢測到這種情況嗎?
記住的目的是基於競技場的分配器,主動映射任何主機可見內存,目標是避免在這樣的硬件上進行冗餘分配。
是的,它可以被比較可靠地檢測出來。
如果vkGetPhysicalDeviceMemoryProperties
只有一個內存堆(它將被標記爲VK_MEMORY_HEAP_DEVICE_LOCAL_BIT
),那麼它確定它是與主機相同的內存。
在作者的話:
https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#memory-device
在統一存儲器體系結構(UMA)系統中,通常僅被認爲是相等的「本地」到主機和單個存儲器堆到設備,並且這樣的實現必須將堆通告爲設備本地。
在你平凡知道如果內存是主機上的其他情況下(即在dGPU給定的內存堆將不已經VK_MEMORY_HEAP_DEVICE_LOCAL_BIT
集)
雖然,基於UMA的系統實施方案所描述by @krOoze幾乎沒有理由不把直接指針暴露給緩衝區數據。
你的問題似乎是從一個錯誤的假設出發。
Vulkan是不是 OpenGL。一般來說,它不會試圖隱藏你的東西。如果一個內存堆不能被CPU直接訪問,那麼Vulkan實現將不會公開該主機可見的堆的內存類型。相反,如果一個內存堆棧可以通過CPU直接訪問,那麼Vulkan實現將爲該主機可見的堆提供內存類型。
因此,如果您可以在Vulkan中映射設備分配的所有,那麼您應該假設您有一個「直接指向緩衝區數據」。
「*無需做任何工作*」您能否解釋一下其他類型的設備需要做什麼「工作」?目前尚不清楚這種情況能夠避免。 –
這有些迂腐,但由於CPU虛擬地址空間碎片化等原因,vkMapMemory仍可能因主機分配而失敗。 –
我想到的「設備」可能更好地描述爲軟件光柵化器。但是,由@krOoze描述的基於UMA的系統的實現沒有什麼理由不公開直接指向緩衝區數據的指針。 – defube