研究日誌。

大規模なグラフ処理に対してメモリ階層構造を考慮した高性能なソフトウェアを開発。

libhugetlbfs。

2008-03-24 14:28:49 | Weblog
TLB (Translation Look-aside Buffer) は、仮想メモリ空間のアドレスを物理メモリのアドレスに変換するための情報を格納/管理するキャッシュである。このサイズはデフォルトで 4096 Byte であるので、それ以上大きなサイズのデータにアクセスする際には、TLB ミスが発生してしまう可能性がある。HugeTLB を用いることで、より大きなサイズに変更することができる。

用いている CPU は Core2(SMP) なので HugePages のページサイズは、2048 kB となってる。この値は CPU、OS によって異なり、可変なものもあるようだ。

具体的な作業としては、su になってから、以下のようにすればよい。
まずは作業用ディレクトリを用意する
# mkdir /huge

type device directory、読み書き可能なモード、パーミッションマスクを以下のように指定し、mount する。
# mount -t hugetlbfs hugetlbfs /huge -o rw,mode=0777

エントリ数を設定するには以下のようにすればよい。
# echo 512 > /proc/sys/vm/nr_hugepages

以下のように、そのページサイズを確認することができる。
$ grep Huge /proc/meminfo
HugePages_Total: 512
HugePages_Free: 512
HugePages_Rsvd: 0
Hugepagesize: 2048 kB


実行する際に、環境変数を設定することで malloc を HugeTLB にのせることができる。
$ HUGETLB_MORECORE=yes LD_PRELOAD=libhugetlbfs.so ./a.out


当然ながら Hugepagesize x HugePages_Total (今回は 2048 kB x 512 = 1GB)分だけメモリが確保されてしまうので、必要な分のみ確保する方がよいだろう。