2017-05-25 37 views
0

對於這個問題的目的,我們會說vkMapMemory這樣的設備上的所有分配不能失敗;它們是普通的主機可見的,其結果是直接指向其他某些主機內存區域(不需要完成任何工作)。共享主機內存的設備上的Vulkan

有什麼方法可以檢測到這種情況嗎?

記住的目的是基於競技場的分配器,主動映射任何主機可見內存,目標是避免在這樣的硬件上進行冗餘分配。

+0

「*無需做任何工作*」您能否解釋一下其他類型的設備需要做什麼「工作」?目前尚不清楚這種情況能夠避免。 –

+0

這有些迂腐,但由於CPU虛擬地址空間碎片化等原因,vkMapMemory仍可能因主機分配而失敗。 –

+0

我想到的「設備」可能更好地描述爲軟件光柵化器。但是,由@krOoze描述的基於UMA的系統的實現沒有什麼理由不公開直接指向緩衝區數據的指針。 – defube

回答

1

是的,它可以被比較可靠地檢測出來。

如果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集)

0

雖然,基於UMA的系統實施方案所描述by @krOoze幾乎沒有理由不把直接指針暴露給緩衝區數據。

你的問題似乎是從一個錯誤的假設出發。

Vulkan是不是 OpenGL。一般來說,它不會試圖隱藏你的東西。如果一個內存堆不能被CPU直接訪問,那麼Vulkan實現將不會公開該主機可見的堆的內存類型。相反,如果一個內存堆棧可以通過CPU直接訪問,那麼Vulkan實現將爲該主機可見的堆提供內存類型。

因此,如果您可以在Vulkan中映射設備分配的所有,那麼您應該假設您有一個「直接指向緩衝區數據」。