GPUプログラミング環境としてはnVidiaのCUDAや、ATIのATI Streamなどがあるが、ハードウェアに依存してしまうので、ちょっと手を出したくない。それに対して、OpenCLは可搬性があるGPUプログラミン環境も含んだライブラリというとこで、ちょっと試してみることにした。
OpenCLのアーキテクチャを調べてみると、GPGPUライブラリだと思っていのは間違えで、デバイスとしてCPUも想定しているらしい。そのあたりの詳しい解説は、入門書もいくつかあるのでそちらを参照してほしい。
要は、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 :
こんな感じの結果になる。