由SSE中的内存对齐引起的分段错误

时间:2010-12-17 07:02:41

标签: c++ sse simd

我正在进行面部检测,我将输入作为.bmp文件并检测面部并在面部绘制一个矩形。

但是当我添加一个名为“cvDetect”的函数来检测面部时我会遇到一些分段错误,在下面的代码行中 -

_mm_store_ps(&c(y, 4.0*x), _mm_sub_ps(_mm_load_ps(a.data(y, 4.0*x)), _mm_load_ps(b.data(y, 4.0*x))));

调试时我发现由于这些功能存在一些内存对齐问题。任何人都可以帮助解决这个问题,代码是用C ++编写的,我使用的是Linux。

4 个答案:

答案 0 :(得分:2)

我对这些SSE扩展并不了解,但听起来你在调整变量方面遇到了麻烦。要声明与变量声明的特定对齐,需要不可移植的扩展,由编译器改变。

对于GCC,你要声明你的变量:

// Declare a variable called 'a' of type __m128, aligned at 16 bytes.
__m128 a __attribute__((aligned (16)));

对于Microsoft Visual C ++,您可以执行以下操作:

__declspec(align(16)) __m128 a;

答案 1 :(得分:1)

现在的一个快速解决方法是使用未对齐的加载和存储,即

_mm_storeu_ps(&c(y, 4.0*x), _mm_sub_ps(_mm_loadu_ps(a.data(y, 4.0*x)), _mm_loadu_ps(b.data(y, 4.0*x))));

除非您使用Core i5 / i7,否则性能会受到影响,但至少它会正常工作。

最终,您需要确保数据始终是16字节对齐。

答案 2 :(得分:0)

_ps函数需要16字节对齐的内存操作数

答案 3 :(得分:0)

看起来a.data(r,c)是对一个名为a的对象的operator()的调用,它返回对某个内存的引用。

如果您使用的是Visual Studio(而不是),则应使用 _mm_malloc _aligned_malloc 分配此内存或 malloc )。

如果内存未动态分配,但是某个对象中的字段,则应使用asveikau的回复中指定的对齐属性声明该字段。