手元の nVidia (k600) で OpenCL を試してみる。
まずは VS2013 もインストール。適当に Windows update しておく。CUDA のインストーラが VS を自動認識するので先に必要。
次に NVIDIA CUDA 6.5 のインストール。まぎらわしいのだが、OpenCL を試すにも CUDA にの環境が必要。むかしは SDK やら VisualStudio 用のプラグインなどなどを個別にインストールする必要があったが、いまは CUDA 6.5 をインストールすればよいらしい。Nsight (VisualStudio 用のプラグイン?) もこれではいる。NVIDIA の Web では NVDIA tool kit 6.5 という名前になっている。
CUDA Toolkit
でプロジェクトで Win32 のコンソールを選ぶ。
インクルードディレクトリを追加
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\include
ライブラリディレクトリを追加
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\lib/Win32
lib を追加
OpenCL.lib
プログラムを書く
#include "stdafx.h" #include <stdio.h> #include <CL/cl.h> #include <assert.h> #pragma comment(lib, "OpenCL.lib") #define BUF_SIZE 1024 static char buffer[BUF_SIZE + 1]; int _tmain(int argc, _TCHAR* argv[]) { cl_platform_id platforms[10]; cl_uint num_platforms; cl_int status; status = clGetPlatformIDs(sizeof(platforms) / sizeof(*platforms), platforms, &num_platforms); assert(status == CL_SUCCESS); printf("Number of platform(s) : %d\n", num_platforms); for (int i = 0; i < (int)num_platforms; ++i) { cl_platform_id &id(platforms[i]); status = clGetPlatformInfo(id, CL_PLATFORM_PROFILE, BUF_SIZE, buffer, NULL); assert(status == CL_SUCCESS); printf("version :%s\n", buffer); status = clGetPlatformInfo(id, CL_PLATFORM_NAME, BUF_SIZE, buffer, NULL); assert(status == CL_SUCCESS); printf("name :%s\n", buffer); status = clGetPlatformInfo(id, CL_PLATFORM_VENDOR, BUF_SIZE, buffer, NULL); assert(status == CL_SUCCESS); printf("vendor :%s\n", buffer); status = clGetPlatformInfo(id, CL_PLATFORM_EXTENSIONS, BUF_SIZE, buffer, NULL); assert(status == CL_SUCCESS); printf("extensions :%s\n", buffer); } return 0; }
コンパイル実行。
Number of platform(s) : 1 version :FULL_PROFILE name :NVIDIA CUDA vendor :NVIDIA Corporation extensions :cl_khr_byte_addressable_store cl_khr_icd cl_khr_gl_sharing cl_nv_d3d 9_sharing cl_nv_d3d10_sharing cl_khr_d3d10_sharing cl_nv_d3d11_sharing cl_nv_com piler_options cl_nv_device_attribute_query cl_nv_pragma_unroll
ここでは Win32 にしてしまった、あとで構成マネージャで x64 にした。これを間違えると _clGetPlatformInfo などが見つからないというエラーになる。(未解決のシンボル _clgetplatformInfo などのエラー)