提示编译器可以使用对齐的memcpy

Bra*_*ram 4 c glibc memory-alignment memcpy avx

我有一个由7个__m256值组成的结构,它在内存中以32字节对齐的方式存储.

typedef struct
{
        __m256 xl,xh;
        __m256 yl,yh;
        __m256 zl,zh;
        __m256i co;
} bloxset8_t;
Run Code Online (Sandbox Code Playgroud)

我通过使用posix_memalign()动态分配数据的函数或使用(aligned(32))静态分配数据的属性来实现32字节对齐.

对齐很好,但是当我使用两个指向这样的结构的指针,并将它们作为memcpy()的目标和源传递时,编译器决定使用它__memcpy_avx_unaligned()来复制.

我如何强制clang使用对齐的avx memcpy函数,我认为这是更快的变体?

操作系统:Ubuntu 16.04.3 LTS,Clang:3.8.0-2ubuntu4.

UPDATE
仅在复制两个或多个结构时调用__memcpy_avx_unaligned().当只复制一个时,clang会发出14个vmovup指令.

Flo*_*mer 6

__memcpy_avx_unaligned只是一个内部glibc函数名称.这并不意味着有更快的__memcpy_avx_aligned功能.该名称只是向glibc开发人员传达了如何memcpy实现此变体的提示.

另一个问题是memcpy,使用四个AVX2加载/存储操作,C编译器是否会更快地发出内联扩展.它的代码将大于memcpy调用,但总体上可能更快.有可能帮助编译器使用__builtin_assume_aligned内置函数来完成此操作.