情報科学における18のメタテクニック1. Kanazawa Institute of Technology
情報科学における
18のメタテクニック
2015年4月30日
金沢工業大学 情報工学科 中野 淳
http://www.nakanolab.net/
2. K.I.T.情報科学における18のメタテクニック
1. キャッシング
2. ブロッキング
vs. ノンブロッキング
3. プロファイリング
4. パイプライニング
5. 投機的実行(予測)
6. 条件の緩和
7. すぐやる vs. 先延ばし
8. フィルタリング
9. 再利用
10. 並列化
11. 結合 vs. 分離
12. 多階層、クラスター化
13. 先読み、先取り
14. 動的(適応)
15. 複製
16. 仮想化
17. チェックポイント、
スナップショット
18. トランザクション
長いこと情報科学に関わってきて、似たような技法が分野をまたがって繰り返し現
れているのを見てきました。ここではそれらの技法を「メタテクニック」と称して
紹介します。全部で18個ありますが順番に意味はありません。また、取り上げた
例は若干コンピューターアーキテクチャーに偏っていることをお断りしておきます。
2情報科学における18のメタテクニック
3. K.I.T.
#1 Caching
#2 Blocking vs. Non-blocking
#3 Profiling
#4 Pipelining
#5 Speculation
#6 Relaxation
#7 Eager vs. Lazy
#8 Filtering
#9 Reuse
#10 Parallelization
#11 Coupling vs. Decoupling
#12 Hierarchy, Clustering
#13 Lookahead, Prefetch
#14 Dynamic Adaptation
#15 Replication
#16 Virtualization
#17 Checkpoints, Snapshots
#18 Transaction
3情報科学における18のメタテクニック
4. K.I.T.#1 キャッシング(Caching)
着想
空間的ローカリティーの利用
時間的ローカリティーの利用
80:20 の法則
例
データキャッシュ
命令キャッシュ: 静的、動的(Pentium 4 のトレースキャッシュ)
ファイルシステムや DBMS のバッファーキャッシュ
Web ブラウザーのキャッシュ
プロキシーサーバー
メモ化(Memoization)
LZW 圧縮アルゴリズム(高頻度のデータ並びを辞書に登録)
4情報科学における18のメタテクニック
5. K.I.T.#2 ブロッキング vs. ノンブロッキング
着想
何かを待っている時間を有効活用する
例
マルチタスク(OS のスケジューラー)
マルチスレッド
非同期 I/O
MPI(Message Passing Interface)における非同期通信(通信と
計算のオーバーラップ)
プロセッサーにおける命令の out-of-order 実行
キャッシュミス時であっても、別のキャッシュラインの読み込みを
許可する(MSHR: Miss Status Holding Register)
5情報科学における18のメタテクニック
6. K.I.T.#3 プロファイリング
着想
実行時の情報を有効活用して、実行の最適化
例
プログラムの高速化にあたっては、一番時間をくっている部分
(ホットスポット)からとりかかる(gprof などを利用)
コンパイラの研究に多くの例がみられる(コードのレイアウトの
最適化を行う Spike など)
6情報科学における18のメタテクニック
7. K.I.T.#4 パイプライニング
着想
より高いスループット
例
プロセッサーのパイプライン(フェッチ、デコード、実行、メモリ
アクセス、レジスタへのライトバック)
A
B
C
D
A
B
C
D
タスク
時間 時間
洗濯
乾燥
折畳み
逐次的洗濯 パイプライン化された洗濯
出典: http://www.cs.berkeley.edu/~pattrsn/252S01/
7情報科学における18のメタテクニック
8. K.I.T.#5 投機的実行(予測)
着想
自分はラッキーだと信じて
山を張ってみる
例
分岐予測
データのプリフェッチ
関数の返り値の予測
メインスレッドのキャッシュミスによる遅延を隠蔽するための
投機的ヘルパースレッド
8情報科学における18のメタテクニック
9. K.I.T.#6 条件の緩和(Relaxation)
着想
制約条件を除いてみたらどうなるかを考える
例
マルチプロセッサーシステムの relaxed memory consistency
» Sequential consistency はプログラマーにとっては都合がよいが、
アーキテクチャー上の最適化を阻む
» そこでプログラマーの利便性を多少犠牲にして性能向上をはかった
(Write Buffer など)
分散ハッシュテーブルの eventual consistency
9情報科学における18のメタテクニック
10. K.I.T.
#1 Caching
#2 Blocking vs. Non-blocking
#3 Profiling
#4 Pipelining
#5 Speculation
#6 Relaxation
#7 Eager vs. Lazy
#8 Filtering
#9 Reuse
#10 Parallelization
#11 Coupling vs. Decoupling
#12 Hierarchy, Clustering
#13 Lookahead, Prefetch
#14 Dynamic Adaptation
#15 Replication
#16 Virtualization
#17 Checkpoints, Snapshots
#18 Transaction
10情報科学における18のメタテクニック
11. K.I.T.#7 すぐやる vs. 先延ばし(Eager vs. Lazy)
着想
すぐやる
» 後で必ず必要になるとわかっているときや、
» 今すぐやっても安全でコストも安いとき
先延ばしする
» 上記が当てはまらないときは、本当に必要になるまでやらない
例
要求ページング(先延ばし)
Copy on write(先延ばし)
フィボナッチヒープ等、償却計算量の低減を目指したデータ構造
(先延ばし)
Java の Just-in-time コンパイラ(両方ありうる)
MPI (Message Passing Interface) のプロトコル (udp的 vs. tcp的)
» Eager: 受け手の準備状況によらずデータを送りつける(小さい msg)
» Rendezvous: ちゃんとネゴシエーションしてからデータを送る(大きい
msg)
11情報科学における18のメタテクニック
12. K.I.T.#8 フィルタリング
着想
より深く潜っていく必要があるかないかを素早く判断
例
キャッシュ階層
» L1 キャッシュ → L2 キャッシュ → メインメモリー
Bloom filter
12情報科学における18のメタテクニック
13. K.I.T.#9 再利用(Reuse)
着想
同じことの繰り返しを避ける
» もし f(x) の計算コストが高くて、しかも頻繁に必要になるならば、一度
だけ計算して結果を覚えておく(時間とスペースのトレードオフ)
例
メモ化(Memoization)
Dynamic Instruction Reuse (Sodani and Sohi, ISCA 1997)
13情報科学における18のメタテクニック
14. K.I.T.#10 並列化
着想
2倍の計算資源を使って、時間を半分に短縮
» 現実には Amdahl の法則に留意
例
SMP
マルチコア
クラスター
MapReduce
14情報科学における18のメタテクニック
15. #11 結合 vs. 分離(Coupling vs. Decoupling)
着想
分離することによって相互依存性を下げ、
個々の部品の自由度をアップ
例
キャッシュ
» L1 キャッシュ: データキャッシュと命令キャッシュに分離
» L2 キャッシュ: 通常データと命令の両方を格納
ソフトウェア工学ではしばしば分離が好まれる
» インターフェースと実装の分離(オブジェクト指向)
» ポリシーとメカニズムの分離(コンピューターネットワーク)
» SDN (Software Defined Networking) における control plane と
data plane
» TCP/IP の階層構造(物理層、データリンク層、ネットワーク層、
トランスポート層、アプリケーション層)
» データベースにおけるリレーションの正規化
15情報科学における18のメタテクニック
17. K.I.T.
#1 Caching
#2 Blocking vs. Non-blocking
#3 Profiling
#4 Pipelining
#5 Speculation
#6 Relaxation
#7 Eager vs. Lazy
#8 Filtering
#9 Reuse
#10 Parallelization
#11 Coupling vs. Decoupling
#12 Hierarchy, Clustering
#13 Lookahead, Prefetch
#14 Dynamic Adaptation
#15 Replication
#16 Virtualization
#17 Checkpoints, Snapshots
#18 Transaction
17情報科学における18のメタテクニック
19. K.I.T.#14 動的(適応)
着想
実行中にも実行時情報を利用(⇔ プロファイリング)
例
Java の Just-in-time コンパイラ
LLVM の動的最適化
Web サーバー群のロードバランサー(Load Balancer)
19情報科学における18のメタテクニック
20. K.I.T.#15 複製(Replication)
着想
より良いローカリティと信頼性
例
ディスクのミラー化
分散データベースにおけるレプリケーション
分散ハッシュテーブルにおけるレプリカ
CDN (Content Delivery Network): Akamai 社など
GFS (Google File System)
20情報科学における18のメタテクニック
21. K.I.T.#16 仮想化(Virtualization)
着想
物理的制限を超える
リダイレクト
例
仮想メモリー
仮想デバイス
仮想マシン
仮想ファイルシステム
データベースのビュー (View)
Windows のショートカットや UNIX のシンボリックリンク
仮想的幻想
物理的実体
21情報科学における18のメタテクニック
23. K.I.T.#18 トランザクション(Transaction)
着想
複数の操作を不可分のものとして扱う
例
データベース
トランザクショナルメモリー
» 性能と正確さのトレードオフ
• ロックを駆使して正確で速いプログラムを書くことは可能では
あるが、熟練を要する
• トランザクショナルメモリーを使えば、多少のオーバーヘッドは
あるものの、安全なプログラムが書きやすくなる
23情報科学における18のメタテクニック
24. K.I.T.まとめ
1. キャッシング
2. ブロッキング
vs. ノンブロッキング
3. プロファイリング
4. パイプライニング
5. 投機的実行(予測)
6. 条件の緩和
7. すぐやる vs. 先延ばし
8. フィルタリング
9. 再利用
10. 並列化
11. 結合 vs. 分離
12. 多階層、クラスター化
13. 先読み、先取り
14. 動的(適応)
15. 複製
16. 仮想化
17. チェックポイント、
スナップショット
18. トランザクション
18のメタテクニックを列挙してきましたが、実際に自分の問題に適用する上では、
エンジニアリングでは何事にもトレードオフがつきものであることと、
"Devil is in the details."
であることを忘れずに! ここに書いたことは特効薬ではなく、あくまでも
"Food for Thought" くらいに思ってください。
24情報科学における18のメタテクニック