8.2. Deviceのクエリー

8.2.1. clGetDeviceIDs

clGetDeviceIDs関数はプラットフォームで使用可能なデバイスを取得します。

注記

詳しくは「表:clGetDeviceIDs」(表B.12「表:clGetDeviceIDs」)と「表:cl_device_type」(表B.13「表:cl_device_type」)を参照ください。

int org.jocl.CL.clGetDeviceIDs(
    cl_platform_id platform, //(1)
    long device_type, //(2)
    int num_entries, //(3)
    cl_device_id[] devices, //(4)
    int[] num_devices) //(5)

(1)

プラットフォームを指定

(2)

デバイス型を指定(例:CL_DEVICE_TYPE_GPU)

(3)

devicesに追加可能なcl_device_idエントリの数

(4)

デバイスのコレクション配列

(5)

device_typeとマッチする有効なOpenCLデバイスの個数

では関数の使用例を見てみましょう。以下は特定のプラットフォームに関連付けられた使用可能なデバイスを取得します。

err = clGetDeviceIDs(
    platform, //(1)
    CL_DEVICE_TYPE_GPU, //(2)
    1, //(3)
    device, //(4)
    NULL); //(5)

(1)

プラットフォームを指定

(2)

GPUデバイスを指定

(3)

エントリ数は1を指定

(4)

取得した値を戻す変数。cl_device_idのポインタを指定する。

(5)

NULL値を設定すると無視。

8.2.2. cl_device_type

注記

詳しくは「表:cl_device_type」(表B.13「表:cl_device_type」)を参照ください。

8.2.3. clGetDeviceInfo

clGetDeviceInfo関数はOpenCLデバイスについての情報を取得します。deviceに指定するデバイスはclGetDeviceIDsが戻すデバイス、またはclCreateSubDevicesで生成したサブデバイスです。device引数にサブデバイスを指定した場合は、サブデバイスに関する情報が戻ります。

注記

詳しくは「表:clGetDeviceInfo」(表B.14「表:clGetDeviceInfo」)と「表:cl_device_info」(表B.15「表:cl_device_info」)を参照ください。

int org.jocl.CL.clGetDeviceInfo(
    cl_device_id device, //(1)
    int param_name, //(2)
    long param_value_size, //(3)
    Pointer param_value, //(4)
    long[] param_value_size_ret) //(5)

(1)

clGetDeviceIDsで取得したデバイス

(2)

取得する情報(例:CL_DEVICE_MAX_COMPUTE_UNITS)

(3)

param_valueが指す(バイトで表す)メモリサイズ

(4)

param_nameで指定した情報の値が戻すポインタオブジェクト。

(5)

クエリーされるデータの実際の(バイトで表す)サイズ

実装例

clGetDeviceInfoを使ってデバイスが単精度浮動小数点演算をサポートするかクエリーをした例が以下のコードとなります。

package com.book.jocl.device;

import static org.jocl.CL.*;

import org.jocl.Pointer;
import org.jocl.cl_device_id;
import org.jocl.cl_platform_id;

public class DeviceTest {

        public static void main(String[] args) {
                String str_result = null;

                int platformArray[] = new int[1];
                clGetPlatformIDs(0, null, platformArray);
                int platformNum = platformArray[0];
                cl_platform_id platforms[] = new cl_platform_id[platformNum];
                clGetPlatformIDs(1, platforms, platformArray);

                int deviceArray[] = new int[1];
                clGetDeviceIDs(platforms[0], CL_DEVICE_TYPE_ALL, 0, null, deviceArray);
                cl_device_id devices[] = new cl_device_id[deviceArray[0]];
                clGetDeviceIDs(platforms[0], CL_DEVICE_TYPE_ALL, deviceArray[0], devices, null);

                long size[] = new long[1];

                for(int i = 0; i < deviceArray[0]; i++) {
                        clGetDeviceInfo(devices[i], CL_DEVICE_NAME, 0, null, size);
                        byte device_type[] = new byte[64];
                        clGetDeviceInfo(devices[i], CL_DEVICE_NAME, size[0], Pointer.to(device_type), null);
                        str_result = new String(device_type);
                        System.out.println("CL_DEVICE_NAME: "+str_result);

                        clGetDeviceInfo(devices[i], CL_DEVICE_GLOBAL_MEM_CACHE_SIZE, 0, null, size);
                        long global_mem_cache_size[] = new long[1];
                        clGetDeviceInfo(devices[i], CL_DEVICE_GLOBAL_MEM_CACHE_SIZE, size[0], Pointer.to(global_mem_cache_size), null);
                        System.out.println("CL_DEVICE_GLOBAL_MEM_CACHE_SIZE: "+global_mem_cache_size[0]);

                        clGetDeviceInfo(devices[i], CL_DEVICE_GLOBAL_MEM_SIZE, 0, null, size);
                        long global_mem_size[] = new long[1];
                        clGetDeviceInfo(devices[i], CL_DEVICE_GLOBAL_MEM_SIZE, size[0], Pointer.to(global_mem_size), null);
                        System.out.println("CL_DEVICE_GLOBAL_MEM_SIZE: "+global_mem_size[0]);

                        clGetDeviceInfo(devices[i], CL_DEVICE_LOCAL_MEM_SIZE, 0, null, size);
                        long local_mem_size[] = new long[1];
                        clGetDeviceInfo(devices[i], CL_DEVICE_LOCAL_MEM_SIZE, size[0], Pointer.to(local_mem_size),null);
                        System.out.println("CL_DEVICE_LOCAAL_MEM_SIZE: "+local_mem_size[0]);

                        clReleaseDevice(devices[i]);
                }
        }

}

以下が実行可能ファイルの出力となります。

CL_DEVICE_NAME: Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz
CL_DEVICE_GLOBAL_MEM_CACHE_SIZE: 64
CL_DEVICE_GLOBAL_MEM_SIZE: 4294967296
CL_DEVICE_LOCAAL_MEM_SIZE: 32768
CL_DEVICE_NAME: HD Graphics 4000
CL_DEVICE_GLOBAL_MEM_CACHE_SIZE: 0
CL_DEVICE_GLOBAL_MEM_SIZE: 1610612736
CL_DEVICE_LOCAAL_MEM_SIZE: 65536

8.2.4. cl_device_info

clGetDeviceInfoの引数param_nameで指定できる情報と、それに対応した引数param_valueに戻される情報は「cl_device_info」で指定できます。

注記

詳しくは「表:cl_device_info」(表B.15「表:cl_device_info」)を参照ください。

Copyright 2018-2019, by Masaki Komatsu