c - 提示编译器可以使用对齐的内存



我有一个由七个__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 函数,我认为这是更快的变体?

操作系统: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加载/存储操作发出memcpy的内联扩展是否会更快。 该代码将大于memcpy调用,但总体上可能仍然更快。 可以使用内置的__builtin_assume_aligned帮助编译器执行此操作。

最新更新