マイニング用RX470のOpenCL等を使えるようにする

 ディスプレイ出力端子の無いマイニング用RX470をIvy Bridge世代のXeon E3-1225 V2搭載機に装着して、Windows環境でOpenCLが使えるようにしました。
 

使えるようになるまでの過程

 このRX470のOpenCLを使えるようになるまでに、結構な試行錯誤したので参考までに記しておきます。

  • 当初はヘッドレス運用のUbuntu serverで使えるようにしたかった
    • 運用していたUbuntu 18.10ではAMDのドライバ(amdgpu-pro-18.50-******-ubuntu-18.04.tar.xz)がインストールできない*1
    • 仕方ないのでUbuntu 18.04をクリーンインストールしたところ、AMDのドライバインストールは成功する(エラーは起きない)が機能しない
      • lspciでRX470は見えているし、dmesgにもエラーは無さそうだが、clinfoでOpenCLバイスの情報が何も拾えない
$ 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
      • ./amdgpu-pro-install -y --opencl=legacy --headless でも ./amdgpu-install -y --opencl=legacy --headless でも同じ状態
    • 困り果てていたところ、ROCm(RadeonOpenCompute)のSupported CPUがHaswell以降と書いてあって、もしかしてamdgpuもIvy-Bridgeでは動かない?

GitHub - RadeonOpenCompute/ROCm: ROCm - Open Source Platform for HPC and Ultrascale GPU Computing

      • そもそも、ROCmのOpenCLとamdgpuのOpenCLって何が違うんだろうという理解レベルなので、これ以上掘り下げるのは自力では無理
  • それならWindows環境で試してみよう
    • マイニング用RX470が刺さっているとCPU内蔵グラフィックから出力がされずに、BIOSやOSインストール操作すらできない
    • HP Z220ではCPU内蔵グラフィックと外部GPUの優先指定がBIOSで切り替えできない
    • RX470の電源を接続しなければRX470が認識されずにCPU内蔵グラフィックで起動する
    • CPU内蔵グラフィックでWindowsをインストールし、リモートデスクトップ接続できる状態まで設定する
    • RX470の電源を接続しリモートデスクトップ経由でRX470のドライバインストールする
      • AMD公式からダウンロードしたドライバインストール中に「LoadLibrary failed with error 87: パラメータが間違っています。」が発生する*2
      • 再試行しても同じエラーが発生するが、最低限のドライバやRADEON設定等のツール類はエラー発生前にインストールされる模様
    • 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が機能するのかわからないので、(マイニング運用するつもりはないのですが、)マイニングプログラムを動作させてみました。
f:id:kachine:20190303044013p:plain
 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は無事インストールされています。
f:id:kachine:20190303045231p:plain
f:id:kachine:20190303045315p:plain
 OpenCLだけではなくOpenGLも利用可能なようです。
f:id:kachine:20190303045255p:plain
 ハードウェアタブが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

 

AMF動作確認

 RADEON設定ツールからはAMDのAMF(Advanced Media Framework)というかVCE(Video Coding Engine)の対応状況が読み取れず、Radeonに搭載されたハードウェアエンコーダが動作するのか良く判りません。
 実際に試してみるべく、ffmpegでh264_amfやhevc_amfエンコーダを指定してみたところ、CPUでソフトウェアエンコードを行うlibx264やlibx265より高速にエンコードが完了することはとりあえず確認できました。
 



以上。

*1:インストールスクリプト中のバージョンチェックで弾かれる。

*2:軽く検索した限りでは、リモートデスクトップ経由でOpenGLを使おうとすると発生するっぽい。

*3:Turbo boost時Max 3.6GHz