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

时间:2017-05-25 11:12:04

标签: vulkan

出于这个问题的目的,我们会说vkMapMemory这样的设备上的所有分配都不会失败;它们很容易被主机看到,结果是直接指向主机内存的其他区域(不需要做任何工作)。

有没有办法检测这种情况?

目的是基于竞技场的分配器,它积极地映射任何主机可见内存,目标是避免在这些硬件上进行冗余分配。

2 个答案:

答案 0 :(得分:2)

是的,可以相对可靠地检测到它。

如果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),您就会非常了解

答案 1 :(得分:1)

  

尽管@krOoze描述的基于UMA的系统的实现没有理由不公开直接指向缓冲区数据的指针。

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

Vulkan 不是 OpenGL。一般来说,它并不试图隐藏你的东西。如果CPU无法直接访问内存堆,则Vulkan实现不会公开该主机可见的堆的内存类型。相反,如果CPU可以直接访问内存堆 ,那么Vulkan实现将公开该主机可见的堆的内存类型。

因此,如果您可以在Vulkan中映射的设备分配,那么您应该假设您有一个指向缓冲区数据的直接指针"。