是否有解決方案來限制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