AMD OpenCLプラットフォームで使用されるGPUの数を制限するソリューションはありますか?NVIDIAプラットフォームの場合、環境変数を設定するだけCUDA_VISIBLE_DEVICES
で、OpenCLで使用できるGPUのセットを制限できます。
編集:私は、デバイスのセットを減らしてコンテキストを作成できることを知っています。ただし、OpenCLプラットフォームのデバイス数を「外部」から制御する方法を探しています。
AMD OpenCLプラットフォームで使用されるGPUの数を制限するソリューションはありますか?NVIDIAプラットフォームの場合、環境変数を設定するだけCUDA_VISIBLE_DEVICES
で、OpenCLで使用できるGPUのセットを制限できます。
編集:私は、デバイスのセットを減らしてコンテキストを作成できることを知っています。ただし、OpenCLプラットフォームのデバイス数を「外部」から制御する方法を探しています。
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
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は、デバイスに追加できるcl_deviceエントリの数です。デバイスがNULLでない場合、num_entriesはゼロより大きくなければなりません。devicesは、見つかったOpenCLデバイスのリストを返します。デバイスで返されるcl_device_id値は、特定のOpenCLデバイスを識別するために使用できます。デバイス引数が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)
次に、各デバイスは、独自のデバイスキューを介してアドレス指定されます。
OpenCL仕様で定義されたポータブルソリューションはありません。
NVIDIAはあなたが言及したソリューションを持っています。AMDには標準があるとは思いません。OpenCLプログラムは、利用可能なデバイスを共有する方法を考え出す必要があります。
AMDには、単一のデバイスを複数のプログラムに分割するために使用される「デバイス核分裂」用のOpenCL拡張機能(OpenCL 1.2でより公式になったものもあります)があることに注意してください(ただし、これはあなたが求めているものとは異なります)。