use*_*068 1 c++ x86 sse vector vectorization
我正在尝试将一个向量加载到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;
}
Run Code Online (Sandbox Code Playgroud)
fsv是一个全局变量,定义如下:
std::vector<std::vector<uint32_t> > fvs;
Run Code Online (Sandbox Code Playgroud)
我正在使用英特尔编译器(ICC).谢谢
请注意,您正在将指针传递给std::vector内在函数.
相反,你应该传递指向所述向量包含的数据的指针,例如
v = _mm_load_si128((__m128i const*) (&(fv1[0])));
Run Code Online (Sandbox Code Playgroud)
要么
v1 = _mm_load_si128((__m128i const*) (fv2.data());
Run Code Online (Sandbox Code Playgroud)
std::vector对象本身只保存一个指针和已分配/当前大小的信息,而这并不是SSE内在函数所期望的.这也解释了段错误,因为它sizeof(std::vector)可能少于16个字节(在我的情况下,它返回12).
当然,对齐应始终是SSE的考虑因素,尽管可以通过std::vector一些聪明的分配器技巧强制进行.这是关于该主题的问题.
还要确保你的std::vectors有足够的数据,即4个元素(如果正确对齐,可能会被丢弃)
| 归档时间: |
|
| 查看次数: |
688 次 |
| 最近记录: |