1. イメージファイルの準備
Raspberry pi 3b+を64bit OSで動作させた場合、32bit OSとの性能に差が出るのかな?という疑問からベンチマークソフトを使用して性能を数値化、比較します。
今回はubuntu 18.04を使用します。
ubuntu wikiより2つのイメージを用意してunix benchをインストールする流れ。
1). armhf (32bit版)
ubuntu-18.04.2-preinstalled-server-armhf+raspi3.img.xz
2). arm64 (64bit版)
ubuntu-18.04.2-preinstalled-server-arm64+raspi3.img.xz
2. ubuntu18.04 (32bit)
まずarmhf (32bit版)を解凍したイメージファイルをWin32 Disk Imagerを使ってMicro SDカードに書き込みます。
Wifi設定
apt update
apt upgrade
を行った後に、Kernelのビット数を確認。
$ getconf LONG_BIT
32
期待通り32ビットでKernelが動作しているようです。
使用するベンチマークソフトはunix bench、~/byte-unixbench/UnixBench
以下にあるREADMEを参考に実行します。
$ git clone https://github.com/kdlucas/byte-unixbench.git
$ cd ./byte-unixbench/UnixBench
$ make
$ ./Run
途中、gccとmakeがインストールされていなかったためsudo apt install gcc make
を実行しています。
試験後はresults
フォルダにログがあるので3回$ ./Run
した結果を平均してみました。
table 2-1 ubuntu18.04 (32bit)
Test | Score | Unit | Index |
---|---|---|---|
Dhrystone 2 using register variables | 24,926,396.5 | lps | 2,135.9 |
Double-Precision Whetstone | 4,554.6 | MWIPS | 828.1 |
Execl Throughput | 2,493.6 | lps | 579.9 |
File Copy 1024 bufsize 2000 maxblocks | 242,929.9 | KBps | 613.5 |
File Copy 256 bufsize 500 maxblocks | 65,960.3 | KBps | 398.5 |
File Copy 4096 bufsize 8000 maxblocks | 553,033.8 | KBps | 953.5 |
Pipe Throughput | 972,812.5 | lps | 782.0 |
Pipe-based Context Switching | 177,506.3 | lps | 443.8 |
Process Creation | 5,494.6 | lps | 436.1 |
Shell Scripts (1 concurrent) | 4,716.2 | lpm | 1,112.3 |
Shell Scripts (8 concurrent) | 607.1 | lpm | 1,011.8 |
System Call Overhead | 1,940,369.4 | lps | 1,293.6 |
System Benchmarks Index Score: | 782.3 |
3. ubuntu18.04 (64bit)
続いてarm64 (64bit版)、32bit版同様に64bitでKernelが動作しているかを確認します。
$ cat /boot/firmware/config.txt
enable_uart=1
kernel=kernel8.bin
device_tree_address=0x03000000
dtparam=i2c_arm=on
dtparam=spi=on
arm_64bit=1 ← 64bit設定の確認
$ getconf LONG_BIT
64
Wifi設定など32bit版の時と同様にセットアップを完了させた後、Unix Benchをgit clone, makeして実行します。
table 3-1 ubuntu18.04 (64bit)
Test | Score | Unit | Index |
---|---|---|---|
Dhrystone 2 using register variables | 29,659,405.9 | lps | 2528.0 |
Double-Precision Whetstone | 5,346.0 | MWIPS | 969.8 |
Execl Throughput | 2,313.4 | lps | 532.7 |
File Copy 1024 bufsize 2000 maxblocks | 262,512.9 | KBps | 653.5 |
File Copy 256 bufsize 500 maxblocks | 72,269.9 | KBps | 432.6 |
File Copy 4096 bufsize 8000 maxblocks | 587,768.7 | KBps | 1004.8 |
Pipe Throughput | 1,122,159.4 | lps | 899.0 |
Pipe-based Context Switching | 168,999.8 | lps | 422.4 |
Process Creation | 5,454.6 | lps | 434.4 |
Shell Scripts (1 concurrent) | 4,437.5 | lpm | 1045.9 |
Shell Scripts (8 concurrent) | 573.8 | lpm | 954.0 |
System Call Overhead | 1,785,716.7 | lps | 1189.8 |
System Benchmarks Index Score: | 803.7 |
4. 結果
整数演算処理、浮動小数演算処理は64bitで動作していた時が速く (Dhrystone2, Double-Precision)、メモリ幅も大きいのでファイルコピー(キャッシング?)の効率もよくなっているようです。
~~ただし、使用するメモリ量も多くなったのでシェルスクリプトやシステムコールの実行速度で32bitに逆展されているようです。スワップメモリを設定することで改善するのか?これは宿題ですね。~~訂正、スワップメモリを使用するほどの処理ではありませんでした。
64bit版のシェルの処理速度が最適化されていないのかな。
Figure 4-1にベンチマークの比較グラフを記載します。
Figure 4-1 UnixBench 32bit, 64bit比較
