ElixirでIoT#1.3.2：プロセッサコアの動作周波数を揃えて比較評価してみた

この記事は「[fukuoka.ex x ザキ研 Advent Calendar 2017](https://adventar.org/calendars/2873)」の7日目です．

昨日は @kobatako さんの「[GraphQL for Elixir#1 基本的な実装について考える](https://qiita.com/kobatako/items/df18a99b8601c9a426ad)」 でした．

# はじめに

どうもこんにちは．
[fukuoka.ex](https://fukuokaex.connpass.com/)という技術コミュティにて，**ElixirをIoTボードで動かしたらどうなんの？**というIoT芸を披露しております．

[これまでの連載記事](https://qiita.com/takasehideki/items/8f43f1853ce88cbbe82e#elixirでiot1iotボード上でのelixirphoenix環境構築と性能評価篇)では，IoTボード上でElixirが実行できる環境を構築し，それぞれの性能をベンチマークアプリで評価してきました．
　|> [ElixirでIoT#1.0：IoTボードへのLinux環境の準備](https://qiita.com/takasehideki/items/9e3db412a40659233384)
　|> [ElixirでIoT#1.1：IoTボードへのElixir環境の構築とEEloTツールキットの紹介](https://qiita.com/takasehideki/items/fc570ae92a895caed213)
　|> [ElixirでIoT#1.2：いろいろ分かるベンチマークを整備してみる](https://qiita.com/takasehideki/items/e1dcb4058c7d0b51d554)
　|> [ElixirでIoT#1.3：IoTボードで動いた！Phoenixが立った！性能評価と考察](https://qiita.com/takasehideki/items/0aa644639f81c2ad0bbc)
　　|> [ElixirでIoT#1.3.1：ベンチマークのパラメータを振って性能評価してみた
](https://qiita.com/takasehideki/items/cb2985206df388384ec5)

これまでの性能評価を，下記のようにまとめました．

- IoTボードでもElixirは動く！Phoenixだって立つ！！
- Elixir並列処理はすごい！マイクロアーキよりコア数！！
    - IoTボードでも高性能なものをドンと置くよりもコアをズラッと並べるほうが有利！
    - XU3/A15は最大2.0GHzなのも効いている？
- サーバ性能はネットワーク接続方法も大事なのかも？
    - Ethernet接続で対決させたら違う傾向になるかも
- ZYBOは健闘はしたものの，，，FPGA活用に期待しましょう
- なお消費電力は？？
    - ZYBO << XU3 < RPi3 <<<(超えられない壁)<<< Mac
- [EEloT](https://github.com/takasehideki/EEloT)を使えば性能の比較評価もお手のもの
- EEloTベンチマークアプリのパラメータを振って性能評価してみました
    - パラメータにうまく比例した性能を発揮！
    - コア数についての並列性能もお見事！でもSoCアーキには要注意！？

今回（と前回）は，[連載記事#1.3](https://qiita.com/takasehideki/items/0aa644639f81c2ad0bbc)で実施した評価実験をさらに深掘りしてます．
IoTボードに搭載されているプロセッサコアの動作周波数を揃えてみたらどうなるか？を性能評価してみたいと思います．

# コアの動作周波数の設定方法

## 動的電圧・周波数制御とは？

コンピュータシステムにおけるプロセッサの動的な消費エネルギー $E$ は，その動作周波数 $f$ と電源電圧 $V_{dd}$ の2乗に比例します．
**動的電圧・周波数制御（DVFS: Dynamic Voltage/Frequency Scaling）**とは，OSによるコンピュータシステムの省エネルギー化を実現する技術です．時間の余裕がある場合は，実行時間 $T$ を大きくしてでも周波数を落として低い電圧に設定してゆっくり動かすことで，プロセッサコアの省エネルギー化を達成します．
下記の図のように，よくウサギとカメの競争に例えることができます:runner:

![image.png](https://qiita-image-store.s3.amazonaws.com/0/240349/e4f6d97f-d0a0-fc05-9a67-56be793c3340.png)

DVFSは，電力制約の厳しい組込みシステムでもよく使用されている技術です．
汎用PCでも最近のプロセッサでは当たり前のように実装されており，Linuxでは[CPUfreq governor](https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt)と呼ばれるカーネルモジュールが搭載されています．

[連載記事#1.0の表](https://qiita.com/takasehideki/items/9e3db412a40659233384#iotボードの選定)の通り，ラズパイ3Bは1.2GB，ODROID-XU3は2.0GHz/1.4GHzと爆速だけどもZYBOは650MHzでしか動作しません．今回はラズパイ3BとODROID-XU3の周波数を落としてやって，ZYBOとフェアな評価をしたらどうなるの？というのをやるわけです．

## ラズパイ3Bでの設定方法

ラズパイ3Bでは600MHzと1.2GHzの２つの周波数が設定できます．動作周波数の設定には`cpufrequtils`パッケージを用います．また，`userspace`というユーザが任意に周波数を指定できるgovernor動作ポリシーが実装されています．RaspbianでもUbuntuMATEでも同じです．
詳しい説明は[こちらの記事](http://my-web-site.iobb.net/~yuki/2017-12/raspberry-pi/cpufreq/)をご参照ください．

まずは`cpufrequtils`パッケージのインストール方法です．

```shell-session
$ sudo apt-get install cpufrequtils
```

`cpufreq-set`でgovernorと周波数を設定します．中身では`/sys/devices`のモジュールを叩きに行きますので，sudo権限で実行する必要があります．

```shell-session
$ sudo cpufreq-set -g userspace 
$ sudo cpufreq-set -f 600000
```

これによってラズパイ3BのCortex-A53は常に600MHzの周波数で動作します．

## ODROID-XU3での設定方法

ODROID-XU3ではCortex-A7が200MHzから1.4GHzまで，Cortex-A15が200MHzから2.0GHzまでの100MHz刻みで，動作周波数を設定できます．Cortex-A7とCortex-A15は４コアずつ持っていて，それぞれのコアはクラスタ化されていてクラスタ単位で周波数が設定されています．（A7がcpu0-3，A15がcpu4-7）

ODROID-XU3では`userspace`が提供されていないので，デバイスを直接叩いてそれぞれのクラスタの最大の動作周波数を設定することにします．

```shell-session
$ sudo echo 600000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
$ sudo echo 600000 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_max_freq
```


これによってODROID-XU3のCortex-A7とA15の最大周波数が600MHzに設定されます．

# 使用したベンチマークアプリと前回の結果

[#1.3.1](https://qiita.com/takasehideki/items/cb2985206df388384ec5)と同様に，下記の３種類を使います．

- [leibniz_formula.ex](https://github.com/takasehideki/EEloT/blob/master/leibniz_formula.ex)：ライプニッツ級数を用いた円周率の計算
    - 小数点演算の性能を評価できる
    - 和の上限は10^8とする
- [fibonacci_simple.ex](https://github.com/takasehideki/EEloT/blob/master/fibonacci_simple.ex)：フィボナッチ数列計算のシングルプロセス版
    - 整数演算およびスタック消費時の性能を評価できる
    - 50_000までの数列を計算する
- [fibonacci_process.ex](https://github.com/takasehideki/EEloT/blob/master/fibonacci_process.ex)：フィボナッチ数列計算のマルチプロセス版
    - 並列処理時の性能を評価できる
    - 37までの数列を6個同時に，10プロセス並列で計算する

[#1.3](https://qiita.com/takasehideki/items/0aa644639f81c2ad0bbc)における，周波数設定を行わない（最大周波数で動作する場合）の結果を再掲します．ZYBOでは`fibonacci_simple`のパラメータが`100_000`だとheapメモリ不足のエラーになるので，この設定値は`50_000`にしてあります．

表中の単位は秒です．

|Board|OS|leibniz_formula|fibonacci_simple|fibonacci_process|
|:---|:---|---:|---:|---:|
|RaspberryPi3B|Raspbian| 114.470 | 1.076 | 14.474 |
| |Ubuntu| 118.107 | 1.223 | 15.888 |
|ODROID-XU3|Ubuntu| 48.475 | 1.471 | 6.943 |
|ZYBO|Ubuntu| 161.342 | 2.957 | 41.789 |

# さて今回の比較結果です！

前置きがとっても長くなりましたが，今回の比較結果です！
ラズパイとODROID-XU3は600MHz，ZYBOは650MHzで動かした結果です．

|Board|OS|leibniz_formula|fibonacci_simple|fibonacci_process|
|:---|:---|---:|---:|---:|
|RaspberryPi3B|Raspbian| 226.617 | 2.478 | 28.906 |
| |Ubuntu| 240.612 | 2.723 | 31.856 |
|ODROID-XU3|Ubuntu| 160.609 | 5.032 | 19.737 |
|ZYBO|Ubuntu| 161.342 | 2.957 | 41.789 |

これまでの考察すら覆る？なかなか驚きの結果が出ました！

単一プロセスで浮動小数点演算の性能をみる`leibniz`では，RP3Bの性能がZYBOよりも大きく低下することになりました．また，ODROID-XU3の性能もZYBOとほぼ同等まで低下していて，整数演算性能の`fibonacci_simple`ではZYBOより劣る結果となりました．
コアの動作周波数を揃えてみて分かったことは，**命令セットの違いもElixirの性能に大きな影響を及ぼす**ということです．また，[#1.3](https://qiita.com/takasehideki/items/0aa644639f81c2ad0bbc#評価結果)でも言及しましたが，[64-bitではErlangがメモリを喰うため32-bitに劣る](http://www.erlang-factory.com/upload/presentations/105/KennethLundin-ErlangFactory2009London-AboutErlangOTPandMulti-coreperformanceinparticular.pdf)という話しも大きく影響していそうです．
ただし，`fibonacci_multi`で比較できる並列性能については，やはりODROID-XU3が優れる結果となりました．でもコア数ほどの差異は出ていませんね．


# まとめ

- [EEloT](https://github.com/takasehideki/EEloT)ベンチマークアプリで，IoTボードのコアの動作周波数を揃えて性能評価してみました
    - 当たり前ではあるけど，とにかく速い周波数で動かしたほうが有利です
    - 命令セットの違いもElixirの性能に大きな影響を及ぼします
    - 周波数が同じでもコア数が多いほうがやっぱり並列性能を発揮できます

よろしければ「いいね！」いただけるととっても嬉しいです．
「ElixirでIoT芸」に需要あるのか露頭に迷っている書き手の励みになります:thumbsup:

明日の「[fukuoka.ex x ザキ研 Advent Calendar 2017](https://adventar.org/calendars/2873)」の記事は， @hisaway さんの
「[Elixirで再帰呼び出しを使ってリストの加算関数をつくる](https://qiita.com/hisaway/items/647f33fbdcff21dae5a4)」
です．お楽しみに！



# お知らせ！

[「ElixirでIoT」シリーズの性能評価篇](https://qiita.com/takasehideki/items/8f43f1853ce88cbbe82e#elixirでiot1iotボード上でのelixirphoenix環境構築と性能評価篇)が学術論文として発表されます！学会会員でないと有料ではありますが，，，[情報処理学会電子図書館のこちら](https://ipsj.ixsq.nii.ac.jp/ej/?action=pages_view_main&active_action=repository_view_main_item_detail&item_id=190322&item_no=1&page_id=13&block_id=8)からダウンロードできます．

「関数型言語ElixirのIoTシステムへの導入に向けた基礎評価」
　|> 情報処理学会研究報告（組込みシステム），
　|> Vol. 2018-EMB-48，No. 5，pp. 1--8，2018年6月．

@twinbee さんと @zacky1972 先生との共著です！
実は来週の6月29日(金)に開催される[情報処理学会第48回組込みシステム研究会](https://www.ipsj.or.jp/kenkyukai/event/emb48.html)にて口頭発表もあります．東海大学高輪キャンパスでの開催ですので，ご興味ありましたらぜひお越しください！！