将Vector加载到SSE寄存器中

时间:2016-10-01 02:27:41

标签: c++ vector x86 vectorization sse

我正在尝试将一个向量加载到SSE寄存器中,我的代码编译没有错误,但是当我尝试运行它时,我遇到了分段错误。这是我的代码:

inline int SSEJaccard::calcSSEJaccardDist(unsigned int id1, unsigned int id2) {
  int result;
  __m128i v, v1;
  std::vector<uint32_t> &fv1 = fvs[id1];
  std::vector<uint32_t> &fv2 = fvs[id2];
  v = _mm_load_si128((__m128i const*) (&fv1));
  v1 = _mm_load_si128((__m128i const*) (&fv2));
  v = _mm_and_si128(v,v1);
  result =_mm_extract_epi16(v, 0) + _mm_extract_epi16(v, 4);
 return result;
}

fsv是一个全局变量,定义如下:

std::vector<std::vector<uint32_t> > fvs;

我正在使用英特尔编译器(ICC)。谢谢

2 个答案:

答案 0 :(得分:7)

请注意,您正在将指向std::vector的指针传递给内在函数。

相反,你应该传递一个指向所述向量包含的数据的指针,例如

v = _mm_load_si128((__m128i const*) (&(fv1[0])));

v1 = _mm_load_si128((__m128i const*) (fv2.data());

std::vector对象本身只保存一个指针和分配的/当前大小信息,而这不是SSE内在函数所期望的。这也解释了段错误,因为sizeof(std::vector)可能小于16个字节(在我的情况下它返回12个)。

当然,对齐应始终是SSE的考虑事项,尽管可以通过一些聪明的分配器技巧强制std::vectorHere is SO question on that topic

同时确保你的std::vector有足够的数据,即4个元素(可能更多,如果正确对齐将被丢弃)

答案 1 :(得分:2)

在使用对齐的加载和存储之前,您需要确保已对齐数据结构。我不认为默认的向量分配器在SSE2指令所需的16字节边界处进行对齐。