【问题标题】:Vulkan no device memory reports host visibleVulkan 没有设备内存报告主机可见
【发布时间】:2017-05-24 01:43:03
【问题描述】:

我目前正在尝试进入 vulkan。 现在我要做的就是创建一个缓冲区清除它并将其内容读回主机。我现在的问题是我找不到主机可见的单个内存。我在运行 GT 750M/GTX 970 的笔记本电脑和台式机上测试了我的程序,结果相同。我有 2 个内存,一个 2GB/4GB 报告为本地设备,一个 17GB 不是本地设备,到目前为止还不错,但它们都没有报告主机可见。如果我无法从 970 读取数据,我会感到非常惊讶,但真正让我认为我在某个地方犯了一个大错误的是,即使是 17GB 系统内存也不是主机可见的。

我正在使用最新版本的 LunarG SDK(1.0.49) 和最新的 GeForece 驱动程序。

这是我的实例创建代码:

VkInstance instance;
{
    char *extName = VK_EXT_DEBUG_REPORT_EXTENSION_NAME;
    char *layName = "VK_LAYER_LUNARG_standard_validation";

    VkInstanceCreateInfo info;
    info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
    info.enabledExtensionCount = 1;
    info.enabledLayerCount = 1;
    info.pNext = nullptr;
    info.ppEnabledExtensionNames = &extName;
    info.ppEnabledLayerNames = &layName;
    info.flags = 0;

    VkApplicationInfo appinfo;
    appinfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
    appinfo.apiVersion = VK_MAKE_VERSION(1, 0, 0);
    appinfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0);
    appinfo.engineVersion = VK_MAKE_VERSION(1, 0, 0);
    appinfo.pApplicationName = "Vulkan Test";
    appinfo.pEngineName = "Vulkan Test";
    appinfo.pNext = nullptr;

    info.pApplicationInfo = &appinfo;

    VkResult res = vkCreateInstance(&info, nullptr, &instance);
    if (res != VK_SUCCESS) {
        std::cerr << "Failed to create instance " << res << std::endl;
        return;
    }
}

【问题讨论】:

  • 两者都应该有 host_visible 内存。首先下载软件的VHCV 并检查您在工具中获得的内存类型。其次......实例创建代码在这里并不是特别相关。这并没有什么坏处,但最重要的是展示了你是如何获得你所说的记忆道具的。第三,我假设验证层设置正确(即经过测试可以工作)并且没有任何抱怨。

标签: vulkan


【解决方案1】:

我有 2 个内存,一个 2GB/4GB 报告为本地设备,一个 17GB 不是本地设备,到目前为止还不错,但它们都没有报告主机可见。

根据您的描述,这听起来像是memory heaps (VkPhysicalDeviceMemoryProperties.memoryHeaps) 的列表,它适用于您的 GTX750/970。

但是您实际上需要检查您想要在应用程序中执行的内存分配的是内存typesVkPhysicalDeviceMemoryProperties.memoryTypes)。

这些内存类型(基于堆)包含指定如何访问该内存(在堆上)的标志。以下是可用于 GTX 970 的 memory types,包括主机可见类型。

【讨论】:

  • 首先,谢谢你,我完全看过了。其次,如果我正确理解这一点,则可能没有设备本地和主机可见的内存类型。在这种情况下,如果我想读取设备本地内存中的缓冲区,则必须将缓冲区内容复制到主机可见的缓冲区,然后对其进行映射。另外,拥有多个具有所有相同属性的类型有什么意义?
  • @user3680600 “可能没有设备本地和主机可见的内存类型”。是的。实际上对于独立 GPU 来说是很自然的,因为 RAM 和 GPU 内存是分开的。
  • @user3680600 “拥有多个具有所有相同属性的类型有什么意义” 通常不会发生。它们可能在堆上有所不同。另一个区别可能是一种类型以后不能用于特定类型的资源 (vkGetImageMemoryRequirements)。其他原因可能是 Vulkan 无法表达的一些差异。
  • PS:如果内存类型具有相同的标志,则认为列表中前面列出的标志更好。
  • 我不知道其他 Radeon 驱动程序,但 Mesa Vulkan 驱动程序为我的离散卡报告了一种主机可见和设备本地的内存类型。 Nvidia的驱动程序没有。也许他们没有实现它来防止人们直接在 GPU 的内存上执行大量的主机读/写(就像我做的那样),这很慢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 2013-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多