並カンに参加してきた

とてもいいイベントでした。ひさしぶりにわくわく感のある技術勉強会でした。主催者のmootohさんや、発表者やお手伝いのかたがた、参加者のみなさまありがとうございました。

今回は、ErlangScalaがなかったのは以外だったけど、低レベルの部分での並列のお話は大変刺激的でした。以下は、当日のメモを貼るだけの簡単なお仕事

= mootohさん あいさつ
* (書籍)並列プロラムのつくりかたは良書 
* free lunch is over.
* multi core is everwher
** Apple の A4 は、マルチコアっぽい
* 基本は並列処理で、逐次処理は並列処理の特殊な制限事項ととらえるべき

= wraith13さん おさらい
*数秒以上かかる処理は進捗状況や、キャンセルもできるようにしたほうがいいよ
* 問題点
** ロックとかのデバッグがむずい
** ブラックリスト的手法
*** ロックするところだけカプセル化
** テスタビリティの困難さ
*** 網羅性がむずい
** 変化するビットの数により、見える値がかわることがある
*** 1(01)が2(10)に変化するとき、3(11)にみえるタイミングがある
** シングルトンオブジェクトの初期化問題
** アウトオブオーダー実行
*** CPUが書いたとおりに動いてくれない
*** メモリバリアで回避できる
** スレッドローカルストレージ
*** スレッド別のデータの保存先
*** スレッド共有でつかいたいオブジェクトにこれがつかわれているとはまる
** それぞれのスレッドが同じ速度でうごくとはかぎらない
** コンテキストスイッチのオーバーヘッドも馬鹿にならない
** キャッシュミスヒットも考慮すべき
** ロック、メモリバリアのオーバーヘッド
* コツ
** ステートレス
*** 共有される状態をもたないことが重要で、個別にもつのはok
** ロックフリー
*** デッドロック、オーバーヘッドを回避できる
* CPUの並列対応
** ハイパースレッディング
** マルチコア
** マルチプロセッサ
* 並列動作
** プロセス
** スレッド
** ファイバ-
*** コンテキストスイッチを明示的におこなうやつ
** コルーチン
*** ファイバーを言語が実装していると、そうよばれる

= goyokiさん ローレイヤー
* 組み込み並列処理 FPGA/HDL
* 組み込みでは、リアルタイム性が必要なので、シングルタスク+ワリコミで並列しょりしている
** 難しい
* HDLは書くと並列実行になる
** wire : 配線
** wire の代入。配線される
** reg : 値を保持するデータ型
** reg に対する代入。
*** = ブロッキング代入 逐次
*** <= ノンブロッキング代入 並列
** クロック同期型FFを複数うめこむことで、タイミングの調整をする

= hayamizさん STM
* TM
** 並列プログラムの同期手法の1つ
** ロックの問題の1部を解決してくれるだけで、置き替えはできない
** クリティカルセクションをつかうかわりにトランザクションをつかう
** スレッド間で衝突がおきると、ポリシーにしたがって、どっちかをリスタートする
** 投機的で楽観的な手法
* HTM (Hardware)
** 最近まではシュメレータでの実装のみ
** SUNがつくりそうだったけど。。。
* STM (Software)
** 競合しなくても遅くなる(2〜3倍程度)
*** 共有メモリへのアクセスが関数呼びだしになるので、命令数がおおくなるのでおそくなる
** リスタートできる命令しかかけない
*** I/Oがかけない

= syoyoさん MUDA
* MUDA
** http://lucille.sourceforge.net/muda/
** DSL
** 言語とランタイムの2つ
* メリット
** マルチターゲット

= yamasaさん lock free アルゴリズム
* ポインタを用いたLock-free
** 対象をポインタでもつようにする
** 現在のオブジェクトをもとに、更新後オブジェクトを更新して、そちらを指すようにする
** ポインタの書き換えはアトミックでないといけない
*** c++0xならアトミックなポイント型がつかえる
** Compare-and-swap(CAS)命令
** STMと基本はおなじ
* Lock-freeアルゴリズムの落し穴
** リオーダー
*** 命令の実行順序がアウトオブオーダーで変えられること
*** メモリバリア重要
*** メモリバリアをatomic命令の前後にいれる
** メモリリーク
*** shared_ptr ってもだれ
**** shared_ptr やると参照の更新がはしるので、メモリアクセスが増え遅くなる
*** Hazard pointer
**** スレッド度に用意されるポインタ変数
**** 書き込みは所有者のみで、読み込みは誰でも自由
** GCある言語で勉強すべき

= shelarcyさん Haskell
* Haskellだと並列処理が言語処理系で隠蔽できる
** GHC, GpH,
* GHC
** 並列Haskell
** 並行Haskell
*** Control.Parallel.Strategies
**** using で strategies aをわたして、並列か遅延かイーガーかを決める
** Black Holing
* DPHの人達はmacで開発しているので、dtraceはいってる
* eprocess
** Erlang形式の並行処理パッケージ

あと、トゥギャザッターで当日の#namikanのポストを勝手にまとめましたのでどうぞ。編集も可なのでよろしくおねがいしますhttp://togetter.com/li/4515