開発」カテゴリーアーカイブ

OpenCLをVisualStudio2017で使う (Intel SDK)

AI的な文脈でOpenCLに興味を持ったので、最近OpenCL in Actionという本を読んでいる。OpenCLとはなんぞやという全体像をきちんと掴みたくて読み始めた。

とはいえ、450ページもあって読んでいるうちにたまに眠くなるので、少しは手を動かしたほうがいいと思って、とりあえずVisual Studio2017でOpenCLを試してみることにした。

今使っているWindowsマシンはSurface Pro4。デバイスマネージャを見ると、GPUはIntelのHD Graphic520だったので、IntelのOpenCL SDKを下記からダウンロードしてインストールした。
https://software.intel.com/en-us/intel-opencl/download

SDKを入れてVisual Studioを立ち上げると見慣れないメニューが追加されている。Core-Builder。そこからPlatform Infoを選ぶと、下記のようにデバイスの一覧が取得できる。

ss-vs2017-01

さらに、デバイスを選択してプロパティを表示すると下記のように各種情報が確認できる。
ss-vs2017-02

次に、APIがきちんとインストールされていることを確認するために、Intelのこちらのページからサンプルプログラムをダウンロードして、Visual Studioでビルドする。使用するプログラムは主にclGetDeviceInfoを使用してさっきプロパティで表示されたような内容を取得するものでOpenCL1.2 samples for WindowsからPlatform/Device Capabilities Viewer Sampleというもの。

ちなみに、Visual Studio2017用のソリューションファイルが提供されていないので2015のものを使用した。2015版から2017版へビルド周りの設定をコンバートするように促されるので変換して使用する。ビルドが成功すれば、APIが問題なくインストールされているということ。

このサンプルプログラムをVisual Studioのビルドから実行すると出力が流れてDOS窓が消えて何もわからないけれど、コマンドラインから実行するとclGetDeviceInfoで取得されたGPUの各情報を確認できる。


CL_DEVICE_TYPE_GPU[0]
CL_DEVICE_NAME: Intel(R) HD Graphics 520
CL_DEVICE_AVAILABLE: 1
CL_DEVICE_VENDOR: Intel(R) Corporation
CL_DEVICE_PROFILE: FULL_PROFILE
CL_DEVICE_VERSION: OpenCL 2.0
CL_DRIVER_VERSION: 21.20.16.4627
CL_DEVICE_OPENCL_C_VERSION: OpenCL C 2.0
CL_DEVICE_MAX_COMPUTE_UNITS: 24
CL_DEVICE_MAX_CLOCK_FREQUENCY: 1000
CL_DEVICE_MAX_WORK_GROUP_SIZE: 256
CL_DEVICE_ADDRESS_BITS: 32
CL_DEVICE_MEM_BASE_ADDR_ALIGN: 1024
CL_DEVICE_MAX_MEM_ALLOC_SIZE: 1561123226
CL_DEVICE_GLOBAL_MEM_SIZE: 1561123226
CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE: 1561123226
CL_DEVICE_GLOBAL_MEM_CACHE_SIZE: 524288
CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE: 64
CL_DEVICE_LOCAL_MEM_SIZE: 65536
CL_DEVICE_PROFILING_TIMER_RESOLUTION: 83
CL_DEVICE_IMAGE_SUPPORT: 1
CL_DEVICE_ERROR_CORRECTION_SUPPORT: 0
CL_DEVICE_HOST_UNIFIED_MEMORY: 1
CL_DEVICE_EXTENSIONS: cl_intel_accelerator cl_intel_advanced_motion_estimation cl_intel_d3d11_nv12_media_sharing cl_intel_driver_diagnostics cl_intel_dx9_media_sharing cl_intel_motion_estimation cl_intel_packed_yuv cl_intel_required_subgroup_size cl_intel_simultaneous_sharing cl_intel_subgroups cl_khr_3d_image_writes cl_khr_byte_addressable_store cl_khr_d3d10_sharing cl_khr_d3d11_sharing cl_khr_depth_images cl_khr_dx9_media_sharing cl_khr_fp16 cl_khr_fp64 cl_khr_gl_depth_images cl_khr_gl_event cl_khr_gl_msaa_sharing cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics cl_khr_gl_sharing cl_khr_icd cl_khr_image2d_from_buffer cl_khr_local_int32_base_atomics cl_khr_local_int32_extended_atomics cl_khr_mipmap_image cl_khr_mipmap_image_writes cl_khr_spir cl_khr_subgroups
CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT: 4
CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG: 1
CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT: 1
CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE: 1
CL_DEVICE_NATIVE_VECTOR_WIDTH_INT: 4
CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG: 1
CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT: 1
CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE: 1