2007-11-26

_ What Every Programmer Should Know About Memory

Ulrich Drepperの例の論文ですが、一通り読み終わりましたよ。 システム・デベロッパならこれぐらいのことは大体おさえておいてよ、 という程度の内容なので、特に新しいことは書いてませんが、 よくまとまっているので、こういう文書が手軽に入手できるようになったのは喜ばしいことです。昔は持ち運ぶのも苦労するような馬鹿高い書籍しかありませんでしたからね。

ちょっぴり面白かったのは、HTの活用法として、 prefetch専用のthreadを使うというところ。 これまで、HTって、パフォーマンスの向上にどう役立てることができるのか、よくわかりませんでしたが、確かにこれは悪くない発想。 しかし、頑張る量が多い割に効果が少ないんだよねえ。

まあ、何というか、ハードウェアで頑張っている人たちはすげーなあと感動しますが、それでソフトウェアで何ができるかっていうと、 実は案外何もないんですね。 やってみても、運が良くて数倍、大抵は数パーセントの影響しかない、 しかもその時のコードにばりばり最適化するしかないので、 コードが進化したら一からやり直しだし。

だから、よっぽどシビアな場面でしか使えないことが多すぎるんですよね。 そりゃ、構造体のメンバーをalignしておくとか、 それぐらいは当たり前にやっておけばいいんですけどね。 でも、そんなこと今さら言われなくてもやってるでしょ?

と、少々否定的な書き方をしてしまったけれど、 あんまり知らない人は一読すべき論文だと思います。 何でかっていうと、 多分直接使えることは少ないだろうけど、 アイデアの源泉としては使えるから。 ここの主題はメインメモリとキャッシュメモリだけど、 基本的には「大きくて遅いもの」と「小さくて速いもの」で構成される場面なら、どこでも通用する概念とかテクニックが多い。 例えば、ディスクとメインメモリとか、 リモートマシンとローカルマシンとか、 インターネットとかイントラネットとか、 色んな所で同じような問題が発生する。 実際、prefetchのようなことはread aheadとか呼ばれて、昔からHDDに対して使われているし、 ブラウザの先読み機能とか、形態は違っていても、根本的には同じことをやっているわけ。

残念ながら、細分化の激しい業界なので、 他のところはさっぱり事情がわからんかったり、 用語がかけ離れていて意志の疎通がはかれなかったりするだけに、 こういうまとまった資料にたまに目を通すのは悪くないと思う。

P.S. それよりもっと驚いたのは自称オープンソースプログラマな人がUlrich Drepperの名前も知らないことであった! 相当な有名人だと思うんだがな、少なくとも開発者の間では。

[]