ElixirでIoT#1.3.3：logistic_mapをIoTボードで性能評価してみた

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

昨日は @zacky1972 さんの「[ZEAM開発ログ v.0.3.0 Elixir から GPU を駆動するベンチマークをいろいろアップグレードしてみた](https://qiita.com/zacky1972/items/a4faa210b05cbd1ab8ab)」 でした．

# はじめに

どうもこんにちは．
[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)　　|> [ElixirでIoT#1.3.2：プロセッサコアの動作周波数を揃えて比較評価してみた
](https://qiita.com/takasehideki/items/ac3bdb8c66a5b6710d11)

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

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

今回は，本Advent Calendarの主催元であるZACKY先生が整備されたロジスティック写像のベンチマークアプリを使って，IoTボードの性能評価をしてみたいと思います．
ちなみに今回が[ElixirでIoT#1](https://qiita.com/takasehideki/items/8f43f1853ce88cbbe82e#elixirでiot1iotボード上でのelixirphoenix環境構築と性能評価篇)シリーズの最終回です！！

# ロジスティック写像とは？

[ZACKY先生の過去記事](https://qiita.com/zacky1972/items/e843607881bbeca34b70#flow--genstage-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%99%E3%83%B3%E3%83%81%E3%83%9E%E3%83%BC%E3%82%AF%E6%95%B4%E6%95%B0%E3%81%AB%E3%82%88%E3%82%8B%E3%83%AD%E3%82%B8%E3%82%B9%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E5%86%99%E5%83%8F%E6%BC%94%E7%AE%97)にも紹介がありますが，ロジスティック写像とは生物の個体数の時系列に対する変遷のモデルです．単純な式でありながら解が複雑な振る舞いをすることが知られています．
整数演算として次の漸化式で表現できます．

$X_{i+1} = \mu_{p} X_{i}(X_{i+1}) \mod p $

今回は下記のGitHubリポジトリにあるソースを利用しました．

- https://github.com/zeam-vm/logistic_map

Elixirの動作するErlang VMには，他言語で実装されたモジュールを呼び出すことができるNIF（Native Implemented Functions）という機能が提供されています．logistic_mapではRustのモジュールを呼び出すライブラリであるRustlerが使われおり，NIF機能の有効性を評価することができます．
Rustlerの使用の有無での評価を見てみたいので，**benchmarks3: pure Elixir(inlining inside of Flow.map)**と**benchmarks8: Rustler loop, passing by list, with Window**を使いました．また，Flowによる並列プログラミングで記述されており，並列化の段数も指定しました．


# Rust環境の用意

Rustが実行できる環境をIoTボードで用意しました．
とはいえ汎用PCでの方法と変わりはありません．

```shell-session
$ curl https://sh.rustup.rs -sSf | sh
$ source $HOME/.cargo/env
```

# 評価結果


`@logistic_map_size` は0x500000としました．各IoTボードのスペックは[連載記事#1.0の表](https://qiita.com/takasehideki/items/9e3db412a40659233384#iotボードの選定)をご参照ください．

単位は秒で，行見出しの数値はFlowにおける並列数です．


|||RP3B/Raspbian|RP3B/Ubuntu|ODROID-XU3|ZYBO|Macbook Pro|
|:---|:---|---:|---:|---:|---:|---:|---:|
|benchmarks3|1|46.989|49.799|23.884|87.184|3.955|
||2|23.486|25.134|12.726|47.905|2.561|
||4|14.020|14.821|8.895|47.942|2.141|
||8|14.370|15.200|6.865|48.387|2.448|
||16|13.802|14.606|6.629|48.319|2.290|
|benchmarks8|1|24.318|24.065|13.769|50.701|1.574|
||2|21.584|21.550|9.922|40.436|1.972|
||4|13.745|14.613|7.619|38.454|1.880|
||8|14.550|14.948|6.920|39.290|2.066|
||16|15.481|15.696|7.854|39.637|2.068|


これらの結果からは，NIFを介した他モジュールの呼び出しは，IoTボードでも性能向上に寄与できることが分かります．
特にFlowにおける並列数の指定が小さい場合には，Rustlerによる性能向上が大きくなりました．

ただし，並列数が大きくなるとRustlerによる性能向上はあまり見られません．
これは，NIFを介して実行されるRustモジュールは，Erlang VMによる並列性能の恩恵を受けられないためであることが考えられます．
さてこの辺りはどうなんでしょう，，，というところは，fukuoka.ex勢でワルダクミしてたりします．これからの展開にご期待くださいませ！！



# まとめ

- ZACKY先生の実装された[logistic_map](https://github.com/zeam-vm/logistic_map)アプリを，IoTボードにて性能評価してみました
    - 並列数が小さい場合には，IoTボードでもNIFを介したRustモジュールによる性能向上の恩恵が受けられます
    - NIFモジュールはErlang VMによる並列性能を発揮できないため，並列数が大きい場合にはそれほどの恩恵は出ません

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

明日の「[fukuoka.ex x ザキ研 Advent Calendar 2017](https://adventar.org/calendars/2873)」の記事は， @kobatako  さんの
「[GraphQL for Elixir#3 Middlewareと認証について考える](https://qiita.com/kobatako/items/dcc9fc5a603d797edea9)」
です．お楽しみに！



# お知らせ！

[「ElixirでIoT」シリーズの性能評価篇](https://qiita.com/takasehideki/items/8f43f1853ce88cbbe82e#elixirでiot1iotボード上でのelixirphoenix環境構築と性能評価篇)が学術論文として発表されました！

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

@twinbee さんと @zacky1972 先生との共著です！
学会会員でないと有料ではありますが，，，[情報処理学会電子図書館のこちら](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)からダウンロードできます．発表資料は[SlideShare](https://www.slideshare.net/takasehideki/elixiriot-103564783)にて公開していますので，ご興味ありましたらぜひご覧ください^^;