2018-03-14

Linux Mintで仮想通貨のマイニング:Ethereum

Linux Mintで仮想通貨のマイニングを試してみたくて、Ethereumのマイニングに挑戦してみました。しかし、結論から言うとわが家の機材ではこれは失敗でした。

GPUはRadeon R7 240で、VRAMは2GBです。

マイニング用ソフトはClaymoreにしてみました。マイニグソフトはGeForceというかCUDA向けが多いようで、Radeonで使えるOpenCLに対応したもの、かつLinuxで使えるものを探して辿り着きました。

RadeonでOpenCLを使うためにはAMDGPU-Proドライバーをインストールするのが簡単ですが、そのままインストールするとビデオドライバーもインストールされてしまいます。

問題なければそれでも良いのですが、わが家の場合はブラウザの描画が乱れてしまうので、ビデオドライバーはamdgpuのままで、OpenCL系のドライバーだけAMDGPU-Proを使いたいなぁ、と思っていたら、ちゃんとそうしたインストールオプションが用意されていました。
※ちなみにAMDGPU-Proのバージョンは17.40です。
amgdpu-pro-install.sh --compute
こんな感じで、--computeというオプションを付けてあげるとビデオドライバーは変更されずにOpenCLだけ使えるようになります。

こうするとAMDGPU-Pro版のclinfoコマンドも導入されます。パスが通っていないと思いますが、/opt/amdgpu-pro/bin/clinfoを実行すると正しくOpenCL環境が用意できたことを確認できます。

$ /opt/amdgpu-pro/bin/clinfo
Number of platforms:                 1
  Platform Profile:                 FULL_PROFILE
  Platform Version:                 OpenCL 2.0 AMD-APP (2482.3)
  Platform Name:                 AMD Accelerated Parallel Processing
  Platform Vendor:                 Advanced Micro Devices, Inc.
  Platform Extensions:                 cl_khr_icd cl_amd_event_callback cl_amd_offline_devices


  Platform Name:                 AMD Accelerated Parallel Processing
