今さらなのだが、アライメントの揃っているデータを用いるように改良してみた。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 化したい。
#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 化したい。
1.アライメントは関係ない
2.関係はあるが、8 バイトでは小さい。64 バイトや 4096 では?
3.確保するサイズが大きい。この場合にはページフォルトが問題になるので、以下の環境変数を設定してみるとよい。
MALLOC_TRIM_THRESHOLD_=-1
MALLOC_MMAP_MAX_=0
4.確保するサイズが小さい。この場合には alloca を使うのも一つの手。もしくは、自分で malloc の代替関数を書く。GNU の malloc はロックが入るので、どうしても遅くなる。
とまぁ、こんな感じかと。