研究日誌。

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

アライメント。

2008-03-06 16:29:03 | Weblog
今さらなのだが、アライメントの揃っているデータを用いるように改良してみた。malloc では、8バイトにアライメントされたメモリアドレスを返すが、他のサイズアライメントは次のように posix_memalign() を用いることで、簡単にアライメントの揃った領域を動的に確保する事が出来る。


#define _XOPEN_SOURCE 600
#include <stdlib.h>

static inline void *aligned_malloc (int size, int align) {
 void *p;
 if (posix_memalign((void**)&p, align, size)) exit(1);
 return p;
}


align の部分をいろいろ変えて実験してみたがあまり変化が現れない。posix_memalign() を用いたのがまずかったのか。まずは初期化部分くらいは SIMD 化したい。

最新の画像もっと見る

2 コメント

コメント日が  古い順  |   新しい順
Unknown (後藤)
2008-03-12 03:22:52
性能が変化しないということは ...
1.アライメントは関係ない
2.関係はあるが、8 バイトでは小さい。64 バイトや 4096 では?
3.確保するサイズが大きい。この場合にはページフォルトが問題になるので、以下の環境変数を設定してみるとよい。
MALLOC_TRIM_THRESHOLD_=-1
MALLOC_MMAP_MAX_=0
4.確保するサイズが小さい。この場合には alloca を使うのも一つの手。もしくは、自分で malloc の代替関数を書く。GNU の malloc はロックが入るので、どうしても遅くなる。

とまぁ、こんな感じかと。
返信する
Unknown (u1low_cheap)
2008-03-12 12:21:18
貴重な情報ありがとうございます。さっそく実験したいと思います。確保するサイズは数千万要素程で、かなり大きいものなので、3にあたるかもしれません。
返信する

コメントを投稿