/xilinx-ethash

Run ethash opencl kernel on Xilinx's Alveo U50

Primary LanguageC

Xilinx Ethash Test

This project is created for testing the Ethminer's ethash opencl kernel on Xilinx Alveo U50 PCIe card.

  • Testing Environment

    CPU: Intel(R) Core(TM) i5-4460  CPU @ 3.20GHz
    RAN: 16GB
    OS: Ubuntu 18.04.5 LTS
    Xilinx: Alveo U50/Vitis 2020.2
  • Alveo U50 information:

    $ sudo /opt/xilinx/xrt/bin/xbmgmt flash --scan
    Card [0000:01:00.0]
        Card type:		u50
        Flash type:		SPI
        Flashable partition running on FPGA:
            xilinx_u50_gen3x16_xdma_201920_3,[ID=0xf465b0a3ae8c64f6],[SC=5.0]
        Flashable partitions installed in system:	
            xilinx_u50_gen3x16_xdma_201920_3,[ID=0xf465b0a3ae8c64f6],[SC=5.1.7]
  • Source tree:

    xilinx-ethash
    ├── CMakeLists.txt
    ├── README.md
    ├── test
    │   └── main.cpp <-- main program
    └── xleth
        ├── config
        │   ├── connectivity_u50.ini <-- U50 HBM settings
        │   └── xrt.ini
        ├── kernel
        │   ├── ethash-01112021.cl <-- new ethminer opencl kernel (Xilinx build failed)
        │   ├── ethash-08222020.cl <-- original ethminer opencl kernel (base)
        │   └── ethash.cl <-- from ethminer with minor modification
        ├── src
        │   ├── xleth.cpp <-- eth opencl library
        │   └── xleth.hpp <-- eth opencl header
        └── xclbin
            ├── ethash.hw.xclbin <-- binary stream used for U50
            └── ethash.sw_emu.xclbin  <-- binary stream used for software emulation
    

    Clone source:

    git clone --recursive https://github.com/Ed-Yang/xilinx-ethash.git

Questions

  • How comes running in Alveo U50 is slower than software emulation ?

    Summary:

    Cards DAG generation (epoch=0)
    Xilinx Alveo U50 sw_emu 588.30 seconds
    Xilinx Alveo U50 PCIe 1709.76 seconds
    AMD RX560 6.00 seconds

  • Does Xilinx's OpenCL support atomic_inc or alternative function ?

Build Xilinx binary stream

  • Setup build environment

    Open a terminal and run:

    source /tools/Xilinx/Vitis/2020.2/settings64.sh
    source /opt/xilinx/xrt/setup.sh
    export XILINX_VITIS=/tools/Xilinx/Vitis/2020.2
    export PATH=$PATH:/opt/xilinx/xrt/bin
    export XILINX_XRT=/opt/xilinx/xrt
  • Build binary stream for software emulation

    cd ./xleth
    make build TARGET=sw_emu DEVICE=xilinx_u50_gen3x16_xdma_201920_3
  • Build binary stream for U50

    cd ./xleth
    make build TARGET=hw DEVICE=xilinx_u50_gen3x16_xdma_201920_3

    Output binary stream will be copied to xclbin directory

Packages

OpenCL:

```shell
sudo apt install -y ocl-icd-opencl-dev opencl-headers gdb
```

CMake

```shell
# upgrade openssl
wget wget https://www.openssl.org/source/openssl-1.1.1j.tar.gz
tar xvf openssl-1.1.1j.tar.gz 
cd openssl-1.1.1j/
./config
make
make install

# upgrade CMake (need new openssl)
wget https://github.com/Kitware/CMake/releases/download/v3.19.5/cmake-3.19.5.tar.gz
tar xvf cmake-3.19.5.tar.gz
cd cmake-3.19.5
./bootstrap
make
sudo make install
```

Build host applicatopm

Build ethash library

Open a terminal with CMake version > 3.13.

```shell
mkdir -p ./ethash/build
cd ./ethash/build
cmake ..
make
```

Build application

```shell
mkdir -p ./build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Debug
make
```

Run application - Xilinx

  • Setup environment

    source /tools/Xilinx/Vitis/2020.2/settings64.sh
    source /opt/xilinx/xrt/setup.sh
    export XILINX_VITIS=/tools/Xilinx/Vitis/2020.2

    Usage:

    ./build/xleth <epoch> <Xilinx|AMD> <kernel-file> [quiet]

Run software emulation

  • Setup emulation mode

    export XCL_EMULATION_MODE=sw_emu
  • Generate emconfig.json

    The file "emconfig.json" must be located at the same directory as executable "xleth".

    cd ./build
    /tools/Xilinx/Vitis/2020.2/bin/emconfigutil -f xilinx_u50_gen3x16_xdma_201920_3

