Vulkan能够使用VkImportMemoryHostPointerInfoEXT
导入主机内存。我查询了VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT
支持的内存类型,但是唯一可用的内存类型是一致的,这不适用于我的用例。出于性能原因,内存需要使用显式的失效/刷新。所以说真的,我不想让API分配任何主机端内存,我只想告诉它缓冲区应从其上载/下载到的基址。否则,我必须使用中间副本。在我的用例中,不希望将vkMapMemory返回的地址用于主机端工作。
答案 0 :(得分:1)
如果Vulkan实现不允许您将内存分配导入为“ CACHED”,则您不能 force 这样做。该API为实现提供了机会来宣传将您的分配导入为“ CACHED”的功能,但是实现明确拒绝这样做。
这可能意味着不能。而且您不能使实现做它做不到的事情。
因此,如果您有一些API创建并操纵了一些内存(不能使用其他人提供的内存),并且Vulkan实现将不允许从该内存中读取数据,除非允许它删除分配的缓存性质,并且您需要对该内存进行CPU缓存,那么您将不得不依靠memcpy
。
我想在CPU和GPU之间镜像内存,以便我可以在不进行隐式PCI-e总线传输的情况下从任何一个进行访问。
如果GPU是离散的,则是不可能。在独立的GPU设置中,GPU和CPU具有单独的本地内存池,并且可以从其他 requires 某种形式的PCIe传输操作访问其中一个池。 Vulkan使您可以选择访问速度较慢的哪个,但是其中一个 访问内存的速度较慢。
如果集成了GPU,则通常只有一个内存池和一种内存类型。这种类型既可以是本地的,也可以是连贯的(并且也可能是缓存的),这表示可以同时从两个设备进行访问。
答案 1 :(得分:0)
无论VkImportMemoryHostPointerInfoEXT
还是非vkMapMemory
堆中的DEVICE_LOCAL_BIT
,通常都会得到COHERENT
内存类型。
因为很好,所以C语言中malloc
的常规主机堆内存自然是一致的(CPU通常具有自动的缓存一致性机制)。 C中没有cflush()
或cinvalidate()
。
当从主机端R \ W这样的内存时,没有理由进行隐式PCI-e传输。当然,专用GPU必须以某种方式读取它,因此,在设备尝试访问内存时会有总线传输。或者,您需要在DEVICE_LOCAL_BIT
堆中有一个显式的内存,并通过vkCmdCopy*
在这两个之间显式传输数据,以保持它们相同。
实际的UMA架构可能具有非COHERENT
内存类型。但是它们的内存堆总是被广告为DEVICE_LOCAL_BIT
(即使它是主内存)。