如何确保 Vulkan 使用与 CUDA 相同的 GPU?

How do I make sure Vulkan is using the same GPU as CUDA?

我正在使用一个在 HPC 集群(univa 网格引擎)上同时使用 vulkan 和 cuda(特别是 pytorch)的应用程序。

提交作业时,集群调度程序会设置一个环境变量 SGE_HGR_gpu,其中包含要使用的作业的 GPU ID(因此其他用户的其他作业 运行 不会使用相同的GPU)

告诉使用 CUDA 的应用程序使用特定 GPU 的典型方法是设置 CUDA_VISIBLE_DEVICES=n

因为我也在使用 Vulkan,所以我不知道如何确保我从 vkEnumeratePhysicalDevices.

列出的设备中选择相同的设备

认为 'n'取值的顺序和PCI BUS上设备的顺序是一样的,但是不知道是不是vkEnumeratePhysicalDevices返回的设备顺序是这个顺序,文档没有说明这个顺序是什么。

那么我怎样才能确保为 Vulkan 和 CUDA 选择相同的物理 GPU?

使用 VkPhysicalDeviceIDPropertiesKHR (Vulkan 1.1) resp VkPhysicalDeviceVulkan11Properties (Vulkan 1.2) 你可以获得设备 UUID,这是 CUDA_VISIBLE_DEVICES 似乎使用的格式之一。您还应该能够使用 nvidia-smi -L(或使用 NVML 库)将索引转换为 UUID(反之亦然)。

或者换句话说,cudaDeviceProp 包含可以与 VK_EXT_pci_bus_info 扩展输出进行比较的 PCI 信息。

如果Vulkan中的顺序匹配,最好直接问NVidia;我找不到 NV 如何订购它们的信息。来自 Vulkan Loader 实现的 IIRC,顺序应该匹配来自注册表的顺序,然后是 NV 驱动程序本身给它们的顺序。即使这样,您也必须从通用代码列表中过滤掉非 NV GPU,并且您不知道 NV Vulkan ICD 实现是否与 CUDA 匹配而不询问 NV。