共享主机内存的设备上的 Vulkan

Vulkan on devices that share host memory

为了这个问题的目的,我们会说 vkMapMemory 在这种设备上的所有分配都不会失败;它们通常是主机可见的,结果是指向主机内存其他区域的直接指针(不需要做任何工作)。

有什么方法可以检测到这种情况吗?

我们的目的是基于竞技场的分配器积极映射任何主机可见内存,objective 是为了避免在此类硬件上进行冗余分配。

是的,可以比较可靠地检测到。

如果vkGetPhysicalDeviceMemoryProperties只有一个内存堆(标记为VK_MEMORY_HEAP_DEVICE_LOCAL_BIT)那么可以肯定它是与主机相同的内存。

作者的话:
https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#memory-device

In a unified memory architecture (UMA) system, there is often only a single memory heap which is considered to be equally “local” to the host and to the device, and such an implementation must advertise the heap as device-local.

在其他情况下,您很容易知道内存是否在主机上(即 dGPU 上的给定内存堆 没有 VK_MEMORY_HEAP_DEVICE_LOCAL_BIT 设置)

Though, implementations for UMA-based systems described by @krOoze have little reason to not expose direct pointers to buffer data.

你的问题似乎是从一个错误的假设出发的。

Vulkan 不是 OpenGL。一般来说,它不会试图向您隐瞒事情。如果 CPU 无法直接访问内存堆,那么 Vulkan 实现将不会为该堆公开主机可见的内存类型。相反,如果内存堆 可以 直接由 CPU 访问,那么 Vulkan 实现将为该堆公开主机可见的内存类型。

因此,如果您可以在 Vulkan 中映射设备分配 ,那么您应该假设您有一个 "direct pointer to buffer data"。