現在地 >> メニュー >> OpenCL >> OpenCL編01
INDEX:OpenCL編00 <<OpenCL編01 >> OpenCL編02

とりあえずプログラムしてみる(プラットフォームの情報を取得)


まずは、OpenCLのプラットフォーム情報、
デバイス情報を取得し、出力してみる。

【1】:必要なヘッダ

「opencl.h」が必要だが、nvidia GPUでは「oclUtils.h」をインクルードしておけばよい。

#include <oclUtils.h>//OpenCL用ユーティティヘッダ
…
int main(int argc, char *argv[])
{
	… …
}

【2】:プラットフォームID

「CUDA(NVIDIA GPUに特化したもの)」や「OpenCL」、「DirectCompute」は
「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関数」等をつかう。

【3】:プラットフォームの名前とバージョンを取得する

プラットフォームの情報は「clGetPlatformInfo関数」を使う

【例】
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_PROFILEFULL_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を指定も可。

まとめ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ライブラリで出力する】

「oclUtilsライブラリ」の「oclPrintDevInfo関数」を使えば、デバイス情報をまとめて出力してくれる。

【例】
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を指定する

まとめ2

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます