IIJ Technical WEEK 2014 1日目 #iij_tw2014

IIJのエンジニアによるイベントIIJ Technical WEEK 2014 1日目の模様です。 1日目のセッション - SDNソフトウェアスイッチLagopus - マルチコア時代の最新並列並行技術 ~ Haskellから見える世界 ~ - IIJ社内におけるアジャイル開発、DevOpsへの取り組み 続きを読む
4
前へ 1 2 3 ・・ 7 次へ
堂前@IIJ @IIJ_doumae

「並列」「並行」についての共通の理解がない。話を始める前には最初に定義を述べないと、話が通らない。まず、今回の発表における定義を述べます。 #iij_tw2014 bit.ly/iij_tw2014

2014-11-26 14:42:24
堂前@IIJ @IIJ_doumae

並列: 計算を速くする。複数のCPUが必須。結果は一意、コア数によって結果は変わらない。例)数値演算 並行: 複数の対話を同時(のように)扱う、CPUは一つでもよい。結果は状況によって異なる。例)webサーバ #iij_tw2014 bit.ly/iij_tw2014

2014-11-26 14:44:14
堂前@IIJ @IIJ_doumae

今回の話ではマルチコアの話身を対象にします。map reduceのような分散環境は今回の話題の対象外とします。 #iij_tw2014 bit.ly/iij_tw2014

2014-11-26 14:44:53
堂前@IIJ @IIJ_doumae

並列に言語レベルで取り組んでいる言語。 関数型: Haskell, Scala 命令型: Java, その他多数 #iij_tw2014 bit.ly/iij_tw2014

2014-11-26 14:45:34
堂前@IIJ @IIJ_doumae

並行に取り組んでいる言語 関数型: Haskell(軽量スレッド), Erlang(軽量プロセス) 命令型: Go(高機能コルーチン), Rust (軽量プロセス) 言語によって提供している機能が違う。 #iij_tw2014 bit.ly/iij_tw2014

2014-11-26 14:46:43
堂前@IIJ @IIJ_doumae

Haskellは並列にも並行にも取り組んでいる唯一の言語。研究と実用性を兼ね備えた言語である。 #iij_tw2014 bit.ly/iij_tw2014

2014-11-26 14:47:29
堂前@IIJ @IIJ_doumae

これまでの並列・並行技術: OSスレッド・ロック この二つがあればほとんどの並列・並行処理は記述できるが、機能が低レベルのため正しく扱うのは困難。 #iij_tw2014 bit.ly/iij_tw2014

2014-11-26 14:48:24
堂前@IIJ @IIJ_doumae

Haskellの並列・並行に関する哲学「ナイフだけではすべてのものは切れない」様々な技術を提供することで、多様な課題に取り組みという考え方。 #iij_tw2014 bit.ly/iij_tw2014

2014-11-26 14:49:04
堂前@IIJ @IIJ_doumae

Haskellが提供する複数の「刃物」 並列: タスク並列・データ並列・GPU上のデータ並列・データフロー並列 並行: 軽量スレッド・不変データ・CAS・STM #iij_tw2014 bit.ly/iij_tw2014

2014-11-26 14:50:02
堂前@IIJ @IIJ_doumae

Haskellには関数プログラミングの部分と、命令プログラミングの部分が明確に分けることが必要になる。関数プログラミングは副作用がない(純粋数学関数)。命令プログラミングは副作用がある(入出力や破壊的代入)。 #iij_tw2014 bit.ly/iij_tw2014

2014-11-26 14:52:13
堂前@IIJ @IIJ_doumae

Haskellでは副作用のあるコードから副作用のないコードは呼び出せるが、その逆は絶対にできない。副作用がないコードは副作用がないことが保証される。 関数プログラミングは並列、命令プログラミングは並列を提供。 #iij_tw2014 bit.ly/iij_tw2014

2014-11-26 14:53:08
堂前@IIJ @IIJ_doumae

Haskellの並列技術について。 タスク並列: 処理を依存関係のないように分割して並列化 データ並列: データを依存関係のないように分割して並列化 #iij_tw2014 bit.ly/iij_tw2014

2014-11-26 14:54:28
堂前@IIJ @IIJ_doumae

