【问题标题】:How to read data from gpu memory ,not using memcpy?如何从 gpu 内存中读取数据,而不是使用 memcpy?
【发布时间】:2017-03-27 09:27:07
【问题描述】:

在 vulkan API 中,我们如何从 gpu 内存中读取数据,例如通过计算着色器计算的一些数据?

【问题讨论】:

  • 通常会使用vkCmdCopy*vkMapMemory。到目前为止,您尝试过什么?
  • 我使用vkMapMemory从设备内存中读取数据,然后,使用memcpy复制数据,但是非常非常慢
  • 啊,那就不要了。您已经收到带有vkMapMemory 的原始指针,您可以直接使用。

标签: gpu vulkan compute-shader


【解决方案1】:

首先在与计算调用相关的栅栏上等待。然后映射你写入结果的内存,如果内存不连贯,你需要使范围无效。

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

【讨论】:

  • 是的,你说的那些话是我以前用过的,但是我用memcpy从映射操作得到的指针中复制数据,非常慢。 memcpy(kernel_Data.out_data, kernelBuff.outBuf.mapped, outSize*sizeof(float));
  • @hlh077l 您可以尝试将缓冲区复制到具有更好主机访问权限的不同内存池。不是本地设备,最好是主机缓存。
【解决方案2】:

我刚刚遇到了同样的问题。我认为@ratchet 怪胎的评论 1 已经到了重点。就我而言,我试图将数据从纹理(VkImage)传输到主机内存。我使用线性缓冲区(VkBuffer)作为暂存缓冲区。我原来用过

VkMemoryPropertyFlags flag = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;

发现 memcpy() 非常慢。然后我添加了VK_MEMORY_PROPERTY_HOST_CACHED_BIT,速度变成了10倍左右。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 2018-07-18
    相关资源
    最近更新 更多