首页 > 解决方案 > 有没有办法将主机缓存的 Vulkan 缓冲区映射到特定的内存位置?

问题描述

Vulkan 能够使用VkImportMemoryHostPointerInfoEXT. 我查询了支持的内存类型,VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT但唯一可用的内存是连贯的,这不适用于我的用例。出于性能原因,内存需要使用显式失效/刷新。所以真的,我不希望 API 分配任何主机端内存,我只想告诉它缓冲区应该上传/下载到的基地址。否则我必须使用中间副本。将 vkMapMemory 返回的地址用于主机端工作对于我的用例来说是不可取的。

标签: vulkanmemory-mapping

解决方案


如果 Vulkan 实现不允许您将内存分配导入为“CACHED”,那么您不能强制它这样做。API 为实现提供了宣传将您的分配导入为“CACHED”的能力的机会,但实现明确拒绝这样做。

这可能意味着它不能。而且你不能让实现做它不能做的事情。

因此,如果您有一些 API 创建和操作一些内存(不能使用其他人提供的内存),并且 Vulkan 实现将不允许从该内存中读取,除非允许删除分配的缓存性质,并且您需要该内存的 CPU 缓存,那么您将不得不依靠memcpy.


我想在 CPU 和 GPU 之间镜像内存,这样我就可以在没有隐式 PCI-e 总线传输的情况下访问它。

如果 GPU 是离散的,那是不可能的。在离散 GPU 设置中,GPU 和 CPU 具有独立的本地内存池,并且从另一个池访问任何一个池都需要某种形式的 PCIe 传输操作。Vulkan 允许您选择哪一个访问速度较慢,但​​其中一个访问内存的速度较慢

如果 GPU 是集成的,那么通常只有一个内存池和一种内存类型。该类型既是本地的又是连贯的(也可能是缓存的),这代表了两个设备的快速访问。


推荐阅读