Skip to content

Instantly share code, notes, and snippets.


mli/ Secret

Last active May 27, 2020 22:18
Show Gist options
  • Save mli/585aed2cec0b5178b1a510f9f236afa2 to your computer and use it in GitHub Desktop.
Save mli/585aed2cec0b5178b1a510f9f236afa2 to your computer and use it in GitHub Desktop.


Setup OS

I bought the basic Firefly RK3399 from Amazon for $130. It has 2GB RAM and 16 GB eMMC. There is an advanced version with 4GB RAM, but cost more $199.

The default OS doesn't have OpenCL support. The easy way is downloading an image with OpenCL, namely pre-installed and then flash into the board.

  1. Download a Ubuntu 16.04 image from Google Drive.
  2. Extract the download 7z file to get a 2.2 GB image Firefly-RK3399_xubuntu1604_201711301130.img.
  3. Flash the image by following this document. (Username firefly, password: firefly)

In particular, if you have a Linux desktop, then we can use the upgrade_tool_v1_26.tar provided in this repo. (Note: : the other two linux tools rkflashkit and rkflashtool do not support flash the whole image. )

  1. Cut off the power of the board

  2. Connect it to the linux host machine with provided usb cable, and use the provided type-c converter to connect to the board

  3. Press the RECOVERY key, next power on, and then release the key after around two second. rk3399

  4. Install upgrade_tool by:

    tar -zxvf upgrade_tool_v1_26.tar
    sudo chown root:root upgrade_tool
    sudo chmod +x upgrade_tool
    sudo cp upgrade_tool /usr/local/bin

    Then run upgrade_tool you will see the board is connected

  5. Flash the image by

    sudo upgrade_tool uf Firefly-RK3399_xubuntu1604_201711301130.img

Reboot the board then you will login into the Ubuntu automatically.

But note that this image only ships a, if you want to compile OpenCL program on the board, you need to install the header files, which is provided in opencl-header.tar.gz, just extract it into a proper directory such as

sudo tar -zxvf opencl-header.tar.gz -C /usr/include/

Sanity Check with clpeak

We can check if the opencl driver works properly by using the benchmark tool clpeak

sudo apt-get update && sudo apt-get install cmake git
git clone && cd clpeak
cmake . -DCMAKE_CXX_COMPILER=g++ && make

If everything works well, then you probably will see the following outputs:

Platform: ARM Platform
  Device: Mali-T860
    Driver version  : 1.2 (Linux ARM)
    Compute units   : 4
    Clock frequency : 200 MHz

    Global memory bandwidth (GBPS)
      float   : 3.17
      float2  : 6.07
      float4  : 7.88
      float8  : 6.55
      float16 : 6.26

    Single-precision compute (GFLOPS)
      float   : 25.09
      float2  : 45.51
      float4  : 46.22
      float8  : 41.67
      float16 : 46.40

    half-precision compute (GFLOPS)
      half   : 23.11
      half2  : 50.19
      half4  : 98.30
      half8  : 93.48
      half16 : 93.94

    Double-precision compute (GFLOPS)
      double   : 3.59
      double2  : 3.30
      double4  : 20.97
      double8  : 20.65
      double16 : 20.39

    Integer compute (GIOPS)
      int   : 20.15
      int2  : 49.64
      int4  : 47.12
      int8  : 49.17
      int16 : 41.47

    Transfer bandwidth (GBPS)
      enqueueWriteBuffer         : 4.61
      enqueueReadBuffer          : 2.60
      enqueueMapBuffer(for read) : 475.11
        memcpy from mapped ptr   : 2.50
      enqueueUnmap(after write)  : 2790.39
        memcpy to mapped ptr     : 1.92

    Kernel launch latency : 190.64 us

Run NNVM Compiler

Follow the cross complication tutorial to compile the runtime on RK3399, and local TVM.

Follow deploy pretrained model on Mali to run Resnet-18 on RK3399. To benchmark the performance, we can append the following code block:

import time
ntimes = 10
tic = time.time()
for _ in range(ntimes):
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment