ROCm 3.7 で Navi で OpenCL が動くようになりました

## 最新情報

ROCm 3.10 だと Navi GPU がハングするようになりました.
(e.g. `rocminfo` などを実行)

ROCm で Navi は, オフィシャルから正式対応があるまで(あれば良いですが...)あきらめましょう.

## 発端

<blockquote class="twitter-tweet"><p lang="en" dir="ltr"><a href="https://twitter.com/AMD?ref_src=twsrc%5Etfw">@AMD</a> <a href="https://twitter.com/hashtag/ROCm?src=hash&amp;ref_src=twsrc%5Etfw">#ROCm</a> version 3.7 finally supports Navi 10! I&#39;ve tested it on my 5700XT card. Hopefully <a href="https://twitter.com/PyTorch?ref_src=twsrc%5Etfw">@PyTorch</a> will run on Navi 10 now. Steps to reproduce on <a href="https://twitter.com/fedora?ref_src=twsrc%5Etfw">@fedora</a>: <a href="https://t.co/PJ42oj9jTc">https://t.co/PJ42oj9jTc</a> <a href="https://t.co/A9DSf1Pd7B">pic.twitter.com/A9DSf1Pd7B</a></p>&mdash; Erik Rigtorp (@rigtorp) <a href="https://twitter.com/rigtorp/status/1297711806387900416?ref_src=twsrc%5Etfw">August 24, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

長らく ROCm で Navi は動きませんでしたが, 3.7 からひっそりと  OpenCL は動くようになりました.

HIP(clang 利用) はまだうごかない: https://qiita.com/syoyo/items/240a1b08cb72f1ea6fbe
上記 tweet にあるように, (Ubuntu の場合)自前で最新 upstream カーネル(or Navi 対応 dkms module?)を使うなどすればいけるかもはしれません. 

また, 3.7 から OpenCL imaging 部分も open source になったようで, OpenCL 周りのより OSS 化が進んでいます.

## 環境

* Ubuntu 20.04.1
* RX 5700 無印
* X570 mobo


## セットアップ

ROCm の手順にあるとおりです.

### render group

Ubuntu 20.04 からは, `/dev/kfd`(AMD GPU HW へのインターフェイス?) の権限が代わり, `render` group に追加も必要になっていますので注意しましょう.

https://math.dartmouth.edu/~sarunas/amdgpu.html

## 動作確認(OpenCL)

```
/opt/rocm-3.7.0/opencl/bin/clinfo
```

で確認します.

`libOpenCL.so` が rocm のを使うように(本来は `/etc/OpenCL/vendors` の ICD 設定で見に行く .so を指定したほうがよいのであろうが),

`LD_LBRARY_PATH` で `/opt/rocm-3.7.0/opencl/lib` にパスを通しておきます.

xmrig で cryptonight-heavy(Haven)を動かしてみます.

そのままでは libOpenCL.so 関連の探索がうまくいかないのか, OpenCL 見つからないエラーになるので,

```
--opencl-loader=/opt/rocm-3.7.0/opencl/lib/libamdocl64.so
```

として直接指定します.

```
* ABOUT        XMRig/6.3.2 gcc/9.3.0
 * LIBS         libuv/1.34.2 OpenSSL/1.1.1f hwloc/2.1.0
 * HUGE PAGES   supported
 * 1GB PAGES    disabled
 * CPU          AMD Ryzen 9 3950X 16-Core Processor (1) x64 AES
                L2:8.0 MB L3:64.0 MB 16C/32T NUMA:1
 * MEMORY       2.2/94.3 GB (2%)
 * DONATE       1%
 * ASSEMBLY     auto:ryzen
 * POOL #1      haven.miner.rocks:4005 algo cn-heavy/xhv
 * COMMANDS     hashrate, pause, resume, results, connection
 * ADL          press e for health report
 * OPENCL       #0 AMD Accelerated Parallel Processing/OpenCL 2.0 AMD-APP (3182.0)
 * OPENCL GPU   #0 0b:00.0 Navi 10 [Radeon RX 5600 OEM/5600 XT / 5700/5700 XT] (gfx1010) 1750 MHz cu:18 mem:6949/8176 MB
 * CUDA         disabled
[2020-08-30 18:16:42.095]  net      use pool haven.miner.rocks:4005  51.38.152.26
[2020-08-30 18:16:42.095]  net      new job from haven.miner.rocks:4005 diff 30000 algo cn-heavy/xhv
[2020-08-30 18:16:42.095]  opencl   use profile  cn-heavy  (2 threads) scratchpad 4096 KB
|  # | GPU |  BUS ID | INTENSITY | WSIZE | MEMORY | NAME
|  0 |   0 | 0b:00.0 |       864 |     8 |   3456 | Navi 10 [Radeon RX 5600 OEM/5600 XT / 5700/5700 XT] (gfx1010)
|  1 |   0 | 0b:00.0 |       864 |     8 |   3456 | Navi 10 [Radeon RX 5600 OEM/5600 XT / 5700/5700 XT] (gfx1010)
[2020-08-30 18:16:42.368]  opencl   GPU #0 compiling...
[2020-08-30 18:16:54.703]  net      new job from haven.miner.rocks:4005 diff 30000 algo cn-heavy/xhv
[2020-08-30 18:17:00.754]  opencl   GPU #0 compilation completed (18386 ms)
[2020-08-30 18:17:00.757]  opencl   READY threads 2/2 (18662 ms)
[2020-08-30 18:17:23.399]  opencl   accepted (1/0) diff 30000 (359 ms)
[2020-08-30 18:17:42.181]  opencl   #0 0b:00.0 109W 58C 2289RPM 1750/875MHz
[2020-08-30 18:17:42.181]  miner    speed 10s/60s/15m 1342.2 n/a n/a H/s max 1343.3 H/s
[2020-08-30 18:17:44.078]  net      new job from haven.miner.rocks:4005 diff 21428 algo cn-heavy/xhv
[2020-08-30 18:18:01.697]  opencl   accepted (2/0) diff 21428 (359 ms)
[2020-08-30 18:18:42.284]  opencl   #0 0b:00.0 132W 67C 2282RPM 1750/875MHz
```

Voila! :tada:

Powerlimit 運用でハッシュレート 1340 H/s 出ました. 
本来は 2000 H/s が期待されるところですが, intensity なり調整すれば出るかしらん?

## ETH マイニング性能

Teamredminer 0.7.9 で確認してみます.

rocm-smi --setsclk 2 で,

```
GPU 0 [61C, fan 69%]       ethash: 48.62Mh/s, avg 47.19Mh/s
```

48 MH/s @ 110 W でした.

amdgpu-pro(プロプライエタリ OpenCL ドライバ)でも大体同等のワットパフォーマンスでしたので, ROCm 版 OpenCL で性能が落ちるのは確認できませんでした(ので良い!)

## 動きはするが... 将来が不安

Navi で動くというのは ROCm 3.7 リリースノートにはありません.

今回の進展は CDNA に向けての布石でしょうから, 今後 ROCm で RDNA できちんと OpenCL が動作するか + RDNA Navi/RDNA2 BigNavi 自体が正式サポートするかどかは不明です. 
(一応ソースコードには gfx10xx 系(Navi)の対応はあるが)

また, github issue のやり取りを見る限り, 最近はより HPC 顧客(Frontier とかでしょうね)向けに業務しており, 一般ユーザ向けはないがしろにされています.

一般ユーザ向けには, 引き続き通常の amdgpu ドライバ(で OpenCL)を利用したほうがよいと思われます.

amdgpu, amdgpu-pro のメモ
https://qiita.com/syoyo/items/154e0be7157a579e1d32