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 可能会说“不”,所以你回到原点。
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 可能会说“不”,所以你回到原点。