「OpenCL で deviceQuery ぽいものを作ってみた」の補足

主旨

2013-04-13 - kawa0810の日記の補足です.

clGetPlatformIDs

//使用可能なプラットフォーム情報を取得する
cl_int clGetPlatformIDs(cl_uint num_entries, 
                        cl_platform_id* platforms, 
                        cl_uint* num_platforms)
- num_entris: 取得するプラットフォーム数 [in]
- platforms: 取得できたプラットフォームのリスト [out]
- num_platforms: 使用可能なプラットフォーム数 [out]

取得するプラットフォーム数 (num_entris) を使用可能な PC の数と考えると,通常 1 を渡せば問題ありません.また,使用可能なプラットフォームをすべて取得したい場合は以下の方法で取得することが可能です.

cl_uint size;

//使用可能なプラットフォーム数 (num_platforms) のみ取得
clGetPlatformIDs(0, NULL, &size);

//使用可能なプラットフォーム数分のメモリを確保する
cl_platform_id* platform = (cl_platform_id*)malloc(sizeof(cl_platform_id) * size);

//すべてのプラットフォームのリストを取得する
clGetPlatformIDs(size, platform, &size);

clGetDeviceIDs

//指定されたプラットフォーム (platform) で使用可能なデバイスリストを取得
cl_int clGetPlatformIDs(cl_platform_id platform,
                        cl_device_type device_type, 
                        cl_uint num_entris, 
                        cl_device_id* devices, 
                        cl_uint* num_devices)
- platform: プラットフォーム [in]
- device_type: デバイスの種類 [in]
- num_entris: 取得するデバイスの数 [in]
- devices: device_type で指定したデバイス ID リスト [out]
- num_devices: device_type で指定したデバイスの数 [out]

device_type には取得したいデバイスの種類を渡します.実際には以下の変数が用意されています.

  • CL_DEVICE_TYPE_CPU: ホスト CPU
  • CL_DEVICE_TYPE_GPU: GPU デバイス
  • CL_DEVICE_TYPE_ACCELERATOR: CPU と GPU 以外のデバイス
  • CL_DEVICE_TYPE_DEFAULT: デフォルトのデバイスを取得
  • CL_DEVICE_TYPE_ALL: すべてのデバイス情報を取得

また,clGetPlatformIDs 同様に使用可能なデバイスをすべて取得するには以下の方法で行います.

size_t index = 0;//取得したいプラットフォーム(今回の例では最初[0]から取得)
size_t size;

//デバイス数を取得する
clGetDeviceIDs(platform[index], CL_DEVICE_TYPE_ALL,
               0, NULL, &size);

//デバイスの数だけメモリを確保する
cl_device_id* devices = (cl_device_id*)malloc(sizeof(cl_device_id) * size);

//デバイス情報を取得する
clGetDeviceIDs(platform[index], CL_DEVICE_TYPE_ALL,
               size, devices, &size);

プラットフォームとデバイスの情報取得

以下のサイト等をご参考にして頂いたほうがいいと思います,