**********************************************************************
ワーク S2-c
テーマ :耐障害性が高くマルチコア性能を最大限発揮できるElixir(エリクサー)
 を学んでみよう
講師 :山崎 進(北九州市立大学),高瀬 英希(京都大学)
日時:2018/8/31 9:00~10:10
参加人数:19名
**********************************************************************

■導入紹介 山崎先生 09:00~
・Elixirとは
最近登場したプログラミング言語.膨大なデータやアクセスの高速処理,高い
開発効率を実現できる.採用数も年々増えている.
Elixirを組込みに活かしていこうという取り組みを行っている.

・C言語の問題点 その1
C言語でのマルチコア対応は大変.デッドロック,優先度逆転を防ぐように注意
して同期・排他制御をコーディングする必要あり.苦労しても性能が上がらない.
例とともに紹介

・Elixirのここがいけてる その1
同期や排他制御を基本的に書く必要がない.
デッドロックも基本的に気にしなくていい.
コア数が増えるにしたがってきれいに性能が向上する
 ⇒1000/実行時間でプロットすると線形的に向上する

・Elixirのここがいけてる その2
シンプルでとっつきやすい,それでいてパワフルな言語仕様.
代表例:パイプライン演算子(計算結果を関数に次々渡せる).
 MapReduceモデル (map / reduce関数を使ったプログラミングスタイル)

<質疑応答>
質問:
 ラムダ抽象の記法が fn を使った形式と & を使った形式があるが?
回答:
 シンタックスシュガーだと思ってもらえれば良い

Qiitaの下記ページを参照するとパイプライン演算子と map関数 による
   プログラミングスタイルを習得できる
   Excelから関数型言語マスター1回目:行の「並べ替え」と「絞り込み」
https://qiita.com/piacere_ex/items/6714e1440e3f25fb46a1

・Elixirのここがいけてる その3
Ruby on Railsと同等以上の生産性で,驚異の高レスポンス性能を誇るPhoenix
Elixirの作者はRuby on Railsのコアコミッター.ElixirはErlang VMで動作.

・C言語の問題点 その2
mallocは遅いしメモリリークする.例外処理のための記法が無く,
悪名高きgotoやsetjmp/longjmpが登場してしまう
仮にjavaやmrubyであっても...
GC時に止まってしまう.
 メモリ障害が起こるとVM全体が落ちてしまう.
try/catchをきちんと書くのはとても面倒

・Elixirのここがいけてる その4
プロセスごとの堅牢なメモリ管理で障害監視の仕組みが整っている.
障害時に他に影響せず再起動OK.例外処理に気を配らなくてよい

・Elixirの普及
2016年には1109の企業で採用されている.2012年に開発がスタートした

<質疑応答>
質問:
 メモリの障害はハードウェア障害ではない.Rubyはスクリプトなのでメモリ障害
 を起きないのでは?
回答:
 Ruby では例外が起こると try/catch で適切に処理しない限り障害の原因になる
    try/catchをきちんと整備するのは意外と大変
    Elixir ではtry/catchを書くこともできるが,書かなくても障害が起きたプロセス
    ごと再起動することができる.これにより手間なく耐障害性を高められる.

質問:
 新しいプロセスを作るときに変数は
回答:
 コア間でコピーして持っておいて,値渡しを行っている.

質問:
 MapReduceの際は各コアでコピーして行っているということか?
回答:
 Yes.並列処理では有効

質問:
 パターンマッチングとは
回答:
 a=[1,2]と書いたときに代入のように見えるのがパターンマッチング.
 [x,y] = [1,2]と書いたらその場合でも定義できる


■ElixirでIoT、IoTボードでの実績 高瀬先生 09:20~

・IoTについて
人,モノがつながる世界へ

組込みからElixirを見ると,使えるんじゃないか
「ElixirをIoTボードで動かしてみた」
「環境センシングとデータ表示をサクっと?やってみた」

・ElixirをIoTボードで動かしてみよう
様々なボードにインストールを行い実行してみる

・評価用ツールキット
自動インストールスクリプト,評価環境設定スクリプト(gitで公開)

・用意されているベンチマーク
ライプニッツ,フィボナッチ等々5つ

・結果抜粋
コア数は8でも並列性は6で頭打ちだった.
Rustler不使用はbenchmarks3,使用時はbenchmarks8

