限制AMD OpenCL的GPU数量

时间:2013-01-17 14:11:10

标签: opencl

是否存在限制AMD OpenCL平台使用的GPU数量的解决方案?对于NVIDIA平台,可以简单地设置环境变量CUDA_VISIBLE_DEVICES以限制OpenCL可用的GPU集。

编辑:我知道,我可以用减少的设备集创建一个上下文。但是,我正在寻找从“外部”控制 for OpenCL平台的设备数量的方法。

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分: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指针*设备可用于创建具有特定数量设备的上下文。

这是规范所说的

  

num_entries是可以添加到的cl_device条目数   设备。如果devices不为NULL,则num_entries必须大于   零。 devices返回找到的OpenCL设备列表。 cl_device_id   设备中返回的值可用于标识特定的OpenCL   设备。如果devices参数为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)

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

答案 2 :(得分:-1)

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

NVIDIA拥有您提到的解决方案。我不认为AMD有标准;您的OpenCL程序必须提供一种共享可用设备的方法。

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