ディスプレイ出力端子の無いマイニング用RX470をIvy Bridge世代のXeon E3-1225 V2搭載機に装着して、Windows環境でOpenCLが使えるようにしました。
使えるようになるまでの過程
このRX470のOpenCLを使えるようになるまでに、結構な試行錯誤したので参考までに記しておきます。
- 当初はヘッドレス運用のUbuntu serverで使えるようにしたかった
$ lspci | grep VGA 01:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere [Radeon RX 470/480] (rev cf) $ dmesg | grep -i gpu [ 1.185200] [drm] amdgpu kernel modesetting enabled. [ 1.185732] [drm] amdgpu version: 18.50.1.418 [ 1.191251] fb: switching to amdgpudrmfb from EFI VGA [ 1.192199] amdgpu 0000:01:00.0: Invalid PCI ROM header signature: expecting 0xaa55, got 0xffff [ 1.192287] amdgpu 0000:01:00.0: VRAM: 8192M 0x000000F400000000 - 0x000000F5FFFFFFFF (8192M used) [ 1.192290] amdgpu 0000:01:00.0: GART: 256M 0x000000FF00000000 - 0x000000FF0FFFFFFF [ 1.192424] [drm] amdgpu: 8192M of VRAM memory ready [ 1.192426] [drm] amdgpu: 8192M of GTT memory ready. [ 1.192440] [drm] GART: num cpu pages 65536, num gpu pages 65536 [ 1.435255] [drm] Initialized amdgpu 3.27.0 20150101 for 0000:01:00.0 on minor 0 [ 4.268382] RAPL PMU: hw unit of domain pp1-gpu 2^-16 Joules $ clinfo Number of platforms 0
GitHub - RadeonOpenCompute/ROCm: ROCm - Open Source Platform for HPC and Ultrascale GPU Computing
- それならWindows環境で試してみよう
- マイニング用RX470が刺さっているとCPU内蔵グラフィックから出力がされずに、BIOSやOSインストール操作すらできない
- HP Z220ではCPU内蔵グラフィックと外部GPUの優先指定がBIOSで切り替えできない
- RX470の電源を接続しなければRX470が認識されずにCPU内蔵グラフィックで起動する
- CPU内蔵グラフィックでWindowsをインストールし、リモートデスクトップ接続できる状態まで設定する
- RX470の電源を接続しリモートデスクトップ経由でRX470のドライバインストールする
- clinfoでRX470の情報が出力される!
| Platform Name: | AMD Accelerated Parallel Processing | |
|---|---|---|
| Number of devices: | 2 | |
| Device Type: | CL_DEVICE_TYPE_GPU | CL_DEVICE_TYPE_CPU |
| Vendor ID: | 1002h | 1002h |
| Board name: | Radeon (TM) RX 470 Graphics | |
| Device Topology: | PCI[ B#1, D#0, F#0 ] | |
| Max compute units: | 32 | 4 |
| Max work items dimensions: | 3 | 3 |
| Max work items[0]: | 256 | 1024 |
| Max work items[1]: | 256 | 1024 |
| Max work items[2]: | 256 | 1024 |
| Max work group size: | 256 | 1024 |
| Preferred vector width char: | 4 | 16 |
| Preferred vector width short: | 2 | 8 |
| Preferred vector width int: | 1 | 4 |
| Preferred vector width long: | 1 | 2 |
| Preferred vector width float: | 1 | 8 |
| Preferred vector width double: | 1 | 4 |
| Native vector width char: | 4 | 16 |
| Native vector width short: | 2 | 8 |
| Native vector width int: | 1 | 4 |
| Native vector width long: | 1 | 2 |
| Native vector width float: | 1 | 8 |
| Native vector width double: | 1 | 4 |
| Max clock frequency: | 1206Mhz | 3193Mhz |
| Address bits: | 64 | 64 |
| Max memory allocation: | 4,244,635,648 | 2,147,483,648 |
| Image support: | Yes | Yes |
| Max number of images read arguments: | 128 | 128 |
| Max number of images write arguments: | 64 | 64 |
| Max image 2D width: | 16384 | 8192 |
| Max image 2D height: | 16384 | 8192 |
| Max image 3D width: | 2048 | 2048 |
| Max image 3D height: | 2048 | 2048 |
| Max image 3D depth: | 2048 | 2048 |
| Max samplers within kernel: | 16 | 16 |
| Max size of kernel argument: | 1024 | 4096 |
| Alignment (bits) of base address: | 2048 | 1024 |
| Minimum alignment (bytes) for any datatype: | 128 | 128 |
| Single precision floating point capability | ||
| Denorms: | No | Yes |
| Quiet NaNs: | Yes | Yes |
| Round to nearest even: | Yes | Yes |
| Round to zero: | Yes | Yes |
| Round to +ve and infinity: | Yes | Yes |
| IEEE754-2008 fused multiply-add: | Yes | Yes |
| Cache type: | Read/Write | Read/Write |
| Cache line size: | 64 | 64 |
| Cache size: | 16,384 | 32,768 |
| Global memory size: | 8,589,934,592 | 8,528,982,016 |
| Constant buffer size: | 4,244,635,648 | 65,536 |
| Max number of constant args: | 8 | 8 |
| Local memory type: | Scratchpad | Global |
| Local memory size: | 32768 | 32768 |
| Max pipe arguments: | 16 | 16 |
| Max pipe active reservations: | 16 | 16 |
| Max pipe packet size: | 4,244,635,648 | 2,147,483,648 |
| Max global variable size: | 3,820,172,032 | 1,879,048,192 |
| Max global variable preferred total size: | 8,589,934,592 | 1,879,048,192 |
| Max read/write image args: | 64 | 64 |
| Max on device events: | 1024 | 0 |
| Queue on device max size: | 8388608 | 0 |
| Max on device queues: | 1 | 0 |
| Queue on device preferred size: | 262144 | 0 |
| SVM capabilities: | ||
| Coarse grain buffer: | Yes | No |
| Fine grain buffer: | Yes | No |
| Fine grain system: | No | No |
| Atomics: | No | No |
| Preferred platform atomic alignment: | 0 | 0 |
| Preferred global atomic alignment: | 0 | 0 |
| Preferred local atomic alignment: | 0 | 0 |
| Kernel Preferred work group size multiple: | 64 | 1 |
| Error correction support: | 0 | 0 |
| Unified memory for Host and Device: | 0 | 1 |
| Profiling timer resolution: | 1 | 100 |
| Device endianess: | Little | Little |
| Available: | Yes | Yes |
| Compiler available: | Yes | Yes |
| Execution capabilities: | ||
| Execute OpenCL kernels: | Yes | Yes |
| Execute native function: | No | Yes |
| Queue on Host properties: | ||
| Out-of-Order: | No | No |
| Profiling : | Yes | Yes |
| Queue on Device properties: | ||
| Out-of-Order: | No | No |
| Profiling : | Yes | Yes |
| Platform ID: | 00007FFCFE320188 | 00007FFCFE320188 |
| Name: | Ellesmere | Intel(R) Xeon(R) CPU E3-1225 V2 @ 3.20GHz |
| Vendor: | Advanced Micro Devices, Inc. | GenuineIntel |
| Device OpenCL C version: | OpenCL C 2.0 | OpenCL C 1.2 |
| Driver version: | 2348.3 | 2348.3 (sse2,avx) |
| Profile: | FULL_PROFILE | FULL_PROFILE |
| Version: | OpenCL 2.0 AMD-APP (2348.3) | OpenCL 1.2 AMD-APP (2348.3) |
| Extensions: | cl_khr_fp64 cl_amd_fp64 cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics cl_khr_local_int32_base_atomics cl_khr_local_int32_extended_atomics cl_khr_int64_base_atomics cl_khr_int64_extended_atomics cl_khr_3d_image_writes cl_khr_byte_addressable_store cl_khr_fp16 cl_khr_gl_sharing cl_khr_gl_depth_images cl_amd_device_attribute_query cl_amd_vec3 cl_amd_printf cl_amd_media_ops cl_amd_media_ops2 cl_amd_popcnt cl_khr_d3d10_sharing cl_khr_d3d11_sharing cl_khr_dx9_media_sharing cl_khr_image2d_from_buffer cl_khr_spir cl_khr_subgroups cl_khr_gl_event cl_khr_depth_images cl_khr_mipmap_image cl_khr_mipmap_image_writes cl_amd_liquid_flash |
cl_khr_fp64 cl_amd_fp64 cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics cl_khr_local_int32_base_atomics cl_khr_local_int32_extended_atomics cl_khr_int64_base_atomics cl_khr_int64_extended_atomics cl_khr_3d_image_writes cl_khr_byte_addressable_store cl_khr_gl_sharing cl_ext_device_fission cl_amd_device_attribute_query cl_amd_vec3 cl_amd_printf cl_amd_media_ops cl_amd_media_ops2 cl_amd_popcnt cl_khr_d3d10_sharing cl_khr_spir cl_khr_gl_event |
動作確認
無事clinfoが出力されたわけですが、本当にOpenCLが機能するのかわからないので、(マイニング運用するつもりはないのですが、)マイニングプログラムを動作させてみました。

CPUのXeon E3-1225V2は3.2GHz駆動*3の4Core/4Threadですが上記スクリーンショット取得時で170H/s程度、GPUのRX470は600H/s程度とCPUの3.5倍程度の演算能力を発揮していることが判ります。
なお、この時タスクマネージャーの左側のグラフではGPU負荷がほとんど無いように見えますが、右側でCOMPUTE_2を表示させるとマイニングによるOpenCLの負荷と思われるグラフが確認できました。CPUが100%に張り付いているのとは異なり、断続的に見えるのはホストとGPU間でのデータ転送待ちによるものだったりするのでしょうかね?
なお、ブログへの投稿順序は前後しますが、後にOpenCLを有効にしたImageMagickをビルドして動作させることにも成功しており、OpenCLの利用には特に問題の無い環境が構築できたと判断できます。
wave.hatenablog.com
RADEON設定ツール
前述の通り、ドライバインストール過程で「LoadLibrary failed with error 87: パラメータが間違っています。」が発生しますが、RADEON SETTINGは無事インストールされています。


OpenCLだけではなくOpenGLも利用可能なようです。

ハードウェアタブがRadeon (TM) RX 470 Graphics (無効)と表示されているのが気にならなくもありませんが、前述のようにOpenCLを利用するソフトウェアも正常に機能しているようですので、単にディスプレイが繋がってないため無効表示となっているようです。
[OVERVIEW]
Radeon ソフトウェア バージョン - 17.1.1
Radeon ソフトウェア エディション - Crimson ReLive
Windows バージョン - Windows 10 (64 bit)
システム メモリ - 8 GB
CPU の種類 - Intel(R) Xeon(R) CPU E3-1225 V2 @ 3.20GHz
[SOFTWARE]
Radeon 設定バージョン - 2017.0424.2119.36535
ドライバー パッケージのバージョン - 17.10.1731-170424a2-313676E-WU-Template-1710
プロバイダー - Advanced Micro Devices, Inc.
2D ドライバー バージョン - 8.1.1.1599
Direct3D® Version - 9.14.10.01261
OpenGL® Version - 6.14.10.13474
OpenCL™ Version - 22.19.162.4
AMD Mantle のバージョン - 9.1.10.0189
AMD Mantle API のバージョン - Not Available
AMD オーディオ ドライバー バージョン - 10.0.1.6
Vulkan™ Driver Version - Not Available
Vulkan™ API Version - Not Available
[HARDWARE]
グラフィックス カードの製造元 - Powered by AMD
グラフィックス チップセット - Radeon (TM) RX 470 Graphics
デバイス ID - 67DF
ベンダー ID - 1002
サブシステム ID - 387E
サブシステム ベンダー ID - 174B
修正 ID - CF
バス タイプ - PCI Express 3.0
現在のバス設定 - PCI Express 3.0 x16
BIOS バージョン - 015.050.000.001
BIOS パーツ番号 - 113-WE3874U.M3E
BIOS 日付 - 2017/11/07 03:34
メモリ サイズ - 8192 MB
メモリ タイプ - GDDR5
メモリ クロック - 1750 MHz
コアのクロック - 1206 MHz
メモリ全体の帯域幅 - 224 GByte/s
メモリー ビット レート - 7.00 Gbps
2D ドライバー ファイルのパス - /REGISTRY/MACHINE/SYSTEM/ControlSet001/Control/Class/{4d36e968-e325-11ce-bfc1-08002be10318}/0001