限制AMD OpenCL所使用的GPU数量

4
有没有办法限制AMD OpenCL平台使用的GPU数量?对于NVIDIA平台,可以简单地设置环境变量 CUDA_VISIBLE_DEVICES 来限制可用于OpenCL的GPU集合。
编辑:我知道我可以创建一个具有减少设备数量的上下文。然而,我正在寻找从“外部”控制设备数量的方法,适用于OpenCL平台。
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

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

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


我了解这些。也许我的表述不够清晰,但我正在寻找一种从“外部”控制设备的方法。类似于NVIDIA CUDA驱动程序提供的环境变量。 - matthias
好的,太棒了!那么请发明您自己的环境变量或使用CUDA中的变量,然后调用GetEnv()。您应该知道如何完成其余部分.... - Tim Child

-1

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

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

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


我知道OpenCL规范没有提供这样的机制(除了限制上下文中的设备)。但是我会接受你的答案为“没有这样的东西”。 - matthias
1
正如jprice所描述的那样,可以使用系统变量来实现。 - Vincent.StreamComputing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接