LuckfoxPicoMaxでncnnをクロスコンパイルしてbenckmarkを実行する手順


## 目的

PC(Ubuntu)にクロスコンパイル環境を構築して、ディープラーニングフレームワークのncnnとベンチマークソフトウェアのbenchmarkビルドし、LuckfoxPicoMaxでncnn benchmarkを実行します。

https://github.com/nnn112358/ncnn_benchmark_test

また、こちらのリポジトリで、これまでにCoreMP135、Raspberry Pi Zero 2 W、M5Stack_UnitV2、LicheeNano RV、Luckfox Pico Maxでのncnn benchmarkを比較した結果を公開しています。



## PC環境
まず以下のバージョンのUbuntuをインストールしたPC環境で、クロスコンパイル環境を構築します。

```
Ubuntu 22.04.3 LTS(x64)
```

## コンパイルにツールチェインのインストール

 コンパイルに必要なツールチェインを含むパッケージをaptからインストールします
 
```
$ sudo apt install crossbuild-essential-armhf crossbuild-essential-arm64
```


以下のコマンドを実行して、コンパイラのバージョン情報が出てれくれば、ツールチェインのインストールが完了です。

```
$ arm-linux-gnueabihf-g++ -v
Using built-in specs.
COLLECT_GCC=arm-linux-gnueabihf-g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/arm-linux-gnueabihf/11/lto-wrapper
Target: arm-linux-gnueabihf
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04)
```

## ncnnのインストール
ncnnは、Tencentが開発しているモバイルプラットフォーム向けに最適化された高性能なニューラルネットワーク推論コンピューティングフレームワークです。

このシェルスクリプトで、ARMプロセッサ向けにncnnライブラリをgitからクローン、ビルド、そしてインストールします。

```
$ git clone https://github.com/Tencent/ncnn.git -b 20240410 --depth 1 
$ cd ncnn/
$ cmake -B build/arm_luckfox -DCMAKE_TOOLCHAIN_FILE=./toolchains/arm-linux-gnueabihf.toolchain.cmake -DNCNN_SIMPLEOCV=ON -DCMAKE_BUILD_TYPE=Release -DNCNN_VULKAN=OFF -DNCNN_BUILD_EXAMPLES=OFF .
$ cmake --build build/arm_luckfox &&  cmake --install build/arm_luckfox --prefix install/arm_luckfox
```

## ncnn benckmarkのインストール

ncnnディレクトリ内でbenckmarkのファイルを整理し、それをzip圧縮します。

```
$ cd ncnn
$ mkdir install/arm_luckfox/benchmark
$ cp ./build/arm_luckfox/benchmark/benchncnn ./install/arm_luckfox/benchmark
$ cp ./benchmark/*.param ./install/arm_luckfox/benchmark
$ zip -r ./install/arm_coremp135/arm_luckfox_ncnn_benchmark.zip ./install/arm_luckfox/benchmark

```

## LuckfoxPicoMaxでのベンチマークの実行

zipファイルをLuckfoxPicoMaxにscpでコピー、LuckfoxPicoMaxでncnn benchmarkを実行します。


```
# unzip arm_luckfox_ncnn_benchmark.zip 
# cd benchmark
# ./benchncnn 4 1 0 -1 1
loop_count = 4
num_threads = 1
powersave = 0
gpu_device = -1
cooling_down = 1
        squeezenet  min =  459.52  max =  460.33  avg =  459.80
     squeezenet_int8  min =  309.75  max =  310.10  avg =  309.92
           mobilenet  min =  797.15  max =  797.50  avg =  797.37
      mobilenet_int8  min =  414.08  max =  414.60  avg =  414.35
        mobilenet_v2  min =  517.26  max =  518.28  avg =  517.69
        mobilenet_v3  min =  422.17  max =  422.56  avg =  422.37
          shufflenet  min =  275.52  max =  276.03  avg =  275.78
       shufflenet_v2  min =  247.08  max =  247.42  avg =  247.29
             mnasnet  min =  514.06  max =  514.51  avg =  514.22
     proxylessnasnet  min =  590.52  max =  590.94  avg =  590.71
     efficientnet_b0  min =  873.99  max =  874.59  avg =  874.19
   efficientnetv2_b0  min = 1028.21  max = 1029.42  avg = 1028.89
        regnety_400m  min =  628.44  max =  628.85  avg =  628.62
           blazeface  min =   73.65  max =   74.32  avg =   74.12
           googlenet  min = 1477.98  max = 1479.47  avg = 1478.75
      googlenet_int8  min =  947.31  max =  949.72  avg =  948.40
Killed

```

LuckfoxPicoMaxでncnnをクロスコンパイルしてbenckmarkを実行することができました。


## 参考資料

https://github.com/nnn112358/ncnn_benchmark_test

https://qiita.com/nnn112358/items/5b978464b005e7209fd8

https://qiita.com/nnn112358/items/5cfc32fd6cd1c8f4fe47

https://qiita.com/nnn112358/items/a4e262efd91641684402

https://qiita.com/nnn112358/items/67847f6779a3deadd5d4

https://qiita.com/nnn112358/items/25f2e08b00d3ca360e97