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

vulkan compute shader direct access to CPU allocated memory

vulkan computer shader有没有办法绑定CPU内存中的特定位置,以便我可以直接用shader语言访问它。

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

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

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

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

只是采用随机堆栈或全局指针并将其推送到 Vulkan 是行不通的。

I want something like cudaHostGetDevicePointer in CUDA

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

您不能只向它推一个 stack/global 变量并期望它起作用。该变量必须在映射分配内,而全局或堆栈变量不能在此类分配内。

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

I want do this because to I don't want spend time on writing and reading from buffer.

Vulkan 非常适合那些确实想花时间管理数据流动方式的人。您可能需要考虑一些快速原型制作框架或数学库。

Is there any way in vulkan computer shader to bind specific location in CPU memory

是的,但它救不了你任何时间。

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

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