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

Hint to compiler that it can use aligned memcpy

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

typedef struct
{
        __m256 xl,xh;
        __m256 yl,yh;
        __m256 zl,zh;
        __m256i co;
} bloxset8_t;

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

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

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

OS: Ubuntu 16.04.3 LTS, Clang: 3.8.0-2ubuntu4.

更新
__memcpy_avx_unaligned() 仅在复制两个或多个结构时被调用。仅复制一个时,clang 会发出 14 条 vmovup 指令。

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

另一个问题是 C 编译器使用四个 AVX2 load/store 操作发出 memcpy 的内联扩展是否会更快。该代码将比 memcpy 调用大,但总体上可能仍然更快。使用 __builtin_assume_aligned builtin.

可以帮助编译器执行此操作