微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

vulkan 计算着色器直接访问 CPU 分配的内存

如何解决vulkan 计算着色器直接访问 CPU 分配的内存

vulkan 计算机着色器中是否有任何方法可以绑定 cpu 内存中的特定位置,以便我可以直接使用着色器语言访问它。

例如,如果我有一个变量声明 int a[]={contents........};,我是否可以将 a 的地址绑定为绑定位置 0,然后在 glsl 中访问类似这样的内容

layout(std430,binding = 0) {
int a[];
}

我想这样做是因为我不想花时间在缓冲区中写入和读取。

解决方法

一般情况下,您不能让 Vulkan 没有为 GPU 分配自己的 GPU 访问内存。例外情况是其他 API 进行的外部分配,这些 API 本身正在分配 GPU 可访问的内存。

仅仅获取一个随机堆栈或全局指针并将其推送到 Vulkan 是行不通的。

我想要 CUDA 中的 cudaHostGetDevicePointer 之类的东西

您在这里要求的不是该函数的作用。 That function 将 CPU 指针指向 CUDA 为您分配的内存以及您之前映射到 CPU 地址范围的 CPU 指针。你给它的指针必须在 GPU 内存的映射区域内。

您不能只是将堆栈/全局变量推到它上面并期望它起作用。变量必须位于映射分配内,全局或堆栈变量不能位于此类分配内。

Vulkan 没有办法将指向设备内存映射范围的指针反向工程返回到它被映射的 VkDeviceMemory 对象。这部分是因为 Vulkan 没有指向分配的指针;您必须使用您自己创建和管理的 VkDeviceMemory 对象。但是,如果您需要知道 CPU 可访问指针的映射位置,您可以自己跟踪。

,

我想这样做是因为我不想花时间在缓冲区中写入和读取。

Vulkan 正是为那些想要花时间管理数据流动方式的人准备的。您可能需要考虑一些快速原型框架或数学库。

vulkan 计算机着色器中是否有任何方法可以绑定 CPU 内存中的特定位置

是的,但它不会为您节省任何时间。

首先,Vulkan 确实允许通过 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT|VK_MEMORY_PROPERTY_HOST_COHERENT_BIT 分配 CPU 内存。所以你可以在那个 VkDeviceMemory 中分配你的东西,映射它,在那个地址空间做你的 CPU 东西,然后在 GPU 上使用它。

第二种方法是使用 VK_EXT_external_memory_host 扩展,它允许您将指针作为 VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT 导入 Vulkan。但它以自己的方式参与,司机可能会说“不”,所以你又回到了原点。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。