我有一个由七个__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
帮助编译器执行此操作。