研究日誌。

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

アライメントは関係ない?その1。

2008-03-13 09:53:09 | Weblog
まずは、
 export MALLOC_TRIM_THRESHOLD_=-1
 export MALLOC_MMAP_MAX_=0
を設定しない状態で。


画像についての説明だが、
・heap1 というのは、通常の heap を用いた実装。
・heap2 は、ポテンシャルの更新と、heap の操作を分離した仕様。
・bucket は、Dial の実装になっている。

・前回と同じクエリファイルを用いている。

・実験環境は
CPU : Intel(R) Xeon(R) CPU E5345 @ 2.33GHz
OS : CentOS 5.1 64bit
compiler : gcc 4.1.2

8 byte ~ 8192 byte まで、アラインメントを変えて実験しているが、大雑把に見るとほとんど変化が見られない。


・heap1 に関して
アライメントはあまり関係ないようで、デフォルト(8 byte)が一番良い結果になった。むしろ関係あるのかともいえるかもしれない。


・heap2 に関して
heap1 に比べこちらの方が若干ではあるが、高速化されている。1024 と 8192 以外はおおむね改善されていると思ってよいだろう。


・bucket に関して
こちらは連続的なアクセスが多いので、アライメントの効果が得られやすいと思っていたが、64byte、128byte、256byte 以外では効果が小さいながら良くなっていた。


ページフォルト?

2008-03-13 09:09:14 | Weblog
後藤さんにアドバイスを頂いたので、紹介します。

「確保するサイズが大きい場合は、ページフォルトが問題になるので、

export MALLOC_TRIM_THRESHOLD_=-1
export MALLOC_MMAP_MAX_=0

と環境変数を設定すると良い。」


・MALLOC_TRIM_THRESHOLD_
は OS に未使用になったメモリを返却する契機をあらわしていて、-1 では決して返却しないことを表している。

・MALLOC_MMAP_MAX_
は最大 mmap 数をあらわし、0は決して mmap しない。1MB 以上のメモリ確保では、malloc は内部で mmap を呼び出しているようだが、どんなに大きなメモリでも brk を使ってメモリを取る。


こちらのブログを参考させていただきもらいました。