マルチコア時代の 並列プログラミング ~ロックとメモリオーダリング~

Slides:



Advertisements
Similar presentations
HBSP モデル上での 行列積を求めるアルゴリ ム 情報論理工学 吉岡健太.
Advertisements

MPIを用いたグラフの並列計算 情報論理工学研究室 藤本 涼一.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
Generic programming と STL
第3回 並列計算機のアーキテクチャと 並列処理の実際
連続系アルゴリズム演習 第2回 OpenMPによる課題.
情報理工学系研究科 コンピュータ科学専攻 上嶋裕樹
07. 値予測 五島 正裕.
メモリコンシステンシモデル memory consistency model
07. 値予測 五島 正裕.
ヘテロジニアスマルチコアプロセッサ 環境を対象としたキャッシュシステム 自動生成ツールの開発
Chapter11-4(前半) 加藤健.
並列処理実用? 並列処理により、 現在時間がかかって実用しづらい処理を、 早くして実用にする 1時間 =1/10⇒ 6分
Java I 第2回 (4/18)
スレッドの同期と、スレッドの使用例 スレッドの同期 Lockオブジェクト: lockオブジェクトの生成
全体ミーティング (4/25) 村田雅之.
Android Development 白熱道場
報告 (2006/9/6) 高橋 慧.
キャッシュ 頻繁にアクセスされるデータを入れておく小規模高速なメモリ 当たる(ヒット)、はずれる(ミスヒット) マッピング(割り付け)
仮想マシンの並列処理性能に対するCPU割り当ての影響の評価
情報工学概論 (アルゴリズムとデータ構造)
全体ミーティング (6/13) 村田雅之.
分散遺伝的アルゴリズムによる各種クラスタのベンチマーク
応用情報処理V 第1回 プログラミングとは何か 2004年9月27日.
プログラミング論 II 電卓,逆ポーランド記法電卓
C言語で苦しむロックフリー入門(仮)
①データ構造 ②アルゴリズム ③プログラム言語 ④マークアップ言語
応用情報処理V 第1回 プログラミングとは何か 2003年9月29日.
Ibaraki Univ. Dept of Electrical & Electronic Eng.
Web 2.0 Conference 2005 実行時自己書き換え佳境 首藤 一幸 話の流れのスライドを加える?
CC/7700,CC32を用いた データ収集システム 筑波大学 木村 博美 小松原 哲郎 (c)2007 木村博美 筑波大学.
CONCURRENT PROGRAMMING
第9回 プロセスの協調と排他制御 並行プロセスと資源の競合 競合問題 セマフォ 不可分命令の実装 プロセス間通信 PV命令
速報: Boehm GC version 6.0α1 遠藤 敏夫.
MPIによる行列積計算 情報論理工学研究室 渡邉伊織 情報論理工学研究室 渡邉伊織です。
型付きアセンブリ言語を用いた安全なカーネル拡張
アドバンスト コンピュータ アーキテクチャ 五島.
2009/10/16 いろいろなデータ構造 第3講: 平成21年10月16日 (金) 4限 E252教室 コンピュータアルゴリズム.
Lazy Release Consistency
RT-Linuxを用いた 多入力パルス波高分析システムの開発
C言語でスレッド (Pthread) 2007年1月11日 海谷 治彦.
11. マルチスレッド・プロセッサ 五島 正裕.
Cache Organization for Memory Speculation メモリ投機を支援するキャッシュの構成法
梅澤威志 隣の芝は茶色いか 梅澤威志
リモートホストの異常を検知するための GPUとの直接通信機構
Advanced Computer Architecture
アルゴリズムとデータ構造 補足資料11-1 「mallocとfree」
仮想計算機を用いたサーバ統合に おける高速なリブートリカバリ
通信機構合わせた最適化をおこなう並列化ンパイラ
依存型で型付けされた 副作用のある関数のための 型保存コンパイラ
メモリ投機を支援する CMPキャッシュコヒーレンスプロトコルの検討
未使用メモリに着目した 複数ホストにまたがる 仮想マシンの高速化
08. メモリ非曖昧化 五島 正裕.
計算機工学III オペレーティングシステム #4 並行プロセス:排他制御基礎 2006/04/28 津邑 公暁
そろそろvolatileについて一言いっておくか
VMが利用可能なCPU数の変化に対応した 並列アプリケーション実行の最適化
09. メモリ・ディスアンビギュエーション 五島 正裕.
コンピュータアーキテクチャ 第 9 回.
全体ミーティング (5/23) 村田雅之.
米澤研究室 全体ミーティング 2010/07/07 M2 渡邊裕貴.
Mondriaan Memory Protection の調査
BSPモデルを用いた 並列計算の有用性の検証
オペレーティングシステムJ/K (並行プロセスと並行プログラミング)
コンピュータアーキテクチャ 第 9 回.
MPIを用いた並列処理計算 情報論理工学研究室 金久 英之
SMP/マルチコアに対応した 型付きアセンブリ言語
高度プログラミング演習 (11).
3 分散システムのフォールトトレランス 分散システム Distributed Systems
全体ミーティング (9/12) 村田 雅之.
Presentation transcript:

