提示编译器可以使用对齐的memcpy
我有一个由7个__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。
UPDATE
仅在复制两个或多个结构时才会调用__memcpy_avx_unaligned()。 当只复制一个时,clang会发出14个vmovup指令。
__memcpy_avx_unaligned
只是一个内部glibc函数名。 这并不意味着有一个更快的__memcpy_avx_aligned
函数。 这个名称只是向glibc开发人员传达了如何实现这个memcpy
变体的提示。
另一个问题是,使用四个AVX2加载/存储操作,C编译器是否会更快地发出memcpy
的内联扩展。 它的代码将大于memcpy
调用,但它总体上可能更快。 有可能使用__builtin_assume_aligned
内置来帮助编译器执行此操作。