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

标签 c glibc memcpy memory-alignment avx

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

关于c - 提示编译器它可以使用对齐的 memcpy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47231791/

相关文章:

C++:使用 memcpy 时,myArray 和 &myArray 有什么区别?

c++ - 为什么这个 memcpy 不起作用?

objective-c - 赋值还是 memcpy?设置数组成员变量的首选方法是什么?

c - 如何为实时流媒体编码视频文件并通过 UDP 数据报传送

c - 指向数组的指针究竟是如何工作的?

c - 项目未编译,Code::Blocks 中没有警告或错误

multithreading - glibc c11线程实现是pthread的包装器吗?

c - 为什么这个输出来自 perror?

linux - 为什么设置不同时区时 localtime_r 的性能如此不同

LD_PRELOAD可以用来加载不同版本的glibc吗?