OpenBLAS-0.2.17をビルド。
Swapを加える。ないとメモリ使い果たして固まる。
展開
patchあて(ほとんど無意味)
ビルド
(適宜固まるので電源抜き差しなど対応すること)
測定
800MFlops超えたら500MFlopsまでだんだん遅くなった
倍精度1.8GFlopsとなって若干良くなった。
たぶんvfpv4のみ使ってるっぽい。
ソースを見ると、kernel/arm/KERNEL.ARMV7が使われてることで、vfpしか使ってない。vfpv4か3かは違いがわからん
あとNEONは使ってません...ということがわかった。
https://community.arm.com/groups/android-community/blog/2015/03/27/arm-neon-programming-quick-reference
によるとARMv7-A NEONはdoubleはサポートされてない。
まとめ
Swapを加える。ないとメモリ使い果たして固まる。
$ make FC=gfortran $ sudo dd if=/dev/zero of=/swap bs=1M count=2048 $ sudo chmod 600 /swap $ sudo mkswap /swap $ sudo swapon /swap $ sudo apt-get install gfortran
展開
$ tar xvfz OpenBLAS-0.2.17.tar.gz
patchあて(ほとんど無意味)
--- Makefile.arm~ 2016-03-21 09:52:15.000000000 +0900
+++ Makefile.arm 2016-03-31 11:47:16.822314531 +0900
@@ -14,8 +14,8 @@
CCOMMON_OPT += -marm -mfpu=neon -mfloat-abi=hard -march=armv7-a -Wl,--no-warn-mismatch
FCOMMON_OPT += -marm -mfpu=neon -mfloat-abi=hard -march=armv7-a -Wl,--no-warn-mismatch
else
-CCOMMON_OPT += -marm -mfpu=vfpv3 -mfloat-abi=hard -march=armv7-a
-FCOMMON_OPT += -marm -mfpu=vfpv3 -mfloat-abi=hard -march=armv7-a
+CCOMMON_OPT += -marm -mfpu=vfpv4 -mfpu=neon -mfloat-abi=hard -march=armv7-a
+FCOMMON_OPT += -marm -mfpu=vfpv4 -mfpu=neon -mfloat-abi=hard -march=armv7-a
endif
endif
ビルド
$ make FC=gfortran
$ cd benchmark ; make
(適宜固まるので電源抜き差しなど対応すること)
測定
$ ./sgemm.goto 1500 2000
From : 1500 To : 2000 Step=1 : Trans=N
SIZE Flops Time
1500x1500 : 4461.05 MFlops 1.513098 sec
1501x1501 : 4474.39 MFlops 1.511606 sec
1502x1502 : 4462.28 MFlops 1.518739 sec
1503x1503 : 4474.17 MFlops 1.517730 sec
1504x1504 : 4500.73 MFlops 1.511786 sec
1505x1505 : 4462.66 MFlops 1.527727 sec
1506x1506 : 4497.68 MFlops 1.518854 sec
$ ./slinpack.goto 1500 2000
From : 1500 To : 2000 Step = 1
SIZE Residual Decompose Solve Total
1500 : 5.394816e-04 3558.81 MFlops 161.34 MFlops 3415.26 MFlops
1501 : 2.735615e-03 3558.99 MFlops 163.17 MFlops 3417.14 MFlops
1502 : 2.254963e-03 3551.39 MFlops 166.34 MFlops 3412.94 MFlops
1503 : 9.852052e-04 3545.54 MFlops 163.44 MFlops 3405.17 MFlops
1504 : 5.353689e-04 3541.81 MFlops 163.39 MFlops 3401.78 MFlops
1505 : 5.227327e-04 3551.44 MFlops 173.23 MFlops 3418.80 MFlops
1506 : 5.793571e-04 3576.60 MFlops 186.54 MFlops 3451.88 MFlops
From : 10000 To : 200000 Step = 100 Inc_x = 1 Inc_y = 1 Loops = 1
SIZE Flops
10000 : 222.22 MFlops
10100 : 651.61 MFlops
10200 : 755.56 MFlops
10300 : 710.34 MFlops
10400 : 832.00 MFlops
10500 : 724.14 MFlops
10600 : 815.38 MFlops
10700 : 737.93 MFlops
10800 : 800.00 MFlops
10900 : 751.72 MFlops
11000 : 785.71 MFlops
11100 : 765.52 MFlops
11200 : 800.00 MFlops
...
91400 : 520.80 MFlops
91500 : 539.82 MFlops
91600 : 483.38 MFlops
91700 : 536.26 MFlops
91800 : 514.29 MFlops
91900 : 543.79 MFlops
800MFlops超えたら500MFlopsまでだんだん遅くなった
$ ./dgemm.goto 1000 1500 10
From : 1000 To : 1500 Step=10 : Trans=N
SIZE Flops Time
1000x1000 : 1794.16 MFlops 1.114725 sec
1010x1010 : 1808.33 MFlops 1.139505 sec
1020x1020 : 1793.40 MFlops 1.183461 sec
1030x1030 : 1818.51 MFlops 1.201786 sec
1040x1040 : 1817.89 MFlops 1.237546 sec
1050x1050 : 1820.19 MFlops 1.271981 sec
1060x1060 : 1829.72 MFlops 1.301855 sec
1070x1070 : 1819.74 MFlops 1.346393 sec
1080x1080 : 1806.13 MFlops 1.394932 sec
1090x1090 : 1837.65 MFlops 1.409439 sec
1100x1100 : 1817.40 MFlops 1.464730 sec
倍精度1.8GFlopsとなって若干良くなった。
たぶんvfpv4のみ使ってるっぽい。
$ ./dlinpack.goto 1000 1500 10
From : 1000 To : 1500 Step = 10
SIZE Residual Decompose Solve Total
1000 : 8.907319e-13 1512.48 MFlops 85.28 MFlops 1440.38 MFlops
1010 : 2.419398e-12 1536.27 MFlops 89.57 MFlops 1466.14 MFlops
1020 : 5.098300e-11 1529.05 MFlops 91.08 MFlops 1461.39 MFlops
1030 : 9.028334e-13 1531.56 MFlops 90.00 MFlops 1463.48 MFlops
1040 : 1.335487e-12 1541.49 MFlops 86.17 MFlops 1470.07 MFlops
1050 : 6.100676e-13 1547.97 MFlops 88.97 MFlops 1478.87 MFlops
1060 : 1.242562e-12 1551.80 MFlops 90.47 MFlops 1484.14 MFlops
1070 : 1.787015e-12 1561.29 MFlops 88.33 MFlops 1491.74 MFlops
From : 10000 To : 200000 Step = 100 Inc_x = 1 Inc_y = 1 Loops = 1
SIZE Flops
10000 : 139.86 MFlops
10100 : 492.68 MFlops
10200 : 523.08 MFlops
10300 : 528.21 MFlops
10400 : 547.37 MFlops
10500 : 552.63 MFlops
10600 : 557.89 MFlops
10700 : 548.72 MFlops
10800 : 553.85 MFlops
10900 : 545.00 MFlops
11000 : 550.00 MFlops
11100 : 555.00 MFlops
11200 : 560.00 MFlops
11300 : 538.10 MFlops
11400 : 570.00 MFlops
11500 : 560.98 MFlops
11600 : 565.85 MFlops
11700 : 557.14 MFlops
...
87700 : 166.73 MFlops
87800 : 168.20 MFlops
87900 : 168.07 MFlops
88000 : 187.63 MFlops
88100 : 163.75 MFlops
ソースを見ると、kernel/arm/KERNEL.ARMV7が使われてることで、vfpしか使ってない。vfpv4か3かは違いがわからん
あとNEONは使ってません...ということがわかった。
https://community.arm.com/groups/android-community/blog/2015/03/27/arm-neon-programming-quick-reference
によるとARMv7-A NEONはdoubleはサポートされてない。
まとめ
- OpenBLASはvfpに対応していてそこそこ高速。倍精度では多分限界近い1.8GFlopsを出す。
- gemmはvfpのソースしかないので、多分上のパッチはgcc, gfortranでコンパイルされるところのみ意味があると思われる。
- 単精度もvfpにのみ対応。NEONに対応させると更に7.2GFlops出せる。さらにVideoCore IVだと24GFlops出せるはず。ということで、4+7+24=35GFlopsが限界??ちょいわかりませんが。
- Swapは足すこと。足してもめもりたりなさそうなところはある。