提示编译器它可以使用对齐的 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.
可以帮助编译器执行此操作
我有一个由七个 __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.