slideshareと論文で詳しく紹介
https://www.slideshare.net/takasehideki/elixiriot-biglittlezynq-94455098

・環境センシングとデータ表示をサクっと?やってみた
世界ではElixirでIoTが結構ある
Nerves(ラズパイが限定),GRiSP(HWもSEもセットで提供)などがある

ラズパイ3Bで環境データをセンシングして表示させてみよう

・やったこと
1.GrovePiライブラリを調べて試す
2.さを使う
3.LCD displayにデータを表示
4.センサデータをCSVで書き出してみた
5.Phoenixページにグラフを表示してみた
6.書き出したCSVデータをグラフ表示してみた
7.環境センシングしながらリアルタイムでグラフ表示してみた

実際に会場で動かす
用意されている動画を再生

<質疑応答>
質問:
 Elixirでやりやすかったこと
回答:
 書きやすかった.(実際にコードを見せて説明)

質問:
 ストリームのように温度を変化するものは可能か
回答:
 今のところ連続的にとるような仕組みは今のところないが,実現可能である

質問:
 実行時に必要なワーキングメモリの量は?
回答:
 オプション指定でできると思うがやったことはない

質問:
 分岐できるパイプは作れるか
回答:
 フィルターのような感じで作ることができる.
 Ruby並みにいろいろ用意されている

■Elixir未来の話 山崎先生 9:50~
・Elixirの組込みソフトウェア開発対応.
残念ながら現在では省メモリ・リアルタイム対応していない

・micro Elixir/ZEAM
超高速リアルタイム処理にチューニングしたElixir処理系
最適化しやすいようにチューニング.
LLVMを拡張したPolymorphic LLVMによるインラインアセンブリコード記述.
省メモリ,互換性,ハードリアルタイムを狙う.
Sabotender.Hastega等々いろいろなものを目指す

・最適化しやすいように言語仕様をチューニング
最適化しにくいものは最初はカットする

・LLVMを拡張したPolymorphic LLVMによるインラインアセンブリコード記述
64bit整数型のローカル変数aに定数1を代入するコード
⇒型多相,
 例えば足し算のコードは整数型でも浮動小数点数型でも同じコードで動作する
 そこで,LLVMを拡張したPolymorphic LLVMを提案し,
 これを用いてインラインアセンブラコードを記述できるようにする

型推論を行って想定される型ごとに特化したコードを生成する
 ⇒アセンブリコードベリファイアにより,
  違法なメモリアクセスをしていないかを検査する
型安全性を破らないように,
関数の先頭に引数の型に合わせて分岐するコードを挿入する

<質疑応答>
質問:
 Polymorphicであることはどうやって判別
回答:
 最初のうちは整数型限定であるとかそういうのをつけようかと思っている

・省メモリ,互換性,ハードリアルタイムを目指す
省メモリ
 ⇒リスト構造を,要素を型によって分類
互換性
 ⇒C言語のヘッダファイルを読み込んでPolymorphic LLVMで扱えるようにする
リアルタイム性
 ⇒処理毎に優先度を指定できるようにする.所要実行時間を推定.デッドラインを
もとにスケジューリングを最適化

・マルチタスク機構Sabotender
2020年の後にはデータ流通量が200~500倍になる
例と共に紹介
 ⇒様々な成果が得られている

<質疑応答>
質問:
 パイプでかけるとかっこよいと思うがそうでない理由は?
回答:
 もちろんパイプと兼ねてかけるようにしたいと思っている

質問:
 記法の話のつもりだったが?
回答:
 記法についてはまだこれから考える

・マルチコアCPU/GPU活用 Hastega
単純で均質で大量にあるデータを同じような命令列で処理する場合,
高速で処理できる

・時間のため終了
fukuoka.exについて紹介

<質疑応答>
質問:
 おすすめの開発環境は?
回答:
 何でもよい.Visual Studioに入れている人はいる

■まとめ
 Elixirは最近登場し,採用数が年々増えている言語である.それを組込み向けに
 対応していこうという活動が行われている.
 現在はまだまだ研究途上であるが,様々なプラン立てが行われており,今後より有用
 なものとなっていくと予想される


■参考情報
fukuoka.ex
https://fukuokaex.connpass.com/

以上.