二つの並列の違いを例示してみる。 命題) N枚のカラー画像を白黒に変換する タスク並列: 画像毎にコアを割り当て、画像全体を処理 データ並列: 分割した画像にコアを割り当てて処理 (画像1枚ずつ処理される) #iij_tw2014 bit.ly/iij_tw2014

2014-11-26 14:55:49
堂前@IIJ @IIJ_doumae

データフロー並列: データの依存関係をプログラマが記述する。 #iij_tw2014 bit.ly/iij_tw2014

2014-11-26 14:56:23
堂前@IIJ @IIJ_doumae

mapによるタスク並列。リストの各要素をそれぞれのコアで処理する。関数型には必ずmap関数がある。関数型ではmapが使われて入ればタスク並列にできる。副作用がない世界なのでそれぞれの処理には依存関係はない。 #iij_tw2014 bit.ly/iij_tw2014

2014-11-26 14:58:00
堂前@IIJ @IIJ_doumae

GoogleのMap Reduceと同じ?順番が逆。関数型言語のmapに着想を得て分散環境に実装したのが、Map Reduce。 #iij_tw2014 bit.ly/iij_tw2014

2014-11-26 14:59:05
堂前@IIJ @IIJ_doumae

各言語での並列化の例。処理に「魔法」をつけると並列化される。その部分を削っても結果は同じ。実行されるコア数が違うだけだから。並列化すれば結果が速く得られるだけ。 #iij_tw2014 bit.ly/iij_tw2014

2014-11-26 15:00:45
堂前@IIJ @IIJ_doumae

Haskellでの並列の使い方。コンパイル済み実行ファイルに対し、実行時に使用するコア数を指定する。(並行処理の場合もこの方法で使用するコア数を指定する) #iij_tw2014 bit.ly/iij_tw2014

2014-11-26 15:02:00
堂前@IIJ @IIJ_doumae

Haskellでのデータ並列ライブラリ。CPU処理するRepa。GPUで処理するAccelerate。同じ組織が開発しているので使い方は似ている。ライブラリが提供する関数を使うと自動的に並列性が抽出される。 #iij_tw2014 bit.ly/iij_tw2014

2014-11-26 15:03:16
堂前@IIJ @IIJ_doumae

データフロー並列: 例: h(x) = f(x)+g(x) 明らかに f(x)とg(x)は並列に実行可能。 このデータの依存関係を明示的に記述すると、並列性が自動的に抽出され、高速に実行される。 #iij_tw2014 bit.ly/iij_tw2014

2014-11-26 15:05:32
堂前@IIJ @IIJ_doumae

ここでは話を単純化して説明している。直列のコードを何でも並列化できるわけではない。並列化できる形に書き換えることが必要。 実践的には、理論上の限界を知り、それに向かってチューニングすることが必要。 #iij_tw2014 bit.ly/iij_tw2014

2014-11-26 15:06:45
堂前@IIJ @IIJ_doumae

理論上の限界とは?アムダールの法則で求めることができる。9割の部分が並行実行できる場合でも、20コアで7倍程度の性能向上。8コアあるから性能8倍にはならない。「やってみた」記事では理論を理解していないことが多い #iij_tw2014 bit.ly/iij_tw2014

2014-11-26 15:09:16
堂前@IIJ @IIJ_doumae

Threadscope ログを可視化するツール。どの部分が並列で実行されているかを見ることができる。コアを十分に活用できていないところが見えたり、I/O部分は直列で実行されているなど。 #iij_tw2014 bit.ly/iij_tw2014

2014-11-26 15:10:09
堂前@IIJ @IIJ_doumae

Haskellの並行技術について。紹介のためのストーリーを決める。複数のクライアントを処理するWebサーバを作る場合。 #iij_tw2014 bit.ly/iij_tw2014

2014-11-26 15:11:14
堂前@IIJ @IIJ_doumae

クライアントが一つだけなら一直線なコードでよい。複数のクライアントを扱うために様々技術を使う必要がある。 #iij_tw2014 bit.ly/iij_tw2014

2014-11-26 15:12:05
前へ 1 2 3 ・・ 7 次へ