加载向量到 SSE 寄存器
Loading Vector into SSE register
我正在尝试将向量加载到 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)。谢谢
在使用对齐加载和存储之前,您需要确保已对齐数据结构。我不认为默认向量分配器会在 SSE2 指令所需的 16 字节边界进行对齐。
请注意,您正在将指向 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 个字节(在我的例子中是 returns 12)。
当然,对齐应该始终是 SSE 考虑的问题,尽管它可以通过一些巧妙的分配器技巧强制 std::vector
。 Here is SO question on that topic.
还要确保您的 std::vector
有足够的数据,即 4 个元素(可能更多,如果对齐正确,将被丢弃)
我正在尝试将向量加载到 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)。谢谢
在使用对齐加载和存储之前,您需要确保已对齐数据结构。我不认为默认向量分配器会在 SSE2 指令所需的 16 字节边界进行对齐。
请注意,您正在将指向 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 个字节(在我的例子中是 returns 12)。
当然,对齐应该始终是 SSE 考虑的问题,尽管它可以通过一些巧妙的分配器技巧强制 std::vector
。 Here is SO question on that topic.
还要确保您的 std::vector
有足够的数据,即 4 个元素(可能更多,如果对齐正确,将被丢弃)