マルチコア時代の 並列プログラミング ~ロックとメモリオーダリング~ 中村 実 nminoru@nminoru.jp http://www.nminoru.jp/~nminoru/

まずは自己紹介を 電機メーカー勤務のエンジニア 趣味で Web に細々とプログラミングのメモを綴る日々 Java VM、特に並列GC・JITコンパイラの研究・開発 Java系雑誌にときどき寄稿 最近はIA-64と戯れる日々 趣味で Web に細々とプログラミングのメモを綴る日々 御縁がありまして Binary Hacks の著者の末席を汚すことに

Binary Hacks #94 プロセッサのメモリオーダリングに注意 CPU は Out-of-order 実行 高速化のために load/store の順序を入れ替える Load 命令は早く (投機実行) Store 命令は遅く (Store buffering) メモリオーダリング(memory ordering) CPU に許されているメモリ順序の規約 意図した通りの順序で実行させるにはメモリバリア(フェンス命令)が必要

Binary Hacks #94 プロセッサのメモリオーダリングに注意 Store Buffer Store 命令をより早く完了させるための機構 Register Store Buffer Store3 Store buffer Load Store2 Cache Store1 Main memory Main memory/cache

Binary Hacks #94 プロセッサのメモリオーダリングに注意 読者の方の感想 どういうプログラムでメモリオーダリングを気にする必要があるのかよくわからない Pthread の mutex や IPC の semaphore ではダメなのか? Cmpxchg 命令でいいのでは? そこで今日の発表 メモリオーダリングが問題になるような並列プログラムのテクニックとして Lock-free synchronization を紹介 「マルチコア時代の並列プログラミング」というタイトルはオーバーだったかも orz

並列プログラムのモデル 今回のお話のターゲットとなるモデルは × × ○ スレッドがたくさん (Webアプリとか) スレッドはコアにバインド スレッド間の依存がない/少ない ⇒ メモリスループットがボトルネック スレッド間通信が多い × × ○ 例えば・・・ 並列GCとか

マルチコア時代の並列プログラム マルチコアでは mutex がボトルネックになる(かも) コアが増えると衝突(conflict)が増加 衝突時にスレッドがサスペンドしてもうれしくない 従来 マルチコア CPU CPU CPU CPU CPU CPU Thread Thread ・・・ Thread Thread Thread Thread Thread Thread Thread Thread

Mutex や spin lock などに替わる うまいスレッド同期処理はある? ある!! Lock-free synchronization

Lock-free synchronization 特徴 ロック状態がない。よって高速。 スレッドスケジューリングからの影響が小さい 実現方法 アトミック命令の組み合わせで実現 CAS (compare and swap) → x86 では cmpxchg命令 LL/SC (load linked/store conditional) どういうデータ構造があるの? Deque, FIFO, LIFO 単方向リスト,双方向リスト, Set, Hash 次から lock-free なアプローチのいくつかを紹介

Sequence lock Optimistic lock (楽観的なロック) 任意のデータ + counter 読み込みスレッドだけなら lock-free 書き込みスレッドは lock が必要 Counter が偶数なら解放、奇数なら占有状態 読み込み 書き込み Read counter Read data と読んで、1が奇数か、 1≠3なら失敗。 data を破棄してリトライ counter Counter が偶数なら CAS 命令で +1 data を書き換え Counter をさらに +1 data

Read Copy Update (RCU) 単方向リスト 書き込みの遅延を許す アトミック命令が不要 data data data Reader data data data Writer

