0

我正在研究面部检测,其中我将输入作为 .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

4 回答 4

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;
于 2010-12-17T07:20:41.243 回答
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 字节对齐的。

于 2010-12-17T14:49:32.467 回答
0

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

如果您使用的是 Visual Studio(而不是newmalloc) ,则应该使用_mm_malloc_aligned_malloc分配此内存。

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

于 2011-12-16T15:42:06.783 回答
0

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

于 2010-12-17T07:05:41.733 回答