Run on software emulation

Run:

Difficulty: 1000000

```shell
./build/xleth 0 Xilinx ./xleth/xclbin/ethash.sw_emu.xclbin 
```

Output:

```shell
-----------------------------------------------
Loading OpenCL kernel ...
-----------------------------------------------
Got platform : Xilinx
Found Platform
Platform Name: Xilinx
Trying to program device xilinx_u50_gen3x16_xdma_201920_3
INFO: Reading ./xleth/xclbin/ethash.sw_emu.xclbin
Loading: './xleth/xclbin/ethash.sw_emu.xclbin'
Device program successful.
DEV: Global mem size  8 GB
DEV: Max alloc size   4096 MB
DEV: Max W Group size 4294967295
DEV: Max compute unit 2
-----------------------------------------------
Generating DAG ...
-----------------------------------------------
DAG: generating for epoch 0 ...
DAG: epoch 0 lightSize 16776896 dagSize 1073739904
DAG: item          0 chunk 1280000, took  43.83s
DAG: item    1280000 chunk 1280000, took  44.76s
DAG: item    2560000 chunk 1280000, took  44.80s
DAG: item    3840000 chunk 1280000, took  45.03s
DAG: item    5120000 chunk 1280000, took  43.59s
DAG: item    6400000 chunk 1280000, took  44.01s
DAG: item    7680000 chunk 1280000, took  45.99s
DAG: item    8960000 chunk 1280000, took  44.74s
DAG: item   10240000 chunk 1280000, took  43.54s
DAG: item   11520000 chunk 1280000, took  44.33s
DAG: item   12800000 chunk 1280000, took  46.63s
DAG: item   14080000 chunk 1280000, took  45.99s
DAG: item   15360000 chunk 1280000, took  45.53s
DAG: took 588.30 seconds.
-----------------------------------------------
Searching ...
-----------------------------------------------
seed     : 0000000000 00000000 00000000 00000000 00000000 00000000 00000000 000000
header   : 0000000000 00000000 00000000 00000000 00000000 00000000 00000000 000000
boundary : 0000002af3 1dc46118 73bf3f70 834acdae 9f0f4f53 4f5d6058 5a5f1c1a 3ced1b
Search: target 0x2af31dc461
Search: start nonce 0, hash count 0
Search: found, startNonce 0, gid 3664863, hashCount 0 abort 0
-----------------------------------------------
Check solution ...
-----------------------------------------------
Sol: nonce    : 3664863
Sol: mix_hash : 09f1a1567c a8f6fbbf 6e8c6793 a6474814 7e0d9998 e2e21821 2bb05bff 99360a
Sol: valid.
```

Run on Alveo U50

Run:

Difficulty: 1000000

```shell
./build/xleth 0 Xilinx ./xleth/xclbin/ethash.hw.xclbin
```

Output:

```shell
-----------------------------------------------
Loading OpenCL kernel ...
-----------------------------------------------
Got platform : Xilinx
Found Platform
Platform Name: Xilinx
Trying to program device xilinx_u50_gen3x16_xdma_201920_3
INFO: Reading ./xleth/xclbin/ethash.hw.xclbin
Loading: './xleth/xclbin/ethash.hw.xclbin'
Device program successful.
DEV: Global mem size  0 GB
DEV: Max alloc size   4096 MB
DEV: Max W Group size 4294967295
DEV: Max compute unit 2
-----------------------------------------------
Generating DAG ...
-----------------------------------------------
DAG: generating for epoch 0 ...
DAG: epoch 0 lightSize 16776896 dagSize 1073739904
DAG: item          0 chunk 1280000, took 130.49s
DAG: item    1280000 chunk 1280000, took 130.38s
DAG: item    2560000 chunk 1280000, took 130.39s
DAG: item    3840000 chunk 1280000, took 130.40s
DAG: item    5120000 chunk 1280000, took 130.40s
DAG: item    6400000 chunk 1280000, took 130.38s
DAG: item    7680000 chunk 1280000, took 130.35s
DAG: item    8960000 chunk 1280000, took 130.37s
DAG: item   10240000 chunk 1280000, took 130.38s
DAG: item   11520000 chunk 1280000, took 130.36s
DAG: item   12800000 chunk 1280000, took 130.39s
DAG: item   14080000 chunk 1280000, took 130.39s
DAG: item   15360000 chunk 1280000, took 130.41s
DAG: took 1709.76 seconds.
-----------------------------------------------
Searching ...
-----------------------------------------------
seed     : 0000000000 00000000 00000000 00000000 00000000 00000000 00000000 000000
header   : 0000000000 00000000 00000000 00000000 00000000 00000000 00000000 000000
boundary : 0000002af3 1dc46118 73bf3f70 834acdae 9f0f4f53 4f5d6058 5a5f1c1a 3ced1b
Search: target 0x2af31dc461
Search: start nonce 0, hash count 0
Search: found, startNonce 0, gid 3664863, hashCount 0 abort 0
-----------------------------------------------
Check solution ...
-----------------------------------------------
Sol: nonce    : 3664863
Sol: mix_hash : 09f1a1567c a8f6fbbf 6e8c6793 a6474814 7e0d9998 e2e21821 2bb05bff 99360a
Sol: valid.
```

