12. 12
Elixir!!
2012年に登場した新たな関数型⾔語
Erlang VM上で動作
• ⾼い並列性能を誇る
• 軽量かつ頑強なプロセスモデル
• 耐障害性が極めて⾼い
Rubyを基にした⾔語設計
• 習得しやすく⽣産性が向上する
• WebフレームワークPhoenixを持つ
Ø応答性が極めて⾼い
Programming should be
about transforming data
Elixir Zen Style
Zen(禅) とは本質美である
• プログラミングの本質とはデータの流れである
Elixirではデータフローと並列処理を
Enum Flow |> で直感的に記述できる
※各⾔語・フレームワークのロゴの権利は
それぞれの作成者に帰属しています
13. 13
Elixirの気持ちよさ
• Zen Style!!
• (やや)強い動的型付けとイミュータブル性
• 処理のモジュール化と制御の抽象化
関数とパイプ/プロセスとメッセージ
• メモリ軽量かつ堅牢なプロセスモデル
プロセス単位でのメモリ管理と障害復旧
• バイナリ操作とパターンマッチ
Shared Data
Core #1 Core #2
3.14
ダッシュ
ボード
Link
Super
Visor
one_for_one
App
液晶
データ
ロガー
Link
センサ
監視
制御
Link
ボタン
{:ok, ref} = Circuits.I2C.open(@i2c_bus)
Circuits.I2C.write(ref, @i2c_addr, <<0xBE, 0x08, 0x00>>)
Circuits.I2C.write(ref, @i2c_addr, <<0xAC, 0x33, 0x00>>)
{:ok, val} = Circuits.I2C.read(ref, @i2c_addr, 7)
<<_state::8, raw_humi::20, raw_temp::20, _crc::8>> = val
14. 14
• ElixirによるIoTフレームワーク
極⼩規模のファームウェア (~>30 MB)
堅牢性の⾼いファイルシステム
機能の取捨選別が容易 (Buildrootの利⽤)
• Elixirと完全互換で習熟性が⾼い
アクターベースの並⾏プログラミング
IoT向けになにかを気にする必要なし
• 有⽤なIoTライブラリとツール
NervesHub: Device to the Cloud!!
Bootloader A
Linux kernel (Buildroot)
Master Boot Record
Root Filesystem A
(Read-only)
Application Data
(Read-Write)
C libraries
Erlang VM
Bootloader B
Root Filesystem B
(Read-only)
C libraries
Erlang VM
CQ出版Interface
2020年6⽉号〜
2021年1⽉号
15. 15
Nervesのリアルタイム性
ü最⼩の構成で⼗分なリアルタイム性を提供する
üSoC性能がリアルタイム性にも直結する
1. GCの設定
ローカルデータを消費するもの
にはminor GCの抑⽌が効果的
最⼩のヒープサイズを適切に
設定することも効果がある
2. プロセス優先度の設定
最悪実⾏時間の改善には
high の設定は有⽤
さらなる調査が不可⽋
3. CPU周波数の制御
周波数の固定化はリアルタイム性の
改善に寄与する
IoTデバイスでは消費エネルギーの
最適化も重要となる
4. カーネルのカスタマイズ
有意な効果は⾒られなかった
I/O処理が断続的かつ⼤量な
場合には効果がある可能性がある
https://www.verypossible.com/insights/is-
nerves-a-real-time-embedded-system
• ⾼瀬,河上,菊池︓関数型⾔語ElixirのIoTフレームワークNervesに関するリアルタイム性の評価およびその改善の試み,
情報処理学会研究報告,Vol. 2020-EMB-55,No. 7, 2020. [paper]
• Hideki Takase: An Evaluation of Real-Time Performance for Nerves, Nerves in Action Web Series [slide]
25. 25
⾼位合成 (HLS: High Level Synthesis)
• 抽象度の⾼い動作記述からRTLを⽣成する技術
汎⽤プログラミング⾔語によって振る舞いを定義
「なに」を⾏うかに重点を置いて設計する
ü多くの商⽤ツールはC/C++またはその拡張⾔語
ソフトウェア志向の協調設計との親和性が⾼い
プロセッサ
通信バス
FPGA
HW
SW
SW
int_t main () {
a = func1(xxx);
b = a + func2(yyy);
}
int func1(int x) {
…
return val;
}
int func2(int x) {
int a[N];
int i;
for(i=0;i<N;i++){
a[i] = ・・・;
:
}
}
x
func
i
a
SW
26. 26
⾼位合成からみたプログラミング⾔語
R. Nane, et al.: A Survey and Evaluation of FPGA
High-Level Synthesis Tools, IEEE T-CAD, 2015.
M. W. Numan, et al.: Towards Automatic High-Level Code
Deployment on Reconfigurable Platforms: A Survey of High-
Level Synthesis Tools and Toolchains, IEEE Access, 2020.
27. 27
Elixirによる⾼位合成︓アイデア
input_list
|> Flow.from_enumerable(stages: 4)
|> Flow.map(& foo(&1))
|> Flow.map(& bar(&1))
|> Enum.to_list
|> Enum.sort
from_
enumerable
input_list
foo
foo
foo
foo
sort
to_list
arbitrator
bar
bar
bar
bar
input
_list from_
enume
rable
to_list
sort
foo bar
foo bar
foo bar
foo bar
arbitrator
foo bar
foo
bar
foo bar
foo
bar
foo
bar
foo
foo bar
foo
bar
foo bar bar
foo bar
foo bar
foo bar
foo bar
• H. Takase, et al. “WiP: A concept of a hardware design environment with the functional language Elixir,” in CODES+ISSS, 2019.
• H. Takase, “Cockatrice: A Hardware Design Environment with Elixir,” ElixirConf US 2019. [video] / [slide]
• H. Takase, “Towards a Hardware Synthesis Environment from the Functional Language Elixir,” ASP-DAC 2021 Designersʼ Forum.
28. • H. Takase, et al. “WiP: A concept of a hardware design environment with the functional language Elixir,” in CODES+ISSS, 2019.
• H. Takase, “Cockatrice: A Hardware Design Environment with Elixir,” ElixirConf US 2019. [video] / [slide]
• H. Takase, “Towards a Hardware Synthesis Environment from the Functional Language Elixir,” ASP-DAC 2021 Designersʼ Forum. 28
設計記述と合成フロー
設計記述の
解析
設計記述
Elixir
ライブラリIP・
テンプレート
HDL+DSL
構⽂⽊
AST
Elixir関数対応
HWモジュール⽣成
HW IPモジュール
HDL
データフロー合成 データフロー型
HW回路 HDL
HW回路
bitstream
IFドライバ
C
論理合成
(HW回路合成)
アプリ記述
Elixir+C(NIF)
IF回路
ドライバ合成
SWコンパイル
Elixirライブラリと機能等価な
モジュールをIPとして提供
(HW屋さん的にはIPベース設計)
無名関数の演算⼦・関数や
並列度等のパラメータを
テンプレートのDSLに適⽤
SW/HW間のインタフェース機構を⽣成
29. 29
機能等価なHDL IPの設計
• Enumライブラリ関数の処理パターンを分類
1. 各要素に対して独⽴して結果を出⼒する演算・関数
2. 複数要素を受け取って単⼀要素を出⼒する演算・関数
ü処理に結合性があればHWモジュールは集約可能
3. 複数要素を受け取って複数要素を出⼒する演算・関数
• H. Takase, et al. “WiP: A concept of a hardware design environment with the functional language Elixir,” in CODES+ISSS, 2019.
• H. Takase, “Cockatrice: A Hardware Design Environment with Elixir,” ElixirConf US 2019. [video] / [slide]
• H. Takase, “Towards a Hardware Synthesis Environment from the Functional Language Elixir,” ASP-DAC 2021 Designersʼ Forum.
30. 30
SW/HW通信インタフェース機構
SWの関数呼び出しと
同じ記述でHWを起動
ErlangのNIF機能で
C実装デバドラをラッピング
Elixirのリストと
Cの配列を相互変換
Xilinx Zynq搭載の
AMBA AXI4に準拠して通信
Xilinx Zynq搭載の
AMBA AXI4に準拠して通信
Elixirライブラリ関数と
機能等価なHDL IP
• H. Takase, et al. “WiP: A concept of a hardware design environment with the functional language Elixir,” in CODES+ISSS, 2019.
• H. Takase, “Cockatrice: A Hardware Design Environment with Elixir,” ElixirConf US 2019. [video] / [slide]
• H. Takase, “Towards a Hardware Synthesis Environment from the Functional Language Elixir,” ASP-DAC 2021 Designersʼ Forum.
31. 31
現状と⽅向性
• Cockatrice︓Elixirの⾼位合成系
9種類のEnum関数をHDL IP化
組込みボード Zybo 向けに通信機構を
実装して実機動作を確認
ü AXI4では性能が出ない
Vivado HLS以外との連携を模索中
• 狙いどころ︓AI/MLアプリ
ü 少なくとも組込み向けではなさそう
IoT向けビッグデータのストリーム処理
柔軟に機能を変えたいクラウドサーバ処理
• H. Takase, et al. “WiP: A concept of a hardware design environment with the functional language Elixir,” in CODES+ISSS, 2019.
• H. Takase, “Cockatrice: A Hardware Design Environment with Elixir,” ElixirConf US 2019. [video] / [slide]
• H. Takase, “Towards a Hardware Synthesis Environment from the Functional Language Elixir,” ASP-DAC 2021 Designersʼ Forum.
Elixirはリアルタイムアプリには向いているが,
データ量が⼤きくなると性能が出ない
38. 38
Erlang VM/カーネルとの関係 Rclex
OS
Process Space
rclcpp
node1
rclcpp
node2
Erlang VM
Rclex
node1
Rclex
node2
CPU
process
exec. queue
Pub process1
Sub process1
Sub process2
...
RCL node block =
Erlang resource object
• OSの1プロセスとしてErlang VMが起動
• Erlangスケジューラの中でループ処理とプロセス=ROSノードを実⾏
• プロセスが軽量︓起動時間が数マイクロ秒,メモリはおよそ300ワード
RCL資源をstatic linkした
共有ライブラリをErlang NIFを
介してロード・呼び出し
tlk-emb/rclex
39. 39
ElixirからのRCL層の呼び出し Rclex
tlk-emb/rclex
defmodule RclEx do
@on_load :load_nifs
def load_nifs do
:erlang.load_nif(‘rclex',0)
end
def node_init do
end
def publish do
end
def subscription do
end
...
end
RCL,RMW
Elixirコードから渡された
Erlangリソースオブジェクト
(= 構造体分のメモリブロック)
RCL内の対応する構造体
変換
→RCL APIを呼び出す
Erlang NIFを介して
.so をロード