gpt4 book ai didi

OpenCL 设备的独特性

转载 作者:行者123 更新时间:2023-12-01 23:55:38 29 4
gpt4 key购买 nike

有没有办法让 OpenCL 为我提供所有具有可用 OpenCL 实现的唯一物理设备的列表?我知道如何迭代平台/设备列表,但例如,就我而言,我有一个 Intel 提供的平台,它为我的 CPU 提供了高效的设备实现,而 APP 平台为我的 GPU 提供了快速实现,但对于我的 CPU 来说这是一个糟糕的实现。

有没有一种方法可以确定两个 CPU 设备实际上是同一个物理设备,以便我可以选择最高效的一个并使用它,而不是同时使用两个 CPU 设备并让它们相互竞争计算在单个物理设备上的时间?

我已查看 CL_DEVICE_VENDOR_IDCL_DEVICE_NAME,但它们无法解决我的问题,CL_DEVICE_NAME 对于两个单独的物理设备来说是相同的相同型号的设备(双 GPU)和 CL_DEVICE_VENDOR_ID 根据平台为我的 CPU 提供不同的 ID。

理想的解决方案是某种唯一的物理设备 ID,但我很乐意手动更改 OpenCL 配置以自己重新排列设备(如果可能的话)。

最佳答案

据我目前调查的情况,没有可靠的解决方案。如果您的所有工作都在单个进程中完成,您可以使用 clGetDeviceIDs 或 cl_device 值本身返回的条目顺序(本质上它们是指针),但事情变得如果您尝试在进程之间共享这些标识符,情况会更糟。

参见that guy's blog post对此,说道:

The issue is that if you have two identical GPUs, you can’t distinguish between them. If you call clGetDeviceIDs, the order in which they are returned is actually unspecified, so if the first process picks the first device and the second takes the second device, they both may wind up oversubscribing the same GPU and leaving the other one idle.

但是,他指出 nVidia 和 AMD 提供了他们的自定义扩展:cl_amd_device_topologycl_nv_device_attribute_query。您可以检查您的设备是否支持这些扩展,然后按如下方式使用(原作者代码):

// This cl_ext is provided as part of the AMD APP SDK
#include <CL/cl_ext.h>

cl_device_topology_amd topology;
status = clGetDeviceInfo (devices[i], CL_DEVICE_TOPOLOGY_AMD,
sizeof(cl_device_topology_amd), &topology, NULL);

if(status != CL_SUCCESS) {
// Handle error
}

if (topology.raw.type == CL_DEVICE_TOPOLOGY_TYPE_PCIE_AMD) {
std::cout << "INFO: Topology: " << "PCI[ B#" << (int)topology.pcie.bus
<< ", D#" << (int)topology.pcie.device << ", F#"
<< (int)topology.pcie.function << " ]" << std::endl;
}

或(我编写的代码,改编自上面链接的帖子):

#define CL_DEVICE_PCI_BUS_ID_NV  0x4008
#define CL_DEVICE_PCI_SLOT_ID_NV 0x4009

cl_int bus_id;
cl_int slot_id;

status = clGetDeviceInfo (devices[i], CL_DEVICE_PCI_BUS_ID_NV,
sizeof(cl_int), &bus_id, NULL);
if (status != CL_SUCCESS) {
// Handle error.
}

status = clGetDeviceInfo (devices[i], CL_DEVICE_PCI_BUS_ID_NV,
sizeof(cl_int), &slot_id, NULL);
if (status != CL_SUCCESS) {
// Handle error.
}

std::cout << "Topology = [" << bus_id <<
":"<< slot_id << "]" << std::endl;

关于OpenCL 设备的独特性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10852696/

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