【问题标题】:kcachegrind showing my memcpy is unalignedkcachegrind 显示我的 memcpy 未对齐
【发布时间】:2015-08-23 15:07:54
【问题描述】:

使用 g++ 编译使用 memcpy 的函数,在 kcachegrind 中显示为使用 __memcpy_sse2_unaligned

memcpy 有没有办法使用对齐的版本?

更新 1:这就是我创建两个缓冲区的方式

int* dstArr = new int [0x10000];
int* srcArr = new int [0x10000];

【问题讨论】:

  • 可能通过确保您复制的缓冲区保证对齐,编译器会识别它。您现在如何创建缓冲区?您的代码中的调用是什么样的?
  • 更新添加缓冲区创建代码。
  • 在大多数系统和编译器上,底层分配器在分配内存时应该返回一个对齐地址。但是,编译器可能看起来并不那么确定,所以它会做一些安全的事情并调用为非对齐复制优化的内置函数。而且我们不知道该函数是否检查对齐并处理两个缓冲区对齐的情况。

标签: c++ sse libc


【解决方案1】:

__memcpy_sse2_unaligned 这个名字并不代表你认为的那样。事实上,它只是memcpy 的一个版本,它使用带有未对齐访问的 SSE2(在现代/大型 CPU 上,未对齐访问的惩罚通常低于软件中强制对齐的惩罚)。

您的编译器认为它不具备优化如此大的 memcpy 本身的能力,并且 amd64 ABI 不提供承诺对齐的 memcpy 符号(如 ARMEABI 中的 __aeabi_memcpy4__aeabi_memcpy8)。

【讨论】:

    猜你喜欢
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多