Memory sse指令访问冲突

Memory sse指令访问冲突,memory,sse,Memory,Sse,我是SSE教学的新手,正在努力学习它。我写了一个小程序如下,但给了我一个访问冲突错误。这可能是因为内存失调,但我很难找出它到底出了什么问题 void add_sse(uint16_t *a, uint16_t *b { __m128i *av = (__m128i*)a; //16-byte aligned (128 bits) __m128i *bv = (__m128i*)b; __m128i cv = _mm_setzero_si128(); for (int i

我是SSE教学的新手,正在努力学习它。我写了一个小程序如下,但给了我一个访问冲突错误。这可能是因为内存失调,但我很难找出它到底出了什么问题

void add_sse(uint16_t *a, uint16_t *b { 
  __m128i *av = (__m128i*)a;    //16-byte aligned (128 bits)
  __m128i *bv = (__m128i*)b;
  __m128i cv = _mm_setzero_si128();
  for (int i = 0; i < 2; i++)
  {
     cv = _mm_adds_epu16(av[i], bv[i]);
     _mm_store_si128(av + i, cv);
  }
}

int main(){
  uint16_t a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
  uint16_t b[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };

  add_sse(a, b);

  int size = sizeof(a) / sizeof(uint16_t);
  for (int i = 0; i < size; i++)
      std::cout << a[i] << std::endl;

  getchar();
  return 0;
}
编辑:感谢彼得的评论。我现在让它工作了。只要把它贴出来,确保有类似问题的人都能得到答案。这就是我得到的:

void add_sse(uint16_t *a, uint16_t *b) {
  __m256i av = _mm256_loadu_si256((__m256i*)a);
  __m256i bv = _mm256_loadu_si256((__m256i*)b);
  __m256i sum = _mm256_add_epi32(av, bv);
  _mm256_storeu_si256((__m256i*)a, sum);
}

如果不要求输入对齐,则有两个主要选项:

  • 执行标量运算直到地址对齐,然后执行对齐向量循环

  • 使用loadu和storeu内部函数。它们的主要目的是将对齐信息传递给编译器,以便它可以使用适当的加载指令(用于未对齐的加载指令,或用于未对齐的加载指令)。(对于float,在float*和
    \uuu m128
    之间进行强制转换,但int-load/store内部函数甚至不为您强制转换。)


哈,我明白了。好的,我用了第二种方法,让它工作了!非常感谢。
void add_sse(uint16_t *a, uint16_t *b) {
  __m256i av = _mm256_loadu_si256((__m256i*)a);
  __m256i bv = _mm256_loadu_si256((__m256i*)b);
  __m256i sum = _mm256_add_epi32(av, bv);
  _mm256_storeu_si256((__m256i*)a, sum);
}