Run on AMD RX560

Run:

Difficulty: 2000000

```shell
./build/xleth 0 AMD ./xleth/kernel/ethash.cl
```

Output:

```shell
-----------------------------------------------
Loading OpenCL kernel ...
-----------------------------------------------
Got platform : AMD Accelerated Parallel Processing
Found Platform
Platform Name: AMD Accelerated Parallel Processing
Trying to program device Baffin
Device program successful.
KNL: L_WORKSIZE 128
KNL: MULTIPLIER 65535
KNL: G_WORKSIZE 16384
KNL: FASTEXIT   1
DEV: Global mem size  3 GB
DEV: Max alloc size   3256 MB
DEV: Max W Group size 256
DEV: Max W Item size  1024/1024/1024
DEV: Max compute unit 14
-----------------------------------------------
Generating DAG ...
-----------------------------------------------
DAG: generating for epoch 0 ...
DAG: epoch 0 lightSize 16776896 dagSize 1073739904
DAG: item          0 chunk 1280000, took   0.70s
DAG: item    1280000 chunk 1280000, took   0.40s
DAG: item    2560000 chunk 1280000, took   0.40s
DAG: item    3840000 chunk 1280000, took   0.40s
DAG: item    5120000 chunk 1280000, took   0.40s
DAG: item    6400000 chunk 1280000, took   0.40s
DAG: item    7680000 chunk 1280000, took   0.40s
DAG: item    8960000 chunk 1280000, took   0.40s
DAG: item   10240000 chunk 1280000, took   0.40s
DAG: item   11520000 chunk 1280000, took   0.40s
DAG: item   12800000 chunk 1280000, took   0.40s
DAG: item   14080000 chunk 1280000, took   0.40s
DAG: item   15360000 chunk 1280000, took   0.40s
DAG: took   5.99 seconds.
-----------------------------------------------
Searching ...
-----------------------------------------------
seed     : 0000000000 00000000 00000000 00000000 00000000 00000000 00000000 000000
header   : 0000000000 00000000 00000000 00000000 00000000 00000000 00000000 000000
boundary : 0000001579 8ee2308c 39df9fb8 41a566d7 4f87a7a9 a7aeb02c 2d2f8e0d 1e768d
Search: target 0x15798ee230
Search: start nonce            0, hash count 65535
Search: start nonce      8388480, hash count 65535
Search: start nonce     16776960, hash count 65535
Search: start nonce     25165440, hash count 65535
Search: start nonce     33553920, hash count 65535
Search: start nonce     41942400, hash count 65535
Search: start nonce     50330880, hash count 65535
Search: start nonce     58719360, hash count 65535
Search: start nonce     67107840, hash count 65535
Search: start nonce     75496320, hash count 65535
Search: start nonce     83884800, hash count 65535
Search: start nonce     92273280, hash count 65535
Search: start nonce    100661760, hash count 65535
Search: start nonce    109050240, hash count 65535
Search: start nonce    117438720, hash count 65535
Search: start nonce    125827200, hash count 65535
Search: start nonce    134215680, hash count 65535
Search: start nonce    142604160, hash count 65535
Search: start nonce    150992640, hash count 65535
Search: start nonce    159381120, hash count 65535
Search: start nonce    167769600, hash count 65535
Search: start nonce    176158080, hash count 65535
Search: start nonce    184546560, hash count 65535
Search: start nonce    192935040, hash count 65535
Search: start nonce    201323520, hash count 17742

Search: found, startNonce 201323520, gid 2264112, hashCount 17742 abort 1
-----------------------------------------------
Check solution ...
-----------------------------------------------
Sol: nonce    : 203587632
Sol: mix_hash : 0c004dd83c 00b67765 a09bddb1 ecc14561 f006778b 85bb61f5 74fa6e7d ecd29b
Sol: valid.
Sol: Hash rate 10.47 Mh 
```

Reference

Xilinx

Ethash