2013-01-17 75 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()。你應該知道如何去做其他的事情...... –