如何从gpu内存中读取数据,而不是使用memcpy?

如何从gpu内存中读取数据,而不是使用memcpy?,gpu,vulkan,compute-shader,Gpu,Vulkan,Compute Shader,在vulkan API中,我们如何从gpu内存读取数据,比如一些由compute shader计算的数据?首先等待与compute调用相关的消息。然后将结果写入内存,如果内存不一致,则需要使范围无效 从映射操作得到的指针中读取数据。首先等待与计算调用相关的消息。然后将结果写入内存,如果内存不一致,则需要使范围无效 从映射操作得到的指针中读取数据。我刚刚讨论了同样的问题。我认为@ratchet freak的评论1已经说到点子上了。在我的例子中,我试图将数据从纹理(VkImage)传输到主机内存。我

在vulkan API中,我们如何从gpu内存读取数据,比如一些由compute shader计算的数据?

首先等待与compute调用相关的消息。然后将结果写入内存,如果内存不一致,则需要使范围无效


从映射操作得到的指针中读取数据。

首先等待与计算调用相关的消息。然后将结果写入内存,如果内存不一致,则需要使范围无效


从映射操作得到的指针中读取数据。

我刚刚讨论了同样的问题。我认为@ratchet freak的评论1已经说到点子上了。在我的例子中,我试图将数据从纹理(VkImage)传输到主机内存。我使用了一个线性缓冲区(VkBuffer)作为暂存缓冲区。我最初使用

VkMemoryPropertyFlags flag = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;

发现memcpy()非常慢。然后我添加了VK_MEMORY_PROPERTY_HOST_CACHED_位,速度约为10倍。

我刚刚遇到了同样的问题。我认为@ratchet freak的评论1已经说到点子上了。在我的例子中,我试图将数据从纹理(VkImage)传输到主机内存。我使用了一个线性缓冲区(VkBuffer)作为暂存缓冲区。我最初使用

VkMemoryPropertyFlags flag = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;

发现memcpy()非常慢。然后我添加了VK_MEMORY_PROPERTY_HOST_CACHED_位,速度大约为10倍。

通常使用
vkcmdcy*
vkmamemory
。到目前为止,您尝试了什么?我使用
vkmamemory
从devicememory读取数据,然后使用
memcpy
复制数据,但它非常缓慢,然后根本不复制数据。您已经收到了带有
vkmamemory
的原始指针,可以直接使用。通常会使用
vkCmdCopy*
vkmamemory
。到目前为止,您尝试了什么?我使用
vkmamemory
从devicememory读取数据,然后使用
memcpy
复制数据,但它非常缓慢,然后根本不复制数据。您已经收到了带有
vkMapMemory
的原始指针,您可以直接使用。是的,您说的那些词我以前用过,但我使用
memcpy
从映射操作中获得的指针中复制数据,速度非常慢<代码>memcpy(kernel_Data.out_Data,kernelBuff.exputf.mapped,超大*sizeof(float))@hlh077l您可以尝试使用更好的主机访问权限将缓冲区复制到其他内存池。不是本地设备,最好是主机缓存。是的,你说的那些词我以前用过,但我使用
memcpy
从映射操作中得到的指针中复制数据,速度非常慢<代码>memcpy(kernel_Data.out_Data,kernelBuff.exputf.mapped,超大*sizeof(float))@hlh077l您可以尝试使用更好的主机访问权限将缓冲区复制到其他内存池。不是本地设备,最好是主机缓存。