ElixirでFPGAハードウェアが
作れちゃう,かも!!?
<fukuoka.ex #19圧縮版>
高瀬 英希
(京都大学/JSTさきがけ)
takase@i.kyoto-u.ac.jp
「決められたことをすぐにやる」
• 特定用途のみに特化した
専用のアーキテクチャ構成
• 必要なだけのデータ幅と演算
コンピュータの計算資源
「言われたことはなんでもやる」
• すべてのケースをカバーする
汎用データパス
• 固定されたデータ幅と演算プロセッサ
&
ソフトウェア
ASIC
(専用回路)
ハードウェア
2
プロセッサ vs. ASIC
設計容易性・柔軟性
開発製造コスト
省電力性
性能・並列性プロセッサ
&
ソフトウェア
ASIC
(専用回路)
ハードウェア
FPGA
3
FPGAとは?
• Field Programmable Gate Array
− 中身を改変可能なLSI
− ハードウェアそのものの
振る舞いを変えられる
− 独自のデジタル回路を
自由に何回でも形成できる
− FPGA二大ベンダ:
Xilinx・Altera (powered by Intel)
4
IOB
SB
CB LB
IOB
IOB
SB
IOB LB
SB
CB CB
SB
CB
SB SB
CB CBLB IOBIOB LB
SB SB SB
IOB IOB
CB
CB
CB
CB
CB
CB
入出力ブロック
コネクションブロックLB 論理ブロック
IOBSB スイッチブロック
CB
LUT
IN OUT
0000 1
0001 0
0010 0
… …
1110 1
1111 0
D-FF
D Q
FPGAの使い方
5
プロセッサ
通信バス
FPGA
重たい処理を
オフロード
HW
HW
インタフェース IF
レイヤ
HW化によって
並列化・省電力化
SW
SW
SW/HW間は
高速に通信
SW
SW
IF
レイヤ
FPGAの強み
6
FPGA
Memory
Func Func
Func FuncFunc
Func FuncFunc
FuncFunc
CPU
Memory
Func
Unit
Reg
• データストリーム処理の実現が可能になる
− ノイマン・ボトルネックの解消に!
• ハードウェアとして並列処理できる
高位合成
• 抽象度の高い動作記述からRTLを生成する技術
− 汎用プログラミング言語によって振る舞いを定義
多くのツールはC/C++またはその拡張言語
− 「なに」を行うかに重点を置いて設計する
7
int func (int x) {
int a[N];
int i;
for(i=0;i<N;i++){
a[i] = ・・・;
:
:
}
:
}
x
func
i
a
C/C++の高位合成ツール
8
• Xilinx Vivado HLS
− C/C++からHDLを生成
− EclipseベースIDE
− 無償利用可能
• Intel FPGA SDK for OpenCL
− OpenCLの並列プログラムから
HDLを生成
− ホストPC/GPUと同記述で
合成&実行可能
出典:Xilinx社ホワイトペーパー UG902
D. Neto, Optimizing OpenCL for Altera FPGAs, Int’l Workshop on Open CL, 2014.
#pragmaやライブラリの使いこなし・
最適化のための合成系の習熟が必須
C/C++以外の高位合成系
• Chisel:Scalaベースによる処理系
− オブジェクト指向/関数型言語風にDSLを記述
• Synthesijer:Javaによる処理系
− Java言語仕様のサブセットをHW合成可能 Scala/Goにも対応
• CλaSH:Haskellの高位合成系
− 関数型言語の記述からHDLを生成
• PyCoRAM:Pythonによる処理系
− メモリ管理機構を抽象化して動作記述可能
 Veriloggen:HDLを組み立てるPythonライブラリ
• Mulvery:Rubyベースの高位合成系
− Reactive Programmingからのハードウェア合成
• Octopus🐙:Ocamlの高位合成系
9
書きやすい(好きな)言語で
HWを設計する時代?
じゃあこうなりますよね!?
10
あ…ありのまま 今 起こった事を話すぜ!
「Elixirを書いていたら
ハードウェアが合成されていた」
な… 何を言っているのか わからねーと思うが
おれも 何をされたのか わからなかった…
アプリがどうにかなりそうだった…
数倍の高速化だとか
10倍の電力効率化だとか
そんなチャチなもんじゃあ 断じてねえ
もっと恐ろしいものの片鱗を
味わったぜ…
Elixir “ZEN” Style
• データと並列処理の流れを直感的に記述
− Programming should be about transforming data
• Enum:
データコレクションを操作
• Flow:
並列処理を直接的に記述
− MapReduce処理モデル
• |>:パイプライン演算子
データの流れを表現
 その他の長所・特徴
