4

Is there a solution to restrict the used number of GPUs for AMD OpenCL platforms? For NVIDIA platforms one can simply set the environment variable CUDA_VISIBLE_DEVICES to limit the set of GPUs available to OpenCL.

EDIT: I know, that I can create a context with a reduced set of devices. However, I am looking for ways to control the number of devices for the OpenCL platform from "outside".

4

3 回答 3

7

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

于 2013-12-13T18:48:24.147 回答
0

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 设备列表。devices 中返回的 cl_device_id 值可用于识别特定的 OpenCL 设备。如果设备参数为 NULL,则忽略此参数。返回的 OpenCL 设备数是 num_entries 指定的值或类型与 device_type 匹配的 OpenCL 设备数中的最小值。num_devices 返回与 device_type 匹配的可用 OpenCL 设备的数量。如果 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)

然后通过自己的设备队列对每个设备进行寻址。

于 2013-01-20T17:46:43.193 回答
-1

OpenCL 规范没有定义可移植的解决方案。

NVIDIA有你提到的解决方案。我认为 AMD 没有标准。您的 OpenCL 程序必须想出一种共享可用设备的方法。

请注意,AMD 确实有用于“设备裂变”的 OpenCL 扩展(其中一些在 OpenCL 1.2 中变得更加正式),用于在多个程序之间拆分单个设备(但这与您所要求的不同)。

于 2013-01-19T19:25:15.537 回答