是否有解决方案来限制AMD OpenCL平台使用的GPU数量?对于NVIDIA平台,可以简单地设置环境变量CUDA_VISIBLE_DEVICES
以限制OpenCL可用的一组GPU。限制AMD OpenCL GPU的数量
编辑:我知道,我可以用减少的设备集创建一个上下文。但是,我正在寻找从“外部”控制OpenCL平台的设备数量的方法。
是否有解决方案来限制AMD OpenCL平台使用的GPU数量?对于NVIDIA平台,可以简单地设置环境变量CUDA_VISIBLE_DEVICES
以限制OpenCL可用的一组GPU。限制AMD OpenCL GPU的数量
编辑:我知道,我可以用减少的设备集创建一个上下文。但是,我正在寻找从“外部”控制OpenCL平台的设备数量的方法。
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
没有一个由OpenCL规范定义的便携式解决方案。
NVIDIA有你提到的解决方案。我不认为AMD有一个标准;你的OpenCL程序将不得不想出一种分享可用设备的方法。
请注意,AMD确实有OpenCL扩展(其中一些在OpenCL 1.2中变得更加官方),用于在多个程序中分离单个设备的“设备分裂”(但这与您所要求的不同)。
我知道OpenCL规范没有提供这种机制(除了限制上下文中的设备)。但我会接受你的回答,因为“没有这样的事情”。 – matthias
正如jprice所描述的那样,它实际上可以通过使用系统变量来完成 –
的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)
每一个设备,然后通过自己的设备队列处理。
我知道所有这些。也许我并不完全清楚,但我正在寻找一种方法来从“外部”控制设备。与NVIDIA CUDA驱动程序提供的环境变量类似。 – matthias
好的,太棒了!然后创建自己的环境变量或使用CUDA,并调用GetEnv()。你应该知道如何去做其他的事情...... –
感谢您的更新! – matthias