我正在进行面部检测,我将输入作为.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。
答案 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的回复中指定的对齐属性声明该字段。