【问题标题】:vulkan compute shader direct access to CPU allocated memoryvulkan计算着色器直接访问CPU分配的内存
【发布时间】:2021-09-10 19:21:45
【问题描述】:

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

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

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

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

【问题讨论】:

  • SSBO 就是:访问 RAM(通过绑定到内存的 VkBuffer)。这与 SSBO 有何不同?
  • @NicolBolas VkBuffer 有自己不同的地址。我想要 VkBuffer 或任何东西在我想要的地址中。这样我就不需要向缓冲区写入数据了。
  • "VkBuffer 有自己不同的地址。" 你说的“地址”是什么意思?在您的 C 代码中,VkBuffer 对象是一个指针,是的,但它只是指向一个表示 Vulkan 中的缓冲区的 C 对象。该对象的地址不像 GPU 可访问的设备内存中的地址。
  • "我不想花时间在缓冲区中写入和读取。" 为什么无论您尝试做什么都会比 SSBO 慢? “从缓冲区写入和读取”是如何从内存中写入和读取。缓冲区代表内存。 GPU 在使用缓冲区时没有执行任何特殊的间接操作。
  • @NicolBolas 我问有没有办法将 VkBuffer 的指针设置为我想要的位置?我希望 VkBuffer 成为我的 C 对象

标签: vulkan


【解决方案1】:

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

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。但它有它自己的方式,司机可能会说“不”,所以你又回到了原点。

【讨论】:

    【解决方案2】:

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

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

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

    您在这里要求的不是该功能的作用。 That function 将 CPU 指针指向 CPU 可访问内存CUDA 为您分配了,并且您之前已将其映射到 CPU 地址范围。您给它的指针必须在 GPU 内存的映射区域内。

    您不能只是将堆栈/全局变量推向它并期望它起作用。该变量必须在映射分配中,并且全局或堆栈变量不能在这样的分配中。

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

    【讨论】:

    • Sooo,cudaHostGetDevicePointer 几乎是vkMapMemory
    • @user369070:不。如果您有一个指向从该设备内存映射的主机可访问内存的指针,这只是一种获取指向该设备内存的指针的方法。也就是说,映射必须已经发生,此调用才能起作用。
    猜你喜欢
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    相关资源
    最近更新 更多