異形の論理型言語システムをFPGAで!!
2013/6/4 FPGAエクストリーム・コンピューティング第2回
俺はノイマンなコードを書くのを やめるぞ!ジョジョーッ!
大阪大学大阪大学
吉田 幹(@kibayos)
BBR / PIAX Inc.
今日のお題
少し、Stream Computingの話
IBM Streams を事例に
異形の論理型言語システムの紹介
pure Prolog(正確にはHorn節集合)前提
“異形”とは計算モデルが従来のモノと全然違う意“異形”とは計算モデルが従来のモノと全然違う意
副業で、2つ研究してます
ユニファイアの流れだけで計算を実現するモデル
ニューロンの振る舞いをベースにしたデータフローネットワークの
上で計算するモデル (時間の都合で次回へ)
FPGAだと、こういう言語マシンになるという青写真を示し
ます (動かすのは次次..回以降に ^^)
2
Stream Computing
“Data Stream Processing” として知られるデータ駆動型
の計算パラダイム
制御フローではなく、データフロー。クエリとデータが逆の位置
スケールアウト・アーキテクチャ
cyclicを許すDFG(dataflow graph)上の計算
3
“An introduction to InfoSphere Streams” in developerWorks
src
op
op
op
sink
src
sink
src
ビッグデータの領域では、RTAP(Real-Time
Analytic Processing)として位置づけ
OLTP->OLAP->RTAP
Stream Computing
CEP(Complex Event Processing:複合イベント処理)
M2M, IoT(Internet of Things)
大量、多種(非定型含む)のデータ処理
4
“Addressing Data Volume, Velocity, and Variety with IBM InfoSphere Streams V3.0” in IBM Redbooks
システム事例:NEC
5
http://japan.zdnet.com/cio/analysis/35009803/
システム事例:NEC
6
http://japan.zdnet.com/cio/analysis/35009803/
http://www.impressrd.jp/idc/story/2012/11/05/2188?page=0%2C2
システム事例:IBM InfoSphere Streams
開発は10年前から!!
2001年 アメリカ政府とパートナーシップ
2003年 プロトタイピング開始
2010年 一般向け製品として、v1.0リリース
2011年 v2.0リリース
専用言語 SPL(Streams Processing Language)
言わば、データフロー構成言語言わば、データフロー構成言語
operatorなど、C++またはJavaを使って拡張可能
各nodeのプロセス、マシンへの割り当ては自由
開発環境
Streams Studio(Eclipse IDE), Webコンソール
SPL project, visual programming, debugger...
管理・アドミンツール
解析用ツールキットとアクセラレータ
7
IBM Streams
Word countを行うSPLの例 “An introduction to InfoSphere Streams” in developerWorks
8
柔軟性を備えたdeployment
適用分野
通信、運輸、金融、防衛・セキュリティ、e-サイエンス、環境
モニタリング、SNS、ヘルスケア、スマートグリッド&エネルギ
ー、と多岐に及ぶ
150サイトへのインストール、数100アプリの開発(2010年時点)
FPGAと同様、金融における低レイテンシーに向けた要望も
TD証券のアルゴリズム
9
IBM “ストリーミング技術による市場系システム変革” より
TD証券のアルゴリズム
トレーディング(2009年)
低レイテンシー・ゾーン
の置き換え
500万件/秒のデータ処理、
注文作成まで1ミリ秒未満
ここまでで...
Stream Computingは着実に実用段階に!!
SPLのような言語を使ったプログラミングが浸透する
と、Lucid(1976年!!)のようなデータフロープログラ
ミング言語が復活するかもミング言語が復活するかも
そういえば、VerilogやVHDLもこのジャンルかも
そして、データフローマシンがよみがえる日も近い?
徐々に、FPGAがCPUに取って代わる
CPUオワコン (*゚д゚*)
10
ここまでで...
Stream Computingは着実に実用段階に!!
SPLのような言語を使ったプログラミングが浸透する
と、Lucid(1976年!!)のようなデータフロープログラ
ミング言語が復活するかもミング言語が復活するかも
そういえば、VerilogやVHDLもこのジャンルかも
そして、データフローマシンがよみがえる日も近い?
徐々に、FPGAがCPUに取って代わる
CPUオワコン (*゚д゚*)
11
論理プログラムの計算
論理プログラムとは
三段論法が実行のステップ
“A <- B” and “B <-” implies “A <-”
演繹(deduction)ステップ
プログラムプログラムプログラムプログラム 実行実行実行実行
B <-
A <- B
A <-
13
x=Steve
□
<- Likes(Bob, Steve)
Likes(Bob, x) <- Likes(x, Scala)
<- Likes(Steve, Scala)
Likes(Steve, Scala) <-
Likes(Bob, Scala) <-
Likes(Steve, Scala) <-
Likes(John, Java) <-
Likes(Bob, x) <- Likes(x, Scala)
知識表現以外の例
自然数を表現するプログラム
Numb(s(s(s(s(s(0)))))) <- ⇒ 5は自然数である
ここで、項s(t) は、項tの表す数より1大きい数(successor)を表す
S式を使った例(リストの結合、分解)
Numb(0) <-
Numb(s(x)) <- Numb(x)
cons(x, y) は、xを左、yを右の部分木とする木を構成する表現
リスト表記のためのシンタックスシュガー
[] = nil
[a | b] = cons(a, b)
[a, b | c] = cons(a, cons(b, c))
[a, b] = [a, b | nil] = cons(a, cons(b, nil))
14
Append(nil, x, x) <-
Append(cons(x, y), z, cons(x, w)) <- Append(y, z, w)
関数の例
加減算
乗除算
Add(0, x, x) <-
Add(s(x), y, s(z)) <- Add(x, y, z)
Multi(0, x, 0) <-
Multi(s(x), y, w) <- Multi(x, y, z), Add(z, y, w)
Fibonacci数列
Ackermann関数
15
Fib(0, 0) <-
Fib(s(0), s(0)) <-
Fib(s(s(n)), z) <- Fib(s(n), x), Fib(n, y), Add(x, y, z)
Ack(0, n, s(n)) <-
Ack(s(m), 0, w) <- Ack(m, s(0), w)
Ack(s(m), s(n), w) <- Ack(s(m), n, x), Ack(m, x, w)
appendの実行(リストの結合)
<- append([1,2], [3], q)
append([x|y], z, [x|w]) <- append(y,z,w)
x=1, y=[2], z=[3], q=[1|w]
append([], x, x) <-
append([x|y], z, [x|w]) <- append(y,z,w)
計算計算計算計算
ユニファイア
16
ユニフィケーションユニフィケーションユニフィケーションユニフィケーション(unification)
append([1,2], [3], q) と append([x|y], z, [x|w]) が
同一の表現になるよう、変数の置換(substitution)を行う。
得られた変数の置換の集合をユニファイアユニファイアユニファイアユニファイア(unifier)とよぶ
ユニファイア
appendの実行(リストの結合)
<- append([1,2], [3], q)
append([x|y], z, [x|w]) <- append(y,z,w)
x=1, y=[2], z=[3], q=[1|w]
<- append([2], [3], w)
append([], x, x) <-
append([x|y], z, [x|w]) <- append(y,z,w)
計算計算計算計算
17
<- append([2], [3], w)
append(y,z,w) にユニファイアを適用し、
append([2],[3],w) を得る
appendの実行(リストの結合)
<- append([1,2], [3], q)
append([x|y], z, [x|w]) <- append(y,z,w)
x=1, y=[2], z=[3], q=[1|w]
<- append([2], [3], w)
append([], x, x) <-
append([x|y], z, [x|w]) <- append(y,z,w)
計算計算計算計算
18
<- append([2], [3], w)
append([x’|y’], z’, [x’|w’]) <- append(y’,z’,w’)
x’=2, y’=[], z’=[3], w=[2|w’]
<- append([], [3], w’)
append([], x”, x”) <-
x”=[3], w’=[3]
□
空節(□)を得るまで繰り返す
appendの実行(リストの結合)
<- append([1,2], [3], q)
append([x|y], z, [x|w]) <- append(y,z,w)
x=1, y=[2], z=[3], q=[1|w]
<- append([2], [3], w)
append([], x, x) <-
append([x|y], z, [x|w]) <- append(y,z,w)
計算計算計算計算
19
<- append([2], [3], w)
append([x’|y’], z’, [x’|w’]) <- append(y’,z’,w’)
x’=2, y’=[], z’=[3], w=[2|w’]
<- append([], [3], w’)
append([], x”, x”) <-
x”=[3], w’=[3]
□
q=[1,2,3]
解解解解 ゴール append(.., q) の変数qの置換が
解となる
appendの実行(リストの分解)
<- append([1], q, [1,2,3])
append([x|y], z, [x|w]) <- append(y,z,w)
計算計算計算計算
リストの結合だけではなく、分解も可能
関数ではなく関係を定義することによるメリット
[1,2,3]を結合結果とするすべての候補(全解探索)を計算することも
可能
20
append([x|y], z, [x|w]) <- append(y,z,w)
x=1, y=[], z=q, w=[2,3]
<- append([], q, [2,3])
x’=[2,3], q=[2,3]
append([], x’, x’) <-
□
q=[2,3]
解解解解
また別の例:ギリシャの神々の系図
Father(Zeus, Ares) <-
Mother(Hera, Ares) <-
Father(Ares, Harmonia) <-
Mother(Aphrodite, Harmonia) <-
Father(Cadmus, Semele) <-
Mother(Harmonia, Semele) <-
Father(Zeus, Dionysus) <-
Mother(Semele, Dionysus) <-
God(Zeus) <-
God(Hera) <-
Zeus == Hera
Ares == Aphrodite
Cadmus == Harmonia
21
God(Hera) <-
God(Ares) <-
God(Aphrodite) <-
Fairy-princess(Harmonia) <-
Female(x) <- Mother(x, y)
Male(x) <- Father(x, y)
Parent(x, y) <- Mother(x, y)
Parent(x, y) <- Father(x, y)
Grandparent(x, y) <- Parent(x, z), Parent(z, y)
※ “Kowalski, Logic for Problem Solving, 1979” より
Zeus == Semele
Cadmus == Harmonia
Dionysus
トップダウン推論
HarmoniaのGrandparentを求める
(1)の節では、どちらのParentアトムを先に導出してもよい
<- Grandparent(u, Harmonia)
Grandparent(x, y) <- Parent(x, z), Parent(z, y)
22
<- Parent(u, z), Parent(z, Harmonia) …(1)
<- Father(u, z), Parent(z, Harmonia)
<- Mother(u, z), Parent(z, Harmonia)
Parent(x, y) <- Father(x, y)
Parent(x, y) <- Mother(x, y)
<- Parent(u, z), Father(z, Harmonia)
<- Parent(u, z), Mother(z, Harmonia)
Parent(x, y) <- Father(x, y)
Parent(x, y) <- Mother(x, y)
トップダウン推論
探索空間はAND/OR木となる
23
ボトムアップ推論
公理を増やしていく処理に対応
トップダウンと組み合わせて、両方向推論も
中間でのmeet処理が難しい
24
AND/OR並列
“計算”はAND/OR木からなる探索空間における解
の探索に相当
ANDのリンクを並列に処理することをAND並列、
ORのリンクを並列に処理することをOR並列という
OR並列は実装容易。けれど不用意に行うと、計算が爆
発する発する
AND並列は互いの依存関係が強いため実現困難
25
異形の論理型言語システム
導出原理(resolution principle)
2つの節から論理的帰結として、1つの節を得るための演算
1965年、R. Kowalski がユニフィケーション・アルゴリズムとともに定
式化
導出法
導出原理に完全性保証のための手順を加味したもの
完全性を持った導出法の例
線形導出(linear resolution)
入力導出(input resolution)
単位導出(unit resolution)
SLD導出(Selective Linear Definite resolution)
27
導出をユニファイア分離導出に拡張
ユニファイア分離導出(U-導出)は導出と互換な拡張
ユニファイアを別に扱える(+はcombinatorと呼ぶ演算)
θ= mgu(Bλ, Pμ)
θ
(A <- B, C) λ
(P <- Q, R)μ
導出導出導出導出
28
θ= mgu(Bλ, Pμ)
Aλθ <- Qμθ, Rμθ, Cλθ
φ= mgu(B, P)
(A <- B, C) λ
(P <- Q, R)μ
φ
(A <- Q, R, C)(λ+μ+φ)
U-導出導出導出導出
コンビネーション(combination)
ユニファイアσ, τのコンビネーションσ+τは、次の条
件を満たすθのうちの最汎(most general)な置換
あるζ, ηが存在して、σζ=τη=θ
代数的には交換法則、結合法則が成り立つ
例:
ここで、Tは矛盾置換ここで、Tは矛盾置換
{a/x} + {b/x} = T
{x/y} + {y/z} = {x/y, x/z}
{f(z)/x} + {f(a)/x} = {f(a)/x, a/z}
29
SLD導出の例
G0: <- append([1,2], [3], q)
append([x|y], z, [x|w]) <- append(y,z,w)
σ1={1/x, [2]/y, [3]/z, [1|w]/q}
G1: <- append([2], [3], w)
計算計算計算計算
プログラムプログラムプログラムプログラム
F: append([], x, x) <-
R: append([x|y], z, [x|w]) <- append(y,z,w)
30
G1: <- append([2], [3], w)
append([x’|y’], z’, [x’|w’]) <- append(y’,z’,w’)
σ2={2/x’, []/y’, [3]/z’, [2|w’]/w}
G2: <- append([], [3], w’)
append([], x”, x”)
σ3={[3]/x”, [3]/w’}
G3: □
解解解解
σ1σ2σ3|{q}={[1,2,3]/q}
SLD導出の例(U-導出の場合)
G0: <- append([1,2], [3], q)
append([x|y], z, [x|w]) <- append(y,z,w)
σ1={1/x, [2]/y, [3]/z, [1|w]/q}
G1: <- append(y, z, w) σ1
計算計算計算計算
プログラムプログラムプログラムプログラム
F: append([], x, x) <-
R: append([x|y], z, [x|w]) <- append(y,z,w)
31
G1: <- append(y, z, w) σ1
append([x’|y’], z’, [x’|w’]) <- append(y’,z’,w’)
θ1={[x’|y’]/y, z’/z, [x’|w’]/w}
G2: <- append(y’, z’, w’) (σ1 + θ1)
append([], x”, x”)
θ2={[]/y’, z’/x”, w’/x”}
G3: □ (σ1 + θ1 + θ2)
解解解解
(σ1 + θ1 + θ2) |{q}={[1,2,3]/q}
U-導出の特徴
計算木においては、縮約(reduction)に相当する操作
φ= mgu(B, P)
A <-
B, C
P <-
Q, R
λ
μ
A <-
Q, R, C λ + μ + φ
縮約
reduction
32
ユニファイアにおける合流性(Church-Rosser)
reduction
A <-B, C : ε
A <- C : φ A <- B : σ
A <- : φ + σ
C <- を適用B <- を適用
B <- を適用C <- を適用
AND/ORグラフ上での縮約
<-
append([1,2], [3], q)
append([x|y], z, [x|w]) <-
append(y, z, w)
G0:
R: ORアーク
ANDアーク
節ノード
33
append([], x, x) <-F:
G0
R
F
R’
R
F
G0
G1
G1
R
F
R”
R
F
G1
G2 G2
R
F
F
G2
G3
⇒→ → ⇒ →
→ 展開
⇒ 縮約
計算計算計算計算 = グラフの展開と縮約グラフの展開と縮約グラフの展開と縮約グラフの展開と縮約
ここで対象をユニファイアだけにする
UP(Unifier Piece)
節とユニファイアのテンプレート表現
変数名はなくなり、接点に変化する
q
G
UP(節ノード)(節ノード)(節ノード)(節ノード) UP((((ORアーク)アーク)アーク)アーク)
G -R
34
q
G0
x
F
x y z w
R
y z w
1 [2] [3] ・
1
G0-R
・ ・R-R
R-F []
UPグラフ
q
q
G0
1 [2] [3] ・
1
AND/ORグラフと違い、
変数(接点)とtermしか
現れない
combinationの失敗に
より、不要なORアーク
は除外される
35
x
F
x y z w
R
y z w
[]
・ ・
UPグラフの縮約
q
q
1 [2] [3] ・
1
[2] [3] ・
1
q
⇒
グラフの展開・縮約過程でUPのcombinationが起こる
一連のcombinationの結果、解が得られる
36
x y z w
y z w
y z w
x y z w
y z w
・ ・
[] [3] ・
[1,2]
q
y z w
x
[]
[1,2,3]
q
⇒
⇒
導出木、AND木、UPと解の関係
G0
R
F
F: append([], x, x) <-
R: append([x|y], z, [x|w]) <- append(y,z,w)
G0: <- append([1,2], [3], q)
G0: <- append([1,2], [3], q)
R
σ1={[1|w]/q}
G0
1 [2] [3] ・
1
q
プログラムプログラムプログラムプログラム
導出木導出木導出木導出木 AND木木木木 UPの結合の結合の結合の結合
AND/ORグラフグラフグラフグラフ
解解解解
37
G1: <- append([2], [3], w)
σ2={[2|w’]/w}
G2: <- append([], [3], w’)
F
σ3={[3]/w’}
G3: □
σ1σ2σ3={[1,2,3]/q}
R
R
R
F
・ ・
x
[]
解解解解
[1,2,3]
q
⇒
全UPの
combination
導出木、AND木、UPと解の関係
G0
R
F
F: append([], x, x) <-
R: append([x|y], z, [x|w]) <- append(y,z,w)
G0: <- append([1,2,3], [4], q)
1 [2,3] [4] ・
1
q
プログラムプログラムプログラムプログラム
導出木導出木導出木導出木 AND木木木木 UPの結合の結合の結合の結合
AND/ORグラフグラフグラフグラフ
解解解解
G0: <- append([1,2,3], [4], q)
R
σ1={[1|w]/q}
G0
38
G1: <- append([1,2], [4], w)
R
σ2={[2|w’]/w}
G2: <- append([2], [4], w’)
σ3={[3|w”]/w’}
G3: <- append([], [4], w”)
F
σ4={[4]/w”}
G4: □
σ1σ2σ3σ4={[1,2,3,4]/q}
R
R
R
R
F x
[]
解解解解
[1,2,3,4]
q
⇒
解解解解
全UPの
combination
・ ・
・ ・
解が確定した場合の計算コスト
UPの構成が単純なappendの例で可能性を見てみる
<- append([1,2,..,n], [n+1, ..], q) の解は、n+1個のUPから構成される
C
C
C
C
C
C
C
C
C
UPs UPs
combination
operator
n+1
39
・・・
C
従来の方法
計算量:O(n)
計算時間(遅延):O(n)
C
C
C
C
2分木状に行う combination
計算量:O(n)
計算時間(遅延):O(log n)
・・・
もっとうまくやると...
計算量:O(log n)
計算時間(遅延):O(log log n)
answer
answer
解を求めるための戦略
論理プログラムにおいて、“計算=探索”
アプローチ
トップダウン、ボトムアップ、両方向
ヒューリスティック (ex. SATソルバー)
プログラマが指示(ex. Prologのcutオペレータ)
UPモデルの場合は、UPの組み合わせパターンを生
成し、UPのcombinationを行うことにより、いち早く
無矛盾な組み合わせ(解)を探し出すことに相当
解とならないUPの組み合わせは全体のcombinationの
途中で矛盾置換となる
“Generate And Test”
40
トップダウンサーチ
appendの例でサーチの概要を示す
UP gからスタートし、UP rを結合させながら、
UP fとの結合が成功するまで順に進める
g
・・・
r
r
f
C
g
f
fail C
g
f
fail C
g
f
fail C
g
f
fail
step1 step2 step3 step4,5
UPの構成
41
C
r OK
C
r C
f
fail C
r C
f
fail
C
r
ansC
f
トップダウンサーチを実現するトップダウンサーチを実現するトップダウンサーチを実現するトップダウンサーチを実現するDFG
C
f
C
r
g
ans
・点線矢印は同期のためのトークン
が流れるリンク
・Cオペレータは入力(実線矢印)の
片方が変化するだけでも発火する
ボトムアップサーチ
同様に、appendの例でサーチの概要を示す
トップダウンとは逆に、UP fからスタートする
計算結果を再利用できること(部分計算)がポイント
C
g
fail C
g
fail
r
C
g
fail
r
C
g fail
ansC
step1 step2 step3 step4,5
C
g fail
r
C
g fail
r
C
g
42
f f
C
OK f
C
ans
C
g
C
r
f
ans
C
ボトムアップサーチを実現するボトムアップサーチを実現するボトムアップサーチを実現するボトムアップサーチを実現するDFG
f
C
C
g
・・・
r
r
f
UPの構成
サーチ処理の並列化
appendのようなケースは、プロセッサの数だけ並列化可能
1つずつ generate and test するのでなく、k個単位で行う
トップダウンサーチを実現するトップダウンサーチを実現するトップダウンサーチを実現するトップダウンサーチを実現するDFG
C
f
C
r
トップダウンサーチを実現するトップダウンサーチを実現するトップダウンサーチを実現するトップダウンサーチを実現するDFG (k=4)
C
r
g
43
r
r
C
C
r
r
r
r
r
r
C
r
r
r
r
C
f
C
f
C
C
f
C
C
r2
r3
r4
g
ans
r2
r3
r4
C
f
g
ans
言語マシンのチップイメージ
C
R
UPをcombination
UPをカットスルー
言語マシン(FPGA製チップ)
PEをマトリックス状に配置
インターコネクトは、2次元トーラス
PE(Processor Element)
2つのUPストリームをcombinationする
UPストリームを転送(カットスルー)する
44
UPストリーム
UPのシリアライズドデータ(不定長)
ヘッダに制御情報(アドレス)を持つ
FPGAの可能性
脱ストアドプログラム方式
例えば、今回の異形システムでは、従来のCPUに相当す
る機構を持たない
プログラムカウンタ、ロード、ストア、ブランチ命令、スタック、キャ
ッシュ、共有メモリなど
従来のプログラムローディングの概念は、
プロセッサのリコンフィグレーションに置き換わるプロセッサのリコンフィグレーションに置き換わる
データフローマシンを作りやすい
脱フォン・ノイマン・アーキテクチャ
PEにおいては、バイトストリームの演算を遅延なく行うこ
とがポイント
ちなみにFPGAですから、バイト単位にする必要はありません^^
PE間のインターコネクトをどう作るかは大きな課題
45
ご清聴ありがとうございました

130604 fpgax kibayos