OpenCL Visual Studio (その2)

workitem の数を出力するように変更した。プログラムはフレキシブルに作らなかった。device_id や dimension はそれぞれ 1 と 3 であることが事前に情報を得たためにわかっていたのでハードコーディングした。

		cl_device_id device_id;
		status = clGetDeviceIDs(id, CL_DEVICE_TYPE_GPU, 1, &device_id, NULL);
		assert(status == CL_SUCCESS);
		printf("device_id:%x\n", (int)device_id);

		cl_uint compute_units;
		status = clGetDeviceInfo(device_id, CL_DEVICE_MAX_COMPUTE_UNITS, sizeof(compute_units), &compute_units, NULL);
		assert(status == CL_SUCCESS);
		printf("compute_units:%d\n", compute_units);

		size_t workgroup_size;
		clGetDeviceInfo(device_id, CL_DEVICE_MAX_WORK_GROUP_SIZE, sizeof(workgroup_size), &workgroup_size, NULL);
		printf("workgroup_size:%d\n", workgroup_size);

		cl_uint workitem_dims;
		clGetDeviceInfo(device_id, CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS, sizeof(workitem_dims), &workitem_dims, NULL);

		printf("workitem_dims:%d\n", workitem_dims);

		size_t workitem_size[3];
		clGetDeviceInfo(device_id, CL_DEVICE_MAX_WORK_ITEM_SIZES, sizeof(workitem_size), workitem_size, NULL);
		printf("workitem_size:%d %d %d\n", workitem_size[0], workitem_size[1], workitem_size[2]);

		cl_uint clock_frequency;
		clGetDeviceInfo(device_id, CL_DEVICE_MAX_CLOCK_FREQUENCY, sizeof(clock_frequency), &clock_frequency, NULL);
		printf("clock_frequency:%d\n", clock_frequency);

細かい情報は khronos からわかる。
https://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/clGetDeviceInfo.html


結果は次の通り

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
ui num devices:1
device_id:f23f3150
compute_units:1
workgroup_size:1024
workitem_dims:3
workitem_size:1024 1024 64
clock_frequency:875

NVIDIA の K600 ( K6000 じゃないよ ) なので、資料によるとCUDAコアプロセッサが 192 個ある。が workitem_size は 1024 x 1024 x 64 。OpenCL の”空間"しかみえないので、実際にエンジンがどれくらいあるかわからない。どういうわけか、clock frequency だけはとれる。875MHz 。本当にそんな高速に動いているかはなぞ。

デスク向けGPU一覧表 コアクロック | カテナレンタルシステム

これだけだと、いわゆる kernel ってやつをロードさせて、実行していない。そこで Convolution を実行することにした。NVidia のサンプルを見たが、うまくコンパイルできなかった。(いろいろ環境が必要そう。CUDA をインストールすると展開されるのでそれを直接つかえばいいのかもしれない。しかし、ディレクトリが汚くなるのでやっていない)

Cloo というオープンソースC# から OpenCL を使えるインタフェースがあるらしい。CLConvolution をダウンロードして使う。簡単に使えた。