Number of devices:                 1
  Device Type:                     CL_DEVICE_TYPE_GPU
  Vendor ID:                     1002h
  Board name:                     AMD Radeon HD 8500 series
  Device Topology:                 PCI[ B#1, D#0, F#0 ]
  Max compute units:                 5
  Max work items dimensions:             3
    Max work items[0]:                 256
    Max work items[1]:                 256
    Max work items[2]:                 256
  Max work group size:                 256
  Preferred vector width char:             4
  Preferred vector width short:             2
  Preferred vector width int:             1
  Preferred vector width long:             1
  Preferred vector width float:             1
  Preferred vector width double:         1
  Native vector width char:             4
  Native vector width short:             2
  Native vector width int:             1
  Native vector width long:             1
  Native vector width float:             1
  Native vector width double:             1
  Max clock frequency:                 800Mhz
  Address bits:                     32
  Max memory allocation:             1354220544
  Image support:                 Yes
  Max number of images read arguments:         128
  Max number of images write arguments:         8
  Max image 2D width:                 16384
  Max image 2D height:                 16384
  Max image 3D width:                 2048
  Max image 3D height:                 2048
  Max image 3D depth:                 2048
  Max samplers within kernel:             16
  Max size of kernel argument:             1024
  Alignment (bits) of base address:         2048
  Minimum alignment (bytes) for any datatype:     128
  Single precision floating point capability
    Denorms:                     No
    Quiet NaNs:                     Yes
    Round to nearest even:             Yes
    Round to zero:                 Yes
    Round to +ve and infinity:             Yes
    IEEE754-2008 fused multiply-add:         Yes
  Cache type:                     Read/Write
  Cache line size:                 64
  Cache size:                     16384
  Global memory size:                 1760641024
  Constant buffer size:                 65536
  Max number of constant args:             8
  Local memory type:                 Scratchpad
  Local memory size:                 32768
  Max pipe arguments:                 0
  Max pipe active reservations:             0
  Max pipe packet size:                 0
  Max global variable size:             0
  Max global variable preferred total size:     0
  Max read/write image args:             0
  Max on device events:                 0
  Queue on device max size:             0
  Max on device queues:                 0
  Queue on device preferred size:         0
  SVM capabilities:                
    Coarse grain buffer:             No
    Fine grain buffer:                 No
    Fine grain system:                 No
    Atomics:                     No
  Preferred platform atomic alignment:         0
  Preferred global atomic alignment:         0
  Preferred local atomic alignment:         0
  Kernel Preferred work group size multiple:     64
  Error correction support:             0
  Unified memory for Host and Device:         0
  Profiling timer resolution:             1
  Device endianess:                 Little
  Available:                     Yes
  Compiler available:                 Yes
  Execution capabilities:                
    Execute OpenCL kernels:             Yes
    Execute native function:             No
  Queue on Host properties:                
    Out-of-Order:                 No
    Profiling :                     Yes
  Queue on Device properties:                
    Out-of-Order:                 No
    Profiling :                     No
  Platform ID:                     0xf7c384ac
  Name:                         Oland
  Vendor:                     Advanced Micro Devices, Inc.
  Device OpenCL C version:             OpenCL C 1.2
  Driver version:                 2482.3
  Profile:                     FULL_PROFILE
  Version:                     OpenCL 1.2 AMD-APP (2482.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_gl_sharing cl_amd_device_attribute_query cl_amd_vec3 cl_amd_printf cl_amd_media_ops cl_amd_media_ops2 cl_amd_popcnt cl_khr_image2d_from_buffer cl_khr_spir cl_khr_gl_event
 さて、ClaymoreはEthereumと別の仮想通貨を同時にマイニングする機能が備わっていますが、Ethereumだけをマイニングすることもできます。そのサンプルがstart_only_eth.bashとして同梱されています。

シェルの先頭に「export GPU_FORCE_64BIT_PTR=0」という指定がありますが、実はこれでは動かなかったので「export GPU_FORCE_64BIT_PTR=1」と書き換えてあげる必要がありました。

しかし、何度試してみても一向にマイニングが進みません。ログを見ても何がダメなのかがよくわかりません。GPU errorというメッセージで失敗していることしかわかりません。
dbfff700    parse packet: 242
dbfff700    ETH: job changed
dbfff700    new buf size: 0
dbfff700    ETH: 02/12/18-15:00:20 - New job from eth-eu1.nanopool.org:9999
dbfff700    target: 0x000000006df37f67 (diff: 10000MH), epoch 169(2.32GB)
dbfff700    ETH - Total Speed: 0.000 Mh/s, Total Shares: 0, Rejected: 0, Time: 00:00
dbfff700    ETH: GPU0 0.000 Mh/s
e8f3c700    GPU 0 temp = 40, old fan speed = 29, new fan speed = 25  
e8f3c700    GPU0 t=40C fan=29%
e8f3c700    em hbt: 0, fm hbt: 20, 
e8f3c700    watchdog - thread 0 (gpu0), hb time 27305
e8f3c700    watchdog - thread 1 (gpu0), hb time 27305
e8f3c700    WATCHDOG: GPU error, you need to restart miner :( 
e8f3c700    GPU 0 temp = 40, old fan speed = 29, new fan speed = 25
しかし、ついに原因を特定しました。「epoch 169(2.32GB)」という部分です。 Ethereumはメモリー上にデータを展開して計算するような仕組みだそうで、現在のサイズが2.32GBということでした。わが家のRadeonのVRAM容量は2GBなので、これを展開できないためにエラーになっているようです。

ゲームをしないのでVRAM 2GBなんて何に使うのかと思っていたら、思わぬところで躓いてしまいました。

WindowsであればビデオカードのVRAMにOSのメモリーを追加して使用できるので、もしかするとWindowsであればこのビデオカードでもEthereumのマイニングができるかもしれません。

しかし、ワタシは普段使っているLinuxでマイニングがしたいのです。ということで、ここからRadeonでVRAM 4GBを搭載しているビデオカード探しが始まっていきました。