vkEnumeratePhysicalDevices() 没有找到所有的 GPU
vkEnumeratePhysicalDevices() not finding all GPUs
我的系统具有以下规格:
GPU:
- AMD Radeon(TM) 显卡
- 采用 Max-Q 设计的 NVIDIA GeForce RTX 2060
CPU:
- AMD 锐龙 9 4900HS 配备 Radeon 显卡
当我 运行 vkEnumeratePhysicalDevices() 它只有 returns 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 最适合他们的程序——老实说,在我看来这没什么大不了的。
我的系统具有以下规格:
GPU:
- AMD Radeon(TM) 显卡
- 采用 Max-Q 设计的 NVIDIA GeForce RTX 2060
CPU:
- AMD 锐龙 9 4900HS 配备 Radeon 显卡
当我 运行 vkEnumeratePhysicalDevices() 它只有 returns 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 最适合他们的程序——老实说,在我看来这没什么大不了的。