GPUプログラミング環境としてはnVidiaのCUDAや、ATIのATI Streamなどがあるが、ハードウェアに依存してしまうので、ちょっと手を出したくない。それに対して、OpenCLは可搬性があるGPUプログラミン環境も含んだライブラリというとこで、ちょっと試してみることにした。
OpenCLのアーキテクチャを調べてみると、GPGPUライブラリだと思っていのは間違えで、デバイスとしてCPUも想定しているらしい。そのあたりの詳しい解説は、入門書もいくつかあるのでそちらを参照してほしい。
- OpenCL入門 - マルチコアCPU・GPUのための並列プログラミング
- OpenCL入門―GPU&マルチコアCPU並列プログラミング for MacOS Windows Linux
- OpenCL並列プログラミング―マルチコアCPU/GPUのための標準フレームワーク
要は、CPUやGPUがOpenCLデバイスとして抽象化されていて、OpenCLホストというやつがタスクをキューに入れ、OpenCLデバイスがキューから取り出して処理するということらしい。
とりあえず、OpenCLのビルドができるかを確認するために、OpenCLのプラットフォーム情報を取り出してみる。ソースは次のような感じ。
#include #include #include using namespace std; void printPlatformInfo(const cl_platform_id pid); int main(int argc, char* argv[]) { cl_platform_id pform[10]; cl_uint nPform; clGetPlatformIDs(sizeof(pform) / sizeof(*pform), pform, &nPform); cout << "Number of Platform(s) : " << nPform << endl; for(int i = 0; i < (int)nPform; i++){ printPlatformInfo(pform[i]); } return EXIT_SUCCESS; } void printPlatformInfo(const cl_platform_id pid) { char buf[BUFSIZ]; clGetPlatformInfo(pid, CL_PLATFORM_PROFILE, sizeof(buf) -1, buf, NULL); cout << "Platform Profile : " << buf << endl; clGetPlatformInfo(pid, CL_PLATFORM_VERSION, sizeof(buf) -1, buf, NULL); cout << "Platform Version : " << buf << endl; clGetPlatformInfo(pid, CL_PLATFORM_NAME, sizeof(buf) -1, buf, NULL); cout << "Platform Name : " << buf << endl; clGetPlatformInfo(pid, CL_PLATFORM_VENDOR, sizeof(buf) -1, buf, NULL); cout << "Platform Vendor : " << buf << endl; clGetPlatformInfo(pid, CL_PLATFORM_EXTENSIONS, sizeof(buf) -1, buf, NULL); cout << "Platform Extensions : " << endl; }
clGetPlatformIDsという関数で、プラットフォームIDを取得し、そのIDを使ってclGetPlatformInfoでプラットフォームの情報を取得するという流れになる。
それぞれの関数のドキュメントは
にある。
Mac OS Xの場合ではヘッダーファイルが"OpenCL/opencl.h"となっているが他の環境では違うらしいので注意が必要。コマンドラインでのビルドは次のようにする
$ g++ -o testCL testCL.cpp -framework OpenCL
"-framework OpenCL"オプションをつければいいらしい。Xcodeの場合はなんかフレームワークを選べばいいっぽいがやったことはないからよくわからない。
上記のコードを手持ちのMac Bookで実行すると
Number of Platform(s) : 1 Platform Profile : FULL_PROFILE Platform Version : OpenCL 1.0 (Aug 22 2010 18:08:16) Platform Name : Apple Platform Vendor : Apple Platform Extensions :
こんな感じの結果になる。
コメント