− イミュータブル性
− パターンマッチング
11
1..1000
|> Flow.from_enumerable()
|> Flow.map(& foo(&1))
|> Flow.map(& bar(&1))
|> Enum.to_list
|> Enum.sort
ハードウェア設計にも
使えるはず!!
基本的なアイデア
12
Cockatrice
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
sortto_list
arbitrator
bar
bar
bar
bar
基本的なアイデア
13
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 barfoo bar
foo bar
Cockatriceの合成フロー
14
設計記述の
解析
設計記述
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間のインタフェース機構を生成
予備実装と環境
• 対象デバイス: Zybo Z7-20 (XC7Z020)
− ARM Cortex-A9 dual-core
processor 667MHz
− FPGA 50MHz
論理合成ツール:Vivado 2017.4
AMBA AXI4: AXI-Lite & AXI-GP
• OS: Ubuntu16.04 LTS
− Petalinux 2017.4
• Elixir 1.7.4 / Erlang/OTP 20
− [erts-9.3] [source] [smp:2:2] [ds:2:2:10]
[async-threads:10] [hipe] [kernel-poll:false]
15
Elixir HWが
ちゃんと動いた!!
現状のまとめと狙いどころ
• 現状のまとめ
− 9種類のEnum関数をHDL IP化
− 通信機構を実装して実機動作を確認
でもZyboじゃなかなか性能が出ないぃ,,,
• 狙いどころ:AI/MLアプリ?
 少なくとも組込み向けではなさそう
− IoT向けビッグ(な数値)データの
ストリーム処理
− ユーザで柔軟に機能を変えたい
クラウドサーバ処理
16
リアルタイムアプリには
向いてるけど,データが
どでかいとしんどいよねぇ
17
詳しくは
fukuoka.ex #19
をご参照ください
https://fukuokaex.connpass.com
/event/120102/presentation/
あんど,,,
わんもあしんぐ!!
ElixirConf US 2019!!
19
https://elixirconf.com/2019/speakers/51
大事なコトは何度でも,,,
わんもあしんぐ!!
21
Justin will come to
Japan
on this summer!!
22
• SWEST: 組込みシステム技術に
関するサマーワークショップ
• 1泊2日の合宿形式
−岐阜県下呂温泉 水明館
−2019年9月5日(木)〜6日(金)
• 目的:組込み技術の徹底議論と交流
SWEST21
|> 論!
|> ラン!!
|> push!!!
23
Nerves Training in Kyoto
https://kyotoex.connpass.com/event/133813/

ElixirでFPGAハードウェアが作れちゃう,かも!!?

Editor's Notes

  • #2 粗粒度並列化よりパイプライン化とかのほうが効くかも それを指定できると良いかも どこかで高位合成しないといけないのだから,HLS Cを吐くアプローチを取ったほうが手っ取り早いのでは? Elixir/ErlangからCに変換するようなコンパイラの研究ありそう データを流すから通信が重くなる 共有メモリへのアクセスとかで改善したほうが良さそう 最適化目標を指定できるようにしたほうが良いのか?
  • #3 FPGAは基本論理セルが規則的に並ぶ構造となっています. セルの組み合わせと接続を変えることで,ある時は通信回路,動画処理エンジン,暗号回路,プロセッサにもなれる. ドワンゴさんのサーバでも動いているらしいです. 設計方法,プログラミングというとちょっと語弊がありますが,こんな言語で記述します.ぶっちゃけ私はこんなの書けないです. 最近ではそんな私のために,高位合成という技術が実用レベルになりつつあります.
  • #4 FPGAは基本論理セルが規則的に並ぶ構造となっています. セルの組み合わせと接続を変えることで,ある時は通信回路,動画処理エンジン,暗号回路,プロセッサにもなれる. ドワンゴさんのサーバでも動いているらしいです. 設計方法,プログラミングというとちょっと語弊がありますが,こんな言語で記述します.ぶっちゃけ私はこんなの書けないです. 最近ではそんな私のために,高位合成という技術が実用レベルになりつつあります.
  • #5 LB:論理回路を実現する論理要素 IOB:外部との信号の入出力を行う要素 SW, CB, Wire:それらを接続する配線要素
  • #7 プロセッサ処理より高性能かつ省電力を実現する ASICよりも製造コストを抑えられる
  • #8 逐次,分岐,繰り返しなどの制御はステートマシンとして,変数はレジスタ,配列はメモリとして生成される
  • #12 これまでのプログラミング言語は処理の振る舞いに着目してきた.これからはデータの扱いを重視すべきとの思想が根付いている. パイプ演算子でデータの流れを直接的に記述できる. MapReduceモデルのFlowライブラリによって並列処理を直接的に記述できる. このプログラムでは,1 から1000 までのリストを生成し,各コアにリストの要素を分配した後,各要素について関数foo とbar を順番に適用してから結果をリストに戻す.図1のプログラムコードを記述すると,各コアにリスト要素を分配して実行される. 通常の言語ではマルチコアによる並列処理を行ってもコア間の同期や排他制御などが多々発生するため,コア数の増加に対し実行速度の向上が鈍化する傾向がある.しかし,Elixir ではイミュータブル特性により,マルチコアによる並列処理の際にはコア数に比例して実行速度が向上する Elixirでは末尾再帰を推奨.イミュータブルに束縛していくので,スタック使用量は線形に増えることはない.ただしHWにするときはどうするかは要検討.
  • #19 11:29 19分で
  • #21 11:29 19分で