私はメモリに32バイト整列して格納された7つの__m256値からなる構造体を持っています。整列されたmemcpyを使用できるコンパイラへのヒント
typedef struct
{
__m256 xl,xh;
__m256 yl,yh;
__m256 zl,zh;
__m256i co;
} bloxset8_t;
Iは、動的に割り当てられたデータのためposix_memalign()
関数を使用して、または静的に割り当てられたデータのため(aligned(32))
属性を使用して32バイトのアラインメントを達成します。
アライメントは問題ありませんが、このような構造体に2つのポインタを使用し、それらをmemcpy()の送り先とソースとして渡すと、コンパイラは__memcpy_avx_unaligned()
を使用してコピーを決定します。
代わりに、より高速なバリアントであると思われる、代わりにアラインされたavx memcpy関数を強制的に使用することはできますか?
OS:Ubuntu 16.04.3 LTS、Clang:3.8.0-2ubuntu4。
UPDATE
__memcpy_avx_unaligned()は、2つの以上の構造体をコピーする場合にのみ呼び出されます。ちょうど1つをコピーするとき、clangは14のvmovup命令を出します。
未テストですが、試してみる価値があります。以前は、アドレスが32バイトにアライメントされていることを主張する 'memcpy'の前に' assert() 'を追加していました。コンパイラの中には、これらのヒントを利用して最適化に使用するものがあります。 –
Clang 3.9でこれを再現できませんでした。残念ながら私は試してみることができません。3.8 – harold
@harold memcpy_avx_unaligned()は、2つ以上の構造体を一度にコピーする場合に使用されます。 1つの構造体は実際には私の場合は整列していない移動命令で処理されます:vmovup(そしてそのうち14個が使用されます) – Bram