M1 MacでのKAWPOW GPUマイニング

# M1での KAWPOW GPUマイニング
M1 Mac miniで[kawpowminer](https://github.com/RavenCommunity/kawpowminer)を使用してKAWPOW(Ravencoin)のGPUマイニングをしてみました。

[M1 Macでのイーサリアム GPUマイニング](https://qiita.com/asfdrwe/items/c7c7b603106476549155)で使用した[Yifan Gu氏のethminerへの修正](https://blog.yifangu.com/2021/02/26/mining-ethereum-on-a-m1-mac-gpu/)と同様に、M1に向けてlibethash-cl/CLMiner.cppへApple GPUの追加と依存関係にあるboost関連の修正とOpenSSLのアップグレードを行った[自作のパッチ](https://gist.github.com/asfdrwe/9bc5b447a8e2012c07ac9230b980a89f)を使用します。

ハッシュレートは800kH〜1MHぐらい、消費電力はサンワのワットモニターで測ると13~17Wでイーサリアムマイニングより電力を多く消費します。2021/5/3時点では1日数円程度の利益か電気代とほぼ同等程度なのでイーサリアムマイニングの方が稼げます。

## kawpowminerのビルド

### 準備
ターミナルを起動してください。~/Downloads/以下で作業します。

```
$ cd ~/Downloads/
```

XcodeとCommand line tools for Xcodeが未インストールならば[App StoreからXcodeをインストールし](https://apps.apple.com/jp/app/xcode/id497799835)、ターミナル上でCommand line tools for Xcodeをインストールしてください。

```
$ xcode-select --install
```

brewとcmakeが未インストールならbrewをインストールし、brew経由でcmakeをインストールしてください。

```
$ arch -arm64e /bin/bash -c "$(curl -fsSL $ https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
$ export PATH=/opt/homebrew/bin:$PATH
```

```
$ brew install cmake
```

### kawpowminerのビルド
git経由でファイルを取得します。

```
$ git clone https://github.com/RavenCommunity/kawpowminer.git
$ cd kawpowminer
$ git submodule update --init --recursive
```

M1用パッチをcurlコマンドで取得し当てます。

```
$ curl -o kawpowminer-m1.patch https://gist.githubusercontent.com/asfdrwe/9bc5b447a8e2012c07ac9230b980a89f/raw/9c08bb7c45659950f8ab638c77cd41b6f55a480c/kawpowminer-m1.patch
$ patch -p1 < kawpowminer-m1.patch
```

cmakeでビルドします。NVIDIA用のCUDAを外す指定をしてください。初回cmake実行時のみ依存関係で必要なものをビルドするのでそれなりに時間がかかります。

```
$ mkdir build
$ cd build
$ cmake .. -DETHASHCUDA=OFF
```

kawpowminerをビルドして実行バイナリのあるフォルダに移動します。

```
$ make 
$ cd kawpowminer
```

### kawpowminer GPUマイニングの実行
そのまま実行しようとすると、ethminerと同様に2021/5/3時点ではcl2Metalにバグがあるようで、日本語環境下ではOpenCLコードのバックスラッシュを円記号として扱ってしまい、正常に動作しないようです。

システム環境設定の言語と地域から英語環境を入れて優先する言語を英語にして実行するか、環境変数`__CF_USER_TEXT_ENCODING`を英語設定にしてください。

uidをidコマンドで確認し`__CF_USER_TEXT_ENCODING`の内容をechoやenvで確認します。uidが501(16進数で0x1F5)の場合はこうなります。

```
$ id
uid=501(asfdrwe) gid=20(staff) groups=20(staff),...

$ env | grep __CF_USER_TEXT_ENCODING
__CF_USER_TEXT_ENCODING=0x1F5:0x1:0xE
```

idが501(0x1F5)ならば`__CF_USER_TEXT_ENCODING`を`0x1F5:0x1:0xE`から`__CF_USER_TEXT_ENCODING`を`0x1F5:0x0:0x0`にすればcl2Metalのバグを回避できます。envコマンドかexportで`__CF_USER_TEXT_ENCODING`の値を変更してkawpowminerを実行してください。

[NiceHash pool](https://www.nicehash.com/)を使用するならばこのようになります。他のプールの設定はGoogleで探してください。

```
$ export __CF_USER_TEXT_ENCODING=0x1F5:0x0:0x0
$ ./kawpowminer -G -P stratum+tcp://『NiceHashの自分の報酬ビットコインアドレス』.『NiceHashの自分のWorker名(何でもいい)』@kawpow.usa-west.nicehash.com:3385
```

### 実行例
```
kawpowminer 1.2.3
Build: darwin/release/appleclang

 i 16:41:37           Configured pool kawpow.usa-west.nicehash.com:3385
 i 16:41:37           Selected pool kawpow.usa-west.nicehash.com:3385
 i 16:41:37           Stratum mode : Stratum
 i 16:41:37           Established connection to kawpow.usa-west.nicehash.com [[2606:4700:90:0:b61f:a5b7:e5e2:4342]:3385]
 i 16:41:37           Spinning up miners...
 i 16:41:37           Extranonce set to cead79
cl 16:41:37 cl-0      Creating buffers
cl 16:41:37 cl-0      Using PciId : Apple GPU 0.0 Apple M1 OpenCL 1.2  Memory : 5.33 GB
 i 16:41:37           Authorized worker xxxxxxxxxxxxxxxxxxxxxxx.xxxxxx
 i 16:41:37           New target set to: 0000000bc4656315000000000000000000000000000000000000000000000000
 i 16:41:37           Epoch : 231 Difficulty : 364.99 Mh
 i 16:41:37           Job: c293d6eb… block 1737641 kawpow.usa-west.nicehash.com [[2606:4700:90:0:b61f:a5b7:e5e2:4342]:3385]
cl 16:41:38 cl-0      Unable to lower compiler priority.
cl 16:41:39 cl-0      Pre-compiled period 579,213 OpenCL ProgPow kernel
cl 16:41:39 cl-0      Loaded period 579,213 progpow kernel
cl 16:41:39 cl-0      Unable to lower compiler priority.
cl 16:41:39 cl-0      Generating DAG + Light : 2.85 GB
cl 16:41:39 cl-0      Creating light cache buffer, size: 44.87 MB
cl 16:41:39 cl-0      Creating DAG buffer, size: 2.80 GB, free: 2.48 GB
cl 16:41:39 cl-0      Loading kernels
cl 16:41:40 cl-0      Pre-compiled period 579,214 OpenCL ProgPow kernel
cl 16:41:40 cl-0      Writing light cache buffer
 m 16:41:42           0:00 A0 0.00 h - cl0 0.00
 m 16:41:47           0:00 A0 0.00 h - cl0 0.00
 m 16:41:52           0:00 A0 0.00 h - cl0 0.00
 m 16:41:57           0:00 A0 0.00 h - cl0 0.00
 i 16:42:01           Job: 08daeddb… block 1737642 kawpow.usa-west.nicehash.com [[2606:4700:90:0:b61f:a5b7:e5e2:4342]:3385]
 m 16:42:02           0:00 A0 0.00 h - cl0 0.00
 m 16:42:07           0:00 A0 0.00 h - cl0 0.00
 m 16:42:12           0:00 A0 0.00 h - cl0 0.00
 m 16:42:17           0:00 A0 0.00 h - cl0 0.00
 m 16:42:22           0:00 A0 0.00 h - cl0 0.00
 m 16:42:27           0:00 A0 0.00 h - cl0 0.00
cl 16:42:27 cl-0      2.80 GB of DAG data generated in 47,963 ms.
cl 16:42:27 cl-0      Loaded period 579,214 progpow kernel
cl 16:42:27 cl-0      Unable to lower compiler priority.
cl 16:42:28 cl-0      Pre-compiled period 579,215 OpenCL ProgPow kernel
 m 16:42:32           0:00 A0 0.00 h - cl0 0.00
 m 16:42:37           0:01 A0 862.55 Kh - cl0 862.55
 m 16:42:42           0:01 A0 862.55 Kh - cl0 862.55
 m 16:42:47           0:01 A0 963.96 Kh - cl0 963.96
 m 16:42:52           0:01 A0 963.96 Kh - cl0 963.96
...
```

うまく実行できていれば900kH前後でマイニングできるはずです。また、NiceHashのmyページのmining rigのHISTORY & STATのActive workers に指定したWorker名で状況が表示されます。