最終更新: mikk_ni3_92 2010年05月08日(土) 14:03:08履歴
現在地 >> メニュー >> OpenCL >> OpenCL編01
INDEX:OpenCL編00 <<OpenCL編01 >> OpenCL編02
次はデバイスの情報を取得してみる。
デバイス情報関連は「clGetDeviceIDs関数」や「clGetDeviceInfo関数」を使う。
【例】
■cl_int clGetDeviceIDs(cl_platform_id platform, cl_device_type device_type, cl_uint num_entries, cl_device_id *devices, cl_uint *num_devices)
現在のプラットフォーム上で利用可能なデバイスのリストを取得する。
【platform】:プラットフォームIDを指定
【device_type】:取得したいデバイスの種類を指定
【num_entries】:デバイスエントリーの数を指定。
【devices】:見つかったデバイスのリストの格納先
【num_devices】:「device_type」にマッチしたデバイスの数の格納先。
この後、「clGetDeviceInfo関数」で色々と情報が取得できる。
詳しくはオンラインマニュアル参照。
INDEX:OpenCL編00 <<OpenCL編01 >> OpenCL編02
「opencl.h」が必要だが、nvidia GPUでは「oclUtils.h」をインクルードしておけばよい。
#include <oclUtils.h>//OpenCL用ユーティティヘッダ … int main(int argc, char *argv[]) { … … }
「CUDA(NVIDIA GPUに特化したもの)」や「OpenCL」、「DirectCompute」は
「CPUがGPUを制御して,GPUにプログラムを実行してもらう仕組み」
である。
まずは、プラットフォームIDを取得する。このプラットフォームIDがないとデバイス情報をはじめとして、
様々な情報を取得できない。
【例】:NVIDIA GPUの場合
■cl_int oclGetPlatformID(cl_platform_id* clSelectedPlatformID);
NVIDIA GPUで利用可能なプラットフォームID取得。
取得を失敗すると負の値が返ってくる。
※これは「oclUtils」の関数。OpenCLの関数の場合は「clGetPlatformIDs関数」等をつかう。
「CPUがGPUを制御して,GPUにプログラムを実行してもらう仕組み」
である。
まずは、プラットフォームIDを取得する。このプラットフォームIDがないとデバイス情報をはじめとして、
様々な情報を取得できない。
【例】:NVIDIA GPUの場合
cl_platform_id clSelectedPlatformID = NULL;//プラットフォームID cl_int ciErrNum = oclGetPlatformID (&clSelectedPlatformID);//プラットフォームIDの取得 oclCheckError(ciErrNum, CL_SUCCESS);//エラーチェック
■cl_int oclGetPlatformID(cl_platform_id* clSelectedPlatformID);
NVIDIA GPUで利用可能なプラットフォームID取得。
取得を失敗すると負の値が返ってくる。
※これは「oclUtils」の関数。OpenCLの関数の場合は「clGetPlatformIDs関数」等をつかう。
プラットフォームの情報は「clGetPlatformInfo関数」を使う
【例】
■cl_int clGetPlatformInfo(cl_platform_id platform, cl_platform_info param_name, size_t param_value_size , void *param_value ,size_t *param_value_size_ret);
【第1引数】
プラットフォームID
【第2引数】
何を取り出したいかを指定。
【第3引数】
情報(文字列)格納先のバイトサイズを伝える
【第4引数】
情報(文字列)格納先。
【第5引数】
実際に使ったバイトサイズを格納。NULLを指定も可。
【例】
char cBuffer[1024]; //プラットフォームの情報を取得 //名前 ciErrNum = clGetPlatformInfo (clSelectedPlatformID, CL_PLATFORM_NAME, sizeof(cBuffer), cBuffer, NULL); if (ciErrNum == CL_SUCCESS) { std::cout <<"Platform NAME : "<< cBuffer << "\n"; } //プラットフォームのバージョン ciErrNum = clGetPlatformInfo (clSelectedPlatformID, CL_PLATFORM_VERSION, sizeof(cBuffer), cBuffer, NULL); if (ciErrNum == CL_SUCCESS) { std::cout <<"Platform version : "<< cBuffer << "\n"; }
■cl_int clGetPlatformInfo(cl_platform_id platform, cl_platform_info param_name, size_t param_value_size , void *param_value ,size_t *param_value_size_ret);
【第1引数】
プラットフォームID
【第2引数】
何を取り出したいかを指定。
CL_PLATFORM_PROFILE | FULL_PROFILE(フルサポート) か EMBEDDED_PROFILE(一部サポート)のプロファイル名が返ってくる |
CL_PLATFORM_VERSION | プラットフォームのバージョン(例:OpenCL 1.0 CUDA 3.0.0みたいな感じ) |
CL_PLATFORM_NAME | プラットフォームの名前(例:NVIDIA CUDA等) |
CL_PLATFORM_VENDOR | ベンダ |
CL_PLATFORM_EXTENSIONS | プラットフォームによる拡張 |
【第3引数】
情報(文字列)格納先のバイトサイズを伝える
【第4引数】
情報(文字列)格納先。
【第5引数】
実際に使ったバイトサイズを格納。NULLを指定も可。
- OpenCL編01::まとめ1(プラットフォームの表示)
次はデバイスの情報を取得してみる。
デバイス情報関連は「clGetDeviceIDs関数」や「clGetDeviceInfo関数」を使う。
【例】
//OpenCLのデバイス情報 cl_uint ciDeviceCount; cl_device_id *devices = NULL; //使用可能なデバイスの数を取得 ciErrNum = clGetDeviceIDs (clSelectedPlatformID, CL_DEVICE_TYPE_ALL, 0, NULL, &ciDeviceCount); std::cout << "there is " <<ciDeviceCount << " devices for OpenCL \n"; //デバイスの詳細な情報を得るためのデータ構造のメモリ確保 devices = new cl_device_id[ciDeviceCount]; if (devices == NULL) { std::cout << "Failed to allocate memory for devices\n"; shrEXIT(argc, argv); } ciErrNum = clGetDeviceIDs (clSelectedPlatformID, CL_DEVICE_TYPE_ALL, ciDeviceCount, devices, &ciDeviceCount); if (ciErrNum == CL_SUCCESS) { for(unsigned int i = 0; i < ciDeviceCount; ++i ) { std::cout << "---------------------------------\n"; clGetDeviceInfo(devices[i], CL_DEVICE_NAME, sizeof(cBuffer), &cBuffer, NULL); std::cout << cBuffer << "\n---------------------------------\n"; oclPrintDevInfo(LOGCONSOLE, devices[i]);//デバイス情報を出力 } }else { std::cerr << "error @ clGetDeviceIDs\n"; shrEXIT(argc, argv); }
■cl_int clGetDeviceIDs(cl_platform_id platform, cl_device_type device_type, cl_uint num_entries, cl_device_id *devices, cl_uint *num_devices)
現在のプラットフォーム上で利用可能なデバイスのリストを取得する。
【platform】:プラットフォームIDを指定
【device_type】:取得したいデバイスの種類を指定
【num_entries】:デバイスエントリーの数を指定。
【devices】:見つかったデバイスのリストの格納先
【num_devices】:「device_type」にマッチしたデバイスの数の格納先。
この後、「clGetDeviceInfo関数」で色々と情報が取得できる。
詳しくはオンラインマニュアル参照。
「oclUtilsライブラリ」の「oclPrintDevInfo関数」を使えば、デバイス情報をまとめて出力してくれる。
【例】
■void oclPrintDevInfo(int iLogMode, cl_device_id device);
oclUtilsの関数。デバイス情報を出力する。
【iLogMode】:LOGBOTH, LOGCONSOLE, LOGFILEが指定可能。
【device】:cl_device_idを指定する
【例】
cl_platform_id clSelectedPlatformID = NULL;//プラットフォームID … … cl_uint ciDeviceCount; //デバイス数 cl_device_id *devices = NULL; … … devices = new cl_device_id[ciDeviceCount]; //デバイス情報を取得 clGetDeviceIDs (clSelectedPlatformID, CL_DEVICE_TYPE_ALL, ciDeviceCount, devices, &ciDeviceCount); oclPrintDevInfo(LOGCONSOLE, devices[0]);//デバイス情報を出力
■void oclPrintDevInfo(int iLogMode, cl_device_id device);
oclUtilsの関数。デバイス情報を出力する。
【iLogMode】:LOGBOTH, LOGCONSOLE, LOGFILEが指定可能。
【device】:cl_device_idを指定する
- OpenCL編01::まとめ2(プラットフォームとデバイスの表示)