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)プラットフォームを指定 | |
デバイス型を指定(例:CL_DEVICE_TYPE_GPU) | |
devicesに追加可能なcl_device_idエントリの数 | |
デバイスのコレクション配列 | |
device_typeとマッチする有効なOpenCLデバイスの個数 |
では関数の使用例を見てみましょう。以下は特定のプラットフォームに関連付けられた使用可能なデバイスを取得します。
err = clGetDeviceIDs(
platform, //(1)
CL_DEVICE_TYPE_GPU, //(2)
1, //(3)
device, //(4)
NULL); //(5)詳しくは「表:cl_device_type」(表B.13「表:cl_device_type」)を参照ください。
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)clGetDeviceIDsで取得したデバイス | |
取得する情報(例:CL_DEVICE_MAX_COMPUTE_UNITS) | |
param_valueが指す(バイトで表す)メモリサイズ | |
param_nameで指定した情報の値が戻すポインタオブジェクト。 | |
クエリーされるデータの実際の(バイトで表す)サイズ |
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
clGetDeviceInfoの引数param_nameで指定できる情報と、それに対応した引数param_valueに戻される情報は「cl_device_info」で指定できます。
詳しくは「表:cl_device_info」(表B.15「表:cl_device_info」)を参照ください。
Copyright 2018-2019, by Masaki Komatsu