中田真秀(なかたまほ)のブログ

研究について、日常について、その他。

OpenBLAS, Raspberry Pi 2, 3, ODROID-C2比較まとめ

2016-04-02 18:42:43 | 日記
まとめ

  • OpenBLASは現在vfpv3しか使わない(advanced NEONはcortex a57以降)。
  • いずれにせよ、Raspberry Pi3は32bit OSなのでadvanced NEONが使えない
  • Raspberry Pi2, 3はdgemm, sgemmはほぼおなじパフォーマンスで、それぞれ1.6GFlops, 4.45GFlops程度。ただVideoCore IV (理論性能24GFLops), NEONは不使用なので、これを加えると全然変わってくる。
  • ODROID-C2が圧倒的に高速。こちらはCortex A53 (ARM8v-A) dgemm, sgemmはそれぞれ4.6GFlops, 14.5GFlops.advanced NEONおよびMali-450GPU(理論性能14.6GFlops/core, 何コア搭載かは不明)は不使用。


もう少し頑張ればまた全く違う結果が得られるんだろうなぁと思われる。ただ、ハード的にはODROID-C2が随分優っている。

Raspberry Pi 3でOpenBLASの測定:簡易編

2016-04-02 18:36:51 | 日記
Raspberry Pi 3もODROID-C2と同じCPUだが、OSは32bitモードで動くため、advanced NEONは使えない。
このためvfp3のみに対応したコードを動かすことになる。念のためprocinfoをつけておく。
processor       : 0
model name      : ARMv7 Processor rev 4 (v7l)
BogoMIPS        : 38.40
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

さてoctaveで簡易的に比較してみる。
倍精度の場合

octave:1> n=1500 ; A=rand(n); B=rand(n);
octave:2> tic();C=A*B;t=toc(); GFLOPS=2*n^3/t*1e-9
GFLOPS = 1.6548

意外に遅い。Pi2とほぼ同じであった。
単精度の場合

octave:1> n=2000 ; A=rand(n); B=rand(n);
octave:2> sA=single(A); sB=single(B);
octave:3> tic();sC=sA*sB;t=toc(); GFLOPS=2*n^3/t*1e-9
GFLOPS = 4.2931
octave:4> tic();sC=sA*sB;t=toc(); GFLOPS=2*n^3/t*1e-9
GFLOPS = 4.4607


こちらもあまりRaspberry Pi 2と変化なし。

ODROID-C2でOpenBLASの測定:簡易編

2016-04-02 13:01:52 | 日記
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では対応してない。両者の命令セットは同じだから、基本的には動くが、むしろ遅くなる。