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 をダウンロードして使う。簡単に使えた。