【问题标题】:Dynamic allocated memory not aligned in SSE [duplicate]动态分配的内存在 SSE 中未对齐 [重复]
【发布时间】:2015-03-11 13:24:00
【问题描述】:

这是正常工作的代码:

char a[100];
for (int i = 0; i < 100; i++)
     a[i] = 0;
__m128i x = _mm_load_si128((__m128i *) a);

但是如果我动态分配内存,VS 2013 会中断:

char *a = new char[100];
for (int i = 0; i < 100; i++)
     a[i] = 0;
__m128i x = _mm_load_si128((__m128i *) a);

如何同时使用动态内存和对齐加载指令?

【问题讨论】:

  • 我想我完全误解了这个问题。是否有错误消息或内存实际上没有按要求对齐?
  • 第二个中断,如果我使用对齐的加载指令。
  • 我检查了您的代码,它在我的控制台应用程序上运行良好。没有错误。
  • 没有语法错误。但还是打断了。

标签: c++ sse simd avx


【解决方案1】:

因为 sizeof 正在返回一个 char 指针的大小:4 个字节。

【讨论】:

    【解决方案2】:

    您可以操作new 运算符以返回对齐的内存(这可能不是最好的维护方式),或者您可以分配更多的内存并仅对对齐的部分进行操作。例如,如果您需要对 8 字节偶数地址进行对齐,请再分配 8 个字节并按如下方式处理对齐的指针。

    char* a;
    uintptr_t unaligned = (uintptr_t)a;
    uintptr_t aligned = ( unaligned % 8 ) ? unaligned : ( unaligned % 8 ) + 8;
    char* a_aligned = (char*)aligned;
    

    uintptr_t 类型在 stdint.h 中定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多