gpt4 book ai didi

c++ - vkEnumeratePhysicalDevices() 未找到所有 GPU

转载 作者:行者123 更新时间:2023-12-04 12:55:31 25 4
gpt4 key购买 nike

我的系统具有以下规范:
GPU:

  • AMD Radeon(TM) 显卡
  • 采用 Max-Q 设计的 NVIDIA GeForce RTX 2060

  • 中央处理器:
  • 带 Radeon 显卡的 AMD 锐龙 9 4900HS

  • 当我运行 vkEnumeratePhysicalDevices() 时,它只返回 1 个设备,我的集成显卡(AMD Radeon(TM) 显卡)。但是我发现如果我使用 Windows 设置中的图形设置(设置 > 系统 > 显示 > 图形设置,然后浏览以找到 Vulkan 项目的构建 .exe 并将选项设置为高性能)。但是,我现在运行Vulkan项目时,系统上仍然只显示1个gpu,只是切换到只显示RTX 2060。
    这显然不是一个没有代码经验的游戏玩家会做的事情(如果我曾经用 Vulkan 完成游戏的话)。我推断这可能是因为我在笔记本电脑上,所以我尝试禁用所有省电设置但没有任何改变。
    所以我想知道是否有办法在 Vulkan 之外找到系统上的所有 GPU 并将物理设备设置在该列表之外,因为 Vulkan 似乎无法一次找到所有 GPU?
    编辑:
    我发现如果我在设备管理器中关闭集成 GPU,然后重新打开它,我可以让它看到专用 GPU。
    我也收到错误: validation layer: setupLoaderTrampPhysDevs: Failed during dispatch call of 'vkEnumeratePhysicalDevices' to lower layers or loader to get count. 编辑 2:
    我像这样调用 vkEnumeratePhysicalDevices():
        void pickPhysicalDevice() {
    uint32_t deviceCount = 0;
    vkEnumeratePhysicalDevices(instance, &deviceCount, nullptr);
    std::vector<VkPhysicalDevice> devices1(deviceCount);

    vkEnumeratePhysicalDevices(instance, &deviceCount, devices1.data());
    if (deviceCount == 0) {
    throw std::runtime_error("Failed to find GPUs with Vulkan support.");
    }

    std::vector<VkPhysicalDevice> devices(deviceCount);
    vkEnumeratePhysicalDevices(instance, &deviceCount, devices.data());

    std::cout << "Physical Devices(" << deviceCount << "):\n";

    for (const auto& device : devices) {
    //get the device properties
    VkPhysicalDeviceProperties props;
    vkGetPhysicalDeviceProperties(device, &props);
    //print the device and whether it is suitable or not
    std::cout << props.deviceName << " -- " << (isDeviceSuitable(device) && props.deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU ? "suitable GPU" : "unsuitable GPU") << std::endl;

    if (isDeviceSuitable(device) && props.deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU) {
    std::cout << "Device ^ accepted" << std::endl;
    physicalDevice = device;
    break;
    }
    }

    if (physicalDevice == VK_NULL_HANDLE) {
    throw std::runtime_error("Failed to find a suitable GPU.");
    }


    }
    我的基本 Vulkan 代码是根据以下网站建模的: https://vulkan-tutorial.com/Drawing_a_triangle/Setup/Physical_devices_and_queue_families

    最佳答案

    在大量阅读了互联网上基本上每个由函数名称 vkEnumeratePhysicalDevices() 组成的论坛之后,经过一周的悬赏,这个问题仍然没有得到解答,我找到了答案。它位于 AMD 和 Nvidia 驱动程序之间的互操作中,至少对于我的笔记本电脑(ROG Zephyrus G14)而言。隐藏答案的论坛在这里:https://github.com/KhronosGroup/Vulkan-Loader/issues/552
    根据我从他们在 GitHub 上所说的话了解到的情况,正如@pdaniel-nv 所描述的那样,验证层 VK_LAYER_AMD_swichable_graphics 和 VK_LAYER_NV_optimus 都想选择高性能 GPU,但他们只想过滤 AMD 或 Nvidia GPU分别。 (VK_LAYER_AMD_swichable_graphics 想要使用 AMD 专用 GPU,而 VK_LAYER_NV_optimus 想要使用 Nvidia 专用 GPU)因此,当使用这些层时,来自 AMD 和 Nvidia 的驱动程序都会过滤掉彼此的 GPU,因此可用 GPU 列表最终什么也没有。
    所以基本上解决方案是通过 Vulkan Configurator 禁用其中一层或两层,或者在您的代码中更好。 唯一的缺点是开发人员现在必须编写自定义代码来确定哪个 GPU 最适合他们的程序——老实说,在我看来这没什么大不了的。

    关于c++ - vkEnumeratePhysicalDevices() 未找到所有 GPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68109171/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com