Read Copy Update (RCU) 単方向リスト 書き込みの遅延を許す アトミック命令が不要 data data data Reader data data data copy data Writer

Read Copy Update (RCU) 単方向リスト 書き込みの遅延を許す アトミック命令が不要 data data data Reader data data data data Writer

Read Copy Update (RCU) 単方向リスト 書き込みの遅延を許す アトミック命令が不要 GCで回収 data data Writer

Double-ended Queue (Deque) N.Arora et al.,”Thread scheduling for multiprogrammed multiprocessors”,SPAA 1998 OS 内部のタスクキューのために考えられた deque 片側が所有スレッド用、もう片側は他スレッド用 所有スレッドだけがデータを push できる Pushもpopもlock-free かつ、通常時はアトミック命令も不要 Sun HotSpot VM の並列GCなどで利用されている。 Other threads Owner thread

その他 Deque M.Micheal, “CAS-based lock-free algorithm for shared dequeues”, EuroPar 2003 双方向リスト H.Sundell, “ Lock-free and practical doubly linked list-based deques using single-word compare-and-swap”, OPODIS 2004 NOBLE - a library of non-blocking synchronization protocols http://www.cs.chalmers.se/~noble/

どうやってプログラムするの? 基本は論文を読んで実装!! ライブラリもあるよ 情報はどこに? Lock-free synchronizationは、アプリケーションに合わせてデータ構造を調整して使う必要あり ライブラリもあるよ Ross Bencina 氏のページ http://www.audiomulch.com/~rossb/code/lockfree Lock-free & wait-free アルゴリズムの実装のリストがある Lock-free library http://www.cl.cam.ac.uk/research/srg/netos/lock-free/ Alpha, MIPS, IA-64, x86, PPC, SPARC で動作 GPL 下でソース公開 情報はどこに? 意外にも wikipedia が充実 http://en.wikipedia.org/wiki/Lock-free_and_wait-free_algorithms

問題点もある 衝突(conflict)が少ないプログラムでは、mutex と性能に差がない アルゴリズムが複雑 実装が難しい 複雑なものはバグの源 実装が正しいことの論理検証が困難 実装が難しい CPU の out-of-order 実行によるメモリ順序の逆転が問題に ようやく話がメモリ・オーダリングに繋がった (^_^)/

3つの read の順番が守られていないとアルゴリズムが破綻 Sequence lock Optimistic lock (楽観的なロック) 任意のデータ + counter 読み込みスレッドだけなら lock-free 書き込みスレッドは lock が必要 Counter が偶数なら解放、奇数なら占有状態 3つの read の順番が守られていないとアルゴリズムが破綻 メモリバリアが必要 読み込み 書き込み Read counter Read data と読んで、1が奇数か、 1≠3なら失敗。 data を破棄してリトライ counter Counter が偶数なら CAS 命令で +1 data を書き換え Counter をさらに +1 data

x86のメモリオーダリングの復習

x86 CPU のメモリオーダリング X86 は同じ命令セットでも、メモリオーダリングは CPU によって違う・・・ RAR WAR WAW RAW i386 i486,Pentium × P6 ~ Opteron × ?A? = ? After ? × 順序の逆転が起きる

x86 CPUのメモリの順序化 副作用のある命令 フェンス専用命令 CPUID, Lock# プレフィックス パイプライン・Store buffer をいったんクリアするため、メモリの順序化の副作用がある。 重い。 フェンス専用命令 SFENCE 命令 (Pentium3以降) Store → Store を順序化 LFENCE 命令 (Pentium4以降) Load → Load を順序化 MFENCE 命令 (Pentium4以降) 全てのメモリ操作を順序化

C/C++ でメモリバリアを使うには? インラインアセンブラ volatile を付けると順序化される ABI もある ex. IA-64 ABI C++0x には入るかも! #define mb() asm volatile ("mfence“:::”memory”); #define rmb() asm volatile (“lfence”:::”memory”); #define wmb() asm volatile (“sfence”:::”memory”); Evolution working group issue list ES066. Support for parallel programming For example, locks, threading, memory barrier, static local initialization.

まとめ マルチコア時代到来 ご静聴ありがとうございました Mutex/spin lock などの替わりに (使えるときは) Lock-free synchronization を使おう Memory ordering コア数が多いほどメモリ順序の逆転は起き易い 今からメモリフェンスを入れた正しいプログラムを書こう ご静聴ありがとうございました