「OpenCLのC++ Bindingsを使ってみる - その1」ではOpenCLプラットフォームの取得を行ったが、今回はコンテキストの生成とデバイスの取得を行う。今回は「OpenCLのC++ Bindingsを使ってみる - その1」のコードを修正していくことにする。次に前回のコードと今回修正した部分を太字にしたものを示す。
#define __CL_ENABLE_EXCEPTIONS #if defined(__APPLE__) || defined(__MACOSX) #include <OpenCL/cl.hpp> #else #include <CL/cl.hpp> #endif #include <iostream> int main(int argc, char* argv[]) { std::string param; try{ std::vector platforms; cl::Platform::get(&platforms); if(platforms.size() == 0){ std::cout << "Any Platforms is NOT FOUNT." << std::endl; return 1; } cl_context_properties properties[] = {CL_CONTEXT_PLATFORM, (cl_context_properties)(platforms[0])(), 0}; cl::Context context(CL_DEVICE_TYPE_GPU, properties); std::vector devices = context.getInfo(); std::cout << "Device Name : " << devices.at(0).getInfo() << std::endl; std::string param; devices.at(0).getInfo(CL_DEVICE_VENDOR, ¶m); std::cout << "Device Vendor : " << param << std::endl; }catch(cl::Error err){ std::cerr << "ERROR: " << err.what() << "(" << err.err() << ")" << std::endl; } return 0; }
コンテキストプロパティ(properties)はCの時と変わらず、一つ目のプラットフォームを使用して作成している。このコンテキストプロパティとデバイスタイプ(CL_DEVICE_TYPE_GPU)を引数にしてcl::Contextクラスのインスタンスを生成する。デバイスタイプについては、Cの場合と共通でOpenCL 1.1 Specification [PDF]のTable 4.2に記載があるものを使用できる。
- CL_DEVICE_TYPE_CPU 見たまんまCPU
- CL_DEVICE_TYPE_GPU 見たまんまGPU
- CL_DEVICE_TYPE_ACCELERATOR PCIeで接続された専用機器とからしい
- CL_DEVICE_TYPE_DEFAULT システムのデフォルトになっているもの
- CL_DEVICE_TYPE_ALL すべてのタイプ
次に生成したコンテキストからcl::Contextクラスのメンバ関数getInfoを使用してデバイスを取得する。このときデバイスはvectorクラスに格納される。getInfoは2種類あるらしく、context.getInfo(CL_CONTEXT_DEVICES, devices)としてもいいようだ。ちなみにcl::Context::getInfoの第一引数に指定できるのは、CL_CONTEXT_DEVICES, CL_CONTEXT_PROPERTIESの2つであり、どちらもvectorクラスに格納される。
最後に、実際に取得したデバイスの情報をcl::Device::getInfoを使用してデバイス名とベンダー名を取得している。こちらもcl::Context::getInfoと同様に2種類存在する。デバイスの方で指定できる項目とそれぞれの型はC++ Bindings Specification [PDF] のTable 1に記載がある。
コンテキストとデバイスについてはここまでで、次はプログラムのビルドから。
コメント