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