Linux Kernel Conference というのがあって、それに参加した。
富士通の山村さんの「タスク構造体のカラーリングによるプロセススケジューラの高速化」は、プロセススケジューラ内部で多発するキャッシュミスをハードウェアバスモニタによって発見し、それを解決する方法を示し、定量的に評価した研究だ。
キャッシュミスを多発するtask_struct構造体に注目して、それをカラーリングすることによって、キャッシュミスを劇的に減少させている。V2.5で導入されたO(1)スケジューラではrunqueueを操作するというコストのかかる(キャッシュミスを多発する)操作がなくなったので、スケジューリング上での著しい効果はない。そのためにメインkernelにはとりこまれる予定はないそうだ。
今回の注目点は、富士通秘蔵のハードウェアバスモニタを公開したことだと思う。FPGAで実装されたカード(?)なのだけれど、勝手に想像していたものと違っていて、興味深かった。誰か写真とかとっていないか?
Intel Xeon Hardware Performance Monitoring機能の使い方
上記のメモを書いていて気がついたのだが、
Event Selection Control Register (ESCR) ;page 15-27 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 x|event sel | event mask | tag | | | |xxx 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! ! ! tag enable-+ ! ! OS-+ ! USR--+
ここで、ビット0とビット1が未定義になっている。Pentium 4と Intel Xeon の昔のプロセッサはそれでいいのだけど、最近のHyperThreading が enable のマシンは、実は下記のようになっているのだ。
Event Selection Control Register (ESCR) ;page 15-52 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 x|event sel | event mask | tag | | | | | | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! ! ! ! ! tag enable-+ ! ! ! ! T0_OS-+ ! ! ! T0_USR--+ ! ! T1_OS-----+ ! T1_USR------+
なんと下2ビットが拡張されていた。通常、プロセスはどちらの論理プロセッサで実行されるかわからないので、例えば、ユーザーモードの測定をする時は、 T0_USR/T1_USR どちらも1をたてておかないといけない。
なんどか実行した時、イベントカウンタが0の場合があって、なんでかなあと思っていて、Hyper Threadingの拡張だったんですねえ。Vol3の15.10にその記述があるのだけれど、古いマニュアルには書いてなかったのだ。
CCCRに関してもHyper Threadingで拡張されてますね。
CVSなどの設定。
とりあえづ、何かをしるしておく。
gladeでGUIをちゃかちゃかと作る
そもそもメモリプロファイリングツールとは何なのか?なぜ、そのようなものを作ろうと考えたのか?なぜ、あなたはそれを使わなければならないのか?とかいうようなことを記していく(かもしれない)。