ODROID-C2は64bit ARMの2GHzとRaspberry Pi 3とおなじarchだが、1.2GHzから2.0GHzと高速化されている。
それでいて$5値上げ程度と気持ち良いのだが、Ubuntu16.04となっていてBETAなので不安定、動かないとかソフトの問題が多い!
が、とりあえず簡易的にやってみる。
まずは基礎データは:
cat /proc/cpuinfo
Processor : AArch64 Processor rev 4 (aarch64)
processor : 0
processor : 1
processor : 2
processor : 3
Features : fp asimd crc32
CPU implementer : 0x41
CPU architecture: AArch64
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4
Hardware : ODROID-C2
Revision : 020b
となっていた。
Install and update
** sudo apt-get update && sudo apt-get upgrade && sudo apt-get dist-upgrade
これが一日くらいかかるので注意。
Install gfortran
** sudo apt-get install gfortran
Octaveでテスト
** sudo apt-get install octave
---
> n=1500 ; A=rand(n); B=rand(n);
> tic();C=A*B;t=toc(); GFLOPS=2*n^3/t*1e-9
GFLOPS = 4.5510
> sA=single(A); sB=single(B);
> tic();sC=sA*sB;t=toc(); GFLOPS=2*n^3/t*1e-9
GFLOPS = 10.594
OpenBLASのインストール
$ tar xvfz OpenBLAS-0.2.17.tar.gz
$ cd OpenBLAS-0.2.17
$ make FC=gfortran
...
...
問題なく出来た。
$ ./sgemm.goto 1500 2000 10
From : 1500 To : 2000 Step=10 : Trans=N
SIZE Flops Time
1500x1500 : 13617.90 MFlops 0.495671 sec
1510x1510 : 14057.08 MFlops 0.489853 sec
1520x1520 : 13608.31 MFlops 0.516127 sec
1530x1530 : 13866.39 MFlops 0.516584 sec
1540x1540 : 14051.03 MFlops 0.519857 sec
1550x1550 : 13958.81 MFlops 0.533552 sec
1560x1560 : 14249.55 MFlops 0.532847 sec
1570x1570 : 14530.63 MFlops 0.532653 sec
1580x1580 : 13905.12 MFlops 0.567318 sec
$ ./dgemm.goto 1000 2000 10
From : 1000 To : 2000 Step=10 : Trans=N
SIZE Flops Time
1000x1000 : 4380.98 MFlops 0.456519 sec
1010x1010 : 4524.06 MFlops 0.455476 sec
1020x1020 : 4487.76 MFlops 0.472934 sec
1030x1030 : 4500.23 MFlops 0.485632 sec
1040x1040 : 4593.74 MFlops 0.489738 sec
1050x1050 : 4563.79 MFlops 0.507309 sec
1060x1060 : 4423.88 MFlops 0.538449 sec
1070x1070 : 4561.87 MFlops 0.537079 sec
$ ./dlinpack.goto 1500 2000 10
From : 1500 To : 2000 Step = 10
SIZE Residual Decompose Solve Total
1500 : 3.803402e-12 3943.28 MFlops 127.27 MFlops 3720.60 MFlops
1510 : 1.601008e-11 3971.70 MFlops 128.84 MFlops 3749.93 MFlops
1520 : 2.809641e-12 3978.56 MFlops 127.04 MFlops 3754.36 MFlops
1530 : 9.856560e-13 3922.62 MFlops 128.14 MFlops 3707.76 MFlops
1540 : 7.519985e-12 3964.65 MFlops 128.08 MFlops 3746.46 MFlops
$ ./slinpack.goto 1500 2000 10
From : 1500 To : 2000 Step = 10
SIZE Residual Decompose Solve Total
1500 : 9.403229e-04 8399.94 MFlops 201.15 MFlops 7767.98 MFlops
1510 : 1.331329e-03 8476.66 MFlops 202.69 MFlops 7841.94 MFlops
1520 : 1.115453e-02 8669.94 MFlops 202.16 MFlops 8009.13 MFlops
1530 : 1.382232e-03 8429.51 MFlops 204.52 MFlops 7814.49 MFlops
1540 : 1.394093e-03 8497.07 MFlops 204.12 MFlops 7875.02 MFlops
1550 : 8.078814e-04 8635.82 MFlops 202.12 MFlops 7991.66 MFlops
1560 : 4.892349e-04 8600.40 MFlops 204.68 MFlops 7972.69 MFlops
* AArch64からはNEONがadvanced NEONになっており倍精度にも対応してるはずだが
cpuid_arm64.c的には対応してない。無理やりコンパイルしてもむしろ遅くなった。
$ ./dgemm.goto 1500 2000 10
From : 1500 To : 2000 Step=10 : Trans=N
SIZE Flops Time
1500x1500 : 3007.88 MFlops 2.244102 sec
1510x1510 : 3019.24 MFlops 2.280677 sec
1520x1520 : 3024.58 MFlops 2.322181 sec
1530x1530 : 2992.42 MFlops 2.393766 sec
$ ./sgemm.goto 1500 2000 10
From : 1500 To : 2000 Step=10 : Trans=N
SIZE Flops Time
1500x1500 : 5387.23 MFlops 1.252962 sec
1510x1510 : 5441.25 MFlops 1.265501 sec
1520x1520 : 5420.60 MFlops 1.295727 sec
1530x1530 : 5350.70 MFlops 1.338731 sec
まとめ
* Ubuntu16.04 BETA付属OpenBLASでは倍精度4.55GFlops、自分でビルドしたものは 4.60GFlops
* Ubuntu16.04 BETA付属OpenBLASでは単精度10.6GFlops、自分でビルドしたものは 14.5GFlops
* OpenBLASでは、そのままではadvanced NEONには対応してない。Cortex A57は対応するが、
Cortex A53では対応してない。両者の命令セットは同じだから、基本的には動くが、むしろ遅くなる。