2013-01-17 40 views
3

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

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

回答

6

AMD对于Windows和Linux都有GPU_DEVICE_ORDINAL环境变量。这使您可以指定您希望从OpenCL应用程序可见的GPU的索引。例如:

[email protected]:~/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 

[email protected]:~/benchmark$ export GPU_DEVICE_ORDINAL=0 
[email protected]:~/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

感谢您的更新! – matthias

-1

没有一个由OpenCL规范定义的便携式解决方案。

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

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

+0

我知道OpenCL规范没有提供这种机制(除了限制上下文中的设备)。但我会接受你的回答,因为“没有这样的事情”。 – matthias

+1

正如jprice所描述的那样,它实际上可以通过使用系统变量来完成 –

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条目的数量。如果设备不是NULL,则num_entries必须大于 零。设备返回找到的OpenCL设备列表。设备中返回的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) 

每一个设备,然后通过自己的设备队列处理。

+0

我知道所有这些。也许我并不完全清楚,但我正在寻找一种方法来从“外部”控制设备。与NVIDIA CUDA驱动程序提供的环境变量类似。 – matthias

+0

好的,太棒了!然后创建自己的环境变量或使用CUDA,并调用GetEnv()。你应该知道如何去做其他的事情...... –