【发布时间】:2013-01-17 14:11:09
【问题描述】:
是否有限制 AMD OpenCL 平台使用的 GPU 数量的解决方案?对于 NVIDIA 平台,可以简单地设置环境变量 CUDA_VISIBLE_DEVICES 来限制 OpenCL 可用的 GPU 集。
编辑:我知道,我可以用一组减少的设备创建一个上下文。但是,我正在寻找从“外部”控制 OpenCL 平台的设备数量的方法。
【问题讨论】:
标签: opencl
是否有限制 AMD OpenCL 平台使用的 GPU 数量的解决方案?对于 NVIDIA 平台,可以简单地设置环境变量 CUDA_VISIBLE_DEVICES 来限制 OpenCL 可用的 GPU 集。
编辑:我知道,我可以用一组减少的设备创建一个上下文。但是,我正在寻找从“外部”控制 OpenCL 平台的设备数量的方法。
【问题讨论】:
标签: opencl
AMD 具有适用于 Windows 和 Linux 的 GPU_DEVICE_ORDINAL 环境变量。这允许您指定希望在 OpenCL 应用程序中可见的 GPU 的索引。例如:
jprice@nowai:~/benchmark$ python benchmark.py -clinfo
Platform 0: AMD Accelerated Parallel Processing
-> Device 0: Tahiti
-> Device 1: Tahiti
-> Device 2: Intel(R) Core(TM) i5-3550 CPU @ 3.30GHz
jprice@nowai:~/benchmark$ export GPU_DEVICE_ORDINAL=0
jprice@nowai:~/benchmark$ python benchmark.py -clinfo
Platform 0: AMD Accelerated Parallel Processing
-> Device 0: Tahiti
-> Device 1: Intel(R) Core(TM) i5-3550 CPU @ 3.30GHz
更详细的描述可以在 AMD APP OpenCL 编程指南中找到(目前在第 2.4.3 节“屏蔽可见设备”中): http://developer.amd.com/wordpress/media/2013/07/AMD_Accelerated_Parallel_Processing_OpenCL_Programming_Guide-rev-2.7.pdf
【讨论】:
OpenCL 主机 API 允许您在获取设备 ID 列表时指定设备数量
_int clGetDeviceIDs(
cl_platform_id platform,
cl_device_type device_type,
cl_uint num_entries, // Controls the minimum number of devices
cl_device_id *devices,
cl_uint *num_devices)
设备 id 指针 *devices 可用于创建具有特定数量设备的上下文。
这是规范的内容
num_entries 是可以添加到的 cl_device 条目数 设备。如果 devices 不为 NULL,则 num_entries 必须大于 零。 devices 返回找到的 OpenCL 设备列表。 cl_device_id 设备中返回的值可用于识别特定的 OpenCL 设备。如果设备参数为 NULL,则忽略此参数。这 返回的 OpenCL 设备数是该值的最小值 由 num_entries 或其类型的 OpenCL 设备数指定 匹配 device_type。 num_devices 返回 OpenCL 设备的数量 与 device_type 匹配的可用。如果 num_devices 为 NULL,则此 参数被忽略
cl_context clCreateContext(
const cl_context_properties *properties,
cl_uint num_devices, // Number of devices
const cl_device_id *devices,
(voidCL_CALLBACK *pfn_notify) (
const char *errinfo,
const void *private_info, size_t cb,
void *user_data
),
void *user_data,
cl_int *errcode_ret)
然后通过自己的设备队列对每个设备进行寻址。
【讨论】:
OpenCL 规范没有定义可移植的解决方案。
NVIDIA 有您提到的解决方案。我认为 AMD 没有标准。您的 OpenCL 程序必须想出一种共享可用设备的方法。
请注意,AMD 确实有用于“设备裂变”的 OpenCL 扩展(其中一些在 OpenCL 1.2 中变得更加正式),用于在多个程序之间拆分单个设备(但这与您所要求的不同) .
【讨论】: