vulkan - 有没有办法将主机缓存的 Vulkan 缓冲区映射到特定的内存位置?
问题描述
Vulkan 能够使用VkImportMemoryHostPointerInfoEXT
. 我查询了支持的内存类型,VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT
但唯一可用的内存是连贯的,这不适用于我的用例。出于性能原因,内存需要使用显式失效/刷新。所以真的,我不希望 API 分配任何主机端内存,我只想告诉它缓冲区应该上传/下载到的基地址。否则我必须使用中间副本。将 vkMapMemory 返回的地址用于主机端工作对于我的用例来说是不可取的。
解决方案
如果 Vulkan 实现不允许您将内存分配导入为“CACHED”,那么您不能强制它这样做。API 为实现提供了宣传将您的分配导入为“CACHED”的能力的机会,但实现明确拒绝这样做。
这可能意味着它不能。而且你不能让实现做它不能做的事情。
因此,如果您有一些 API 创建和操作一些内存(不能使用其他人提供的内存),并且 Vulkan 实现将不允许从该内存中读取,除非允许删除分配的缓存性质,并且您需要该内存的 CPU 缓存,那么您将不得不依靠memcpy
.
我想在 CPU 和 GPU 之间镜像内存,这样我就可以在没有隐式 PCI-e 总线传输的情况下访问它。
如果 GPU 是离散的,那是不可能的。在离散 GPU 设置中,GPU 和 CPU 具有独立的本地内存池,并且从另一个池访问任何一个池都需要某种形式的 PCIe 传输操作。Vulkan 允许您选择哪一个访问速度较慢,但其中一个访问内存的速度较慢。
如果 GPU 是集成的,那么通常只有一个内存池和一种内存类型。该类型既是本地的又是连贯的(也可能是缓存的),这代表了两个设备的快速访问。
推荐阅读
- swift - 为什么 swift view 不使用 UIKit 更新?
- swift - 具有多个视图的 XIB 中的强 IBOutlet nil
- javascript - 如何使用 drop 做一个事件监听器,并做一个函数
- java - 无法从应用程序android中的前台服务接收活动数据
- google-app-engine - 尝试部署服务器标签时标记服务器“服务器错误”
- javascript - 是否可以在 javascript 中简化/自动加载 file.txt?
- windows - 从内核读取分页内存前的保护
- php - 重定向到具有绝对路径的页面链接的子目录路径
- angular - 如何使用必须要求的查询参数制作角度路线?
- python - AttributeError:“tensorflow.python.framework.ops.EagerTensor”对